Class: Mongo::Server::ConnectionPool
- Inherits:
-
Object
- Object
- Mongo::Server::ConnectionPool
- Extended by:
- Forwardable
- Includes:
- Loggable, Monitoring::Publishable
- Defined in:
- build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb,
build/ruby-driver-v2.19/lib/mongo/server/connection_pool/populator.rb,
build/ruby-driver-v2.19/lib/mongo/server/connection_pool/generation_manager.rb
Overview
Represents a connection pool for server connections.
Defined Under Namespace
Classes: GenerationManager, Populator
Constant Summary collapse
- DEFAULT_MAX_SIZE =
The default max size for the connection pool.
20.freeze
- DEFAULT_MIN_SIZE =
The default min size for the connection pool.
0.freeze
- DEFAULT_WAIT_TIMEOUT =
The default timeout, in seconds, to wait for a connection.
This timeout applies while in flow threads are waiting for background threads to establish connections (and hence they must connect, handshake and auth in the allotted time).
It is currently set to 10 seconds. The default connect timeout is 10 seconds by itself, but setting large timeouts can get applications in trouble if their requests get timed out by the reverse proxy, thus anything over 15 seconds is potentially dangerous.
10.freeze
Constants included from Loggable
Instance Attribute Summary collapse
-
#generation_manager ⇒ Integer
readonly
private
Generation Generation of connections currently being used by the queue.
- #max_connecting ⇒ Object readonly private
-
#options ⇒ Hash
readonly
Options The pool options.
-
#populate_semaphore ⇒ Object
readonly
Condition variable broadcast when the size of the pool changes to wake up the populator.
- #populator ⇒ Object readonly private
- #server ⇒ Object readonly private
Attributes included from Monitoring::Publishable
Class Method Summary collapse
-
.finalize(available_connections, pending_connections, populator) ⇒ Proc
Finalize the connection pool for garbage collection.
Instance Method Summary collapse
-
#available_count ⇒ Integer
Number of available connections in the pool.
-
#check_in(connection) ⇒ Object
Check a connection back into the pool.
-
#check_out(connection_global_id: nil) ⇒ Mongo::Server::Connection
Checks a connection out of the pool.
-
#clear(options = nil) ⇒ true
Closes all idle connections in the pool and schedules currently checked out connections to be closed when they are checked back into the pool.
-
#close(options = nil) ⇒ true
Marks the pool closed, closes all idle connections in the pool and schedules currently checked out connections to be closed when they are checked back into the pool.
-
#close_idle_sockets ⇒ Object
Close sockets that have been open for longer than the max idle time, if the option is set.
-
#closed? ⇒ true | false
Whether the pool has been closed.
-
#disconnect!(options = nil) ⇒ Object
private
Disconnects the pool.
-
#do_check_in(connection) ⇒ Object
Executes the check in after having already acquired the lock.
- #do_clear(options = nil) ⇒ Object
-
#do_pause ⇒ Object
private
Mark the connection pool as paused without acquiring the lock.
-
#initialize(server, options = {}) ⇒ ConnectionPool
constructor
Create the new connection pool.
-
#inspect ⇒ String
Get a pretty printed string inspection for the pool.
-
#max_idle_time ⇒ Float | nil
The maximum seconds a socket can remain idle since it has been checked in to the pool, if set.
-
#max_size ⇒ Integer
Get the maximum size of the connection pool.
-
#min_size ⇒ Integer
Get the minimum size of the connection pool.
-
#pause ⇒ Object
Mark the connection pool as paused.
-
#paused? ⇒ true | false
A connection pool is paused if it is not closed and it is not ready.
-
#populate ⇒ true | false
private
This method does three things: 1.
-
#ready ⇒ Object
Instructs the pool to create and return connections.
-
#ready? ⇒ true | false
Whether the pool is ready.
-
#size ⇒ Integer
Size of the connection pool.
-
#stop_populator ⇒ Object
private
Stop the background populator thread and clean up any connections created which have not been connected yet.
- #summary ⇒ Object
-
#unavailable_connections ⇒ Integer
private
The number of unavailable connections in the pool.
-
#wait_timeout ⇒ Float
The time to wait, in seconds, for a connection to become available.
-
#with_connection(connection_global_id: nil) ⇒ Object
Yield the block to a connection, while handling check in/check out logic.
Methods included from Monitoring::Publishable
#publish_cmap_event, #publish_event, #publish_sdam_event
Methods included from Loggable
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
Constructor Details
#initialize(server, options = {}) ⇒ ConnectionPool
Create the new connection pool.
Note: Additionally, options for connections created by this pool should
be included in the options passed here, and they will be forwarded to
any connections created by the pool.
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 92 def initialize(server, = {}) unless server.is_a?(Server) raise ArgumentError, 'First argument must be a Server instance' end = .dup if [:min_size] && [:min_pool_size] && [:min_size] != [:min_pool_size] raise ArgumentError, "Min size #{[:min_size]} is not identical to min pool size #{[:min_pool_size]}" end if [:max_size] && [:max_pool_size] && [:max_size] != [:max_pool_size] raise ArgumentError, "Max size #{[:max_size]} is not identical to max pool size #{[:max_pool_size]}" end if [:wait_timeout] && [:wait_queue_timeout] && [:wait_timeout] != [:wait_queue_timeout] raise ArgumentError, "Wait timeout #{[:wait_timeout]} is not identical to wait queue timeout #{[:wait_queue_timeout]}" end [:min_size] ||= [:min_pool_size] .delete(:min_pool_size) [:max_size] ||= [:max_pool_size] .delete(:max_pool_size) if [:min_size] && [:max_size] && ([:max_size] != 0 && [:min_size] > [:max_size]) then raise ArgumentError, "Cannot have min size #{[:min_size]} exceed max size #{[:max_size]}" end if [:wait_queue_timeout] [:wait_timeout] ||= [:wait_queue_timeout] end .delete(:wait_queue_timeout) @server = server @options = .freeze @generation_manager = GenerationManager.new(server: server) @ready = false @closed = false # A connection owned by this pool should be either in the # available connections array (which is used as a stack) # or in the checked out connections set. @available_connections = available_connections = [] @checked_out_connections = Set.new @pending_connections = Set.new @interrupt_connections = [] # Mutex used for synchronizing access to @available_connections and # @checked_out_connections. The pool object is thread-safe, thus # all methods that retrieve or modify instance variables generally # must do so under this lock. @lock = Mutex.new # Background thread reponsible for maintaining the size of # the pool to at least min_size @populator = Populator.new(self, ) @populate_semaphore = Semaphore.new # Condition variable to enforce the first check in check_out: max_pool_size. # This condition variable should be signaled when the number of # unavailable connections decreases (pending + pending_connections + # available_connections). @size_cv = Mongo::ConditionVariable.new(@lock) # This represents the number of threads that have made it past the size_cv # gate but have not acquired a connection to add to the pending_connections # set. @connection_requests = 0 # Condition variable to enforce the second check in check_out: max_connecting. # Thei condition variable should be signaled when the number of pending # connections decreases. @max_connecting_cv = Mongo::ConditionVariable.new(@lock) @max_connecting = .fetch(:max_connecting, 2) ObjectSpace.define_finalizer(self, self.class.finalize(@available_connections, @pending_connections, @populator)) publish_cmap_event( Monitoring::Event::Cmap::PoolCreated.new(@server.address, , self) ) end |
Instance Attribute Details
#generation_manager ⇒ Integer (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns generation Generation of connections currently being used by the queue.
216 217 218 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 216 def generation_manager @generation_manager end |
#max_connecting ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
325 326 327 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 325 def max_connecting @max_connecting end |
#options ⇒ Hash (readonly)
Returns options The pool options.
170 171 172 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 170 def @options end |
#populate_semaphore ⇒ Object (readonly)
Condition variable broadcast when the size of the pool changes to wake up the populator
55 56 57 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 55 def populate_semaphore @populate_semaphore end |
#populator ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
322 323 324 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 322 def populator @populator end |
#server ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
173 174 175 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 173 def server @server end |
Class Method Details
.finalize(available_connections, pending_connections, populator) ⇒ Proc
Finalize the connection pool for garbage collection.
787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 787 def self.finalize(available_connections, pending_connections, populator) proc do available_connections.each do |connection| connection.disconnect!(reason: :pool_closed) end available_connections.clear pending_connections.each do |connection| connection.disconnect!(reason: :pool_closed) end pending_connections.clear # Finalizer does not close checked out connections. # Those would have to be garbage collected on their own # and that should close them. end end |
Instance Method Details
#available_count ⇒ Integer
Number of available connections in the pool.
274 275 276 277 278 279 280 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 274 def available_count raise_if_closed! @lock.synchronize do @available_connections.length end end |
#check_in(connection) ⇒ Object
Check a connection back into the pool.
The connection must have been previously created by this pool.
379 380 381 382 383 384 385 386 387 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 379 def check_in(connection) check_invariants @lock.synchronize do do_check_in(connection) end ensure check_invariants end |
#check_out(connection_global_id: nil) ⇒ Mongo::Server::Connection
Checks a connection out of the pool.
If there are active connections in the pool, the most recently used connection is returned. Otherwise if the connection pool size is less than the max size, creates a new connection and returns it. Otherwise waits up to the wait timeout and raises Timeout::Error if there are still no active connections and the pool is at max size.
The returned connection counts toward the pool’s max size. When the caller is finished using the connection, the connection should be checked back in via the check_in method.
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 345 def check_out(connection_global_id: nil) check_invariants publish_cmap_event( Monitoring::Event::Cmap::ConnectionCheckOutStarted.new(@server.address) ) raise_if_pool_closed! raise_if_pool_paused_locked! connection = retrieve_and_connect_connection(connection_global_id) publish_cmap_event( Monitoring::Event::Cmap::ConnectionCheckedOut.new(@server.address, connection.id, self), ) if Lint.enabled? unless connection.connected? raise Error::LintError, "Connection pool for #{address} checked out a disconnected connection #{connection.generation}:#{connection.id}" end end connection ensure check_invariants end |
#clear(options = nil) ⇒ true
Closes all idle connections in the pool and schedules currently checked out connections to be closed when they are checked back into the pool. The pool is paused, it will not create new connections in background and it will fail checkout requests until marked ready.
497 498 499 500 501 502 503 504 505 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 497 def clear( = nil) raise_if_closed! if Lint.enabled? && !@server.unknown? raise Error::LintError, "Attempting to clear pool for server #{@server.summary} which is known" end do_clear() end |
#close(options = nil) ⇒ true
Marks the pool closed, closes all idle connections in the pool and schedules currently checked out connections to be closed when they are checked back into the pool. If force option is true, checked out connections are also closed. Attempts to use the pool after it is closed will raise Error::PoolClosedError.
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 621 def close( = nil) return if closed? ||= {} stop_populator @lock.synchronize do until @available_connections.empty? connection = @available_connections.pop connection.disconnect!(reason: :pool_closed) end if [:force] until @checked_out_connections.empty? connection = @checked_out_connections.take(1).first connection.disconnect!(reason: :pool_closed) @checked_out_connections.delete(connection) end end unless && [:stay_ready] # mark pool as closed before releasing lock so # no connections can be created, checked in, or checked out @closed = true @ready = false end @max_connecting_cv.broadcast @size_cv.broadcast end publish_cmap_event( Monitoring::Event::Cmap::PoolClosed.new(@server.address, self) ) true end |
#close_idle_sockets ⇒ Object
Close sockets that have been open for longer than the max idle time,
if the option is set.
708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 708 def close_idle_sockets return if closed? return unless max_idle_time @lock.synchronize do i = 0 while i < @available_connections.length connection = @available_connections[i] if last_checkin = connection.last_checkin if (Time.now - last_checkin) > max_idle_time connection.disconnect!(reason: :idle) @available_connections.delete_at(i) @populate_semaphore.signal next end end i += 1 end end end |
#closed? ⇒ true | false
Whether the pool has been closed.
287 288 289 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 287 def closed? !!@closed end |
#disconnect!(options = nil) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Disconnects the pool.
Does everything that clear
does, except if the pool is closed this method does nothing but clear
would raise PoolClosedError.
514 515 516 517 518 519 520 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 514 def disconnect!( = nil) do_clear() rescue Error::PoolClosedError # The "disconnected" state is between closed and paused. # When we are trying to disconnect the pool, permit the pool to be # already closed. end |
#do_check_in(connection) ⇒ Object
Executes the check in after having already acquired the lock.
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 392 def do_check_in(connection) # When a connection is interrupted it is checked back into the pool # and closed. The operation that was using the connection before it was # interrupted will attempt to check it back into the pool, and we # should ignore it since its already been closed and removed from the pool. return if connection.closed? && connection.interrupted? unless connection.connection_pool == self raise ArgumentError, "Trying to check in a connection which was not checked out by this pool: #{connection} checked out from pool #{connection.connection_pool} (for #{self})" end unless @checked_out_connections.include?(connection) raise ArgumentError, "Trying to check in a connection which is not currently checked out by this pool: #{connection} (for #{self})" end # Note: if an event handler raises, resource will not be signaled. # This means threads waiting for a connection to free up when # the pool is at max size may time out. # Threads that begin waiting after this method completes (with # the exception) should be fine. @checked_out_connections.delete(connection) @size_cv.signal publish_cmap_event( Monitoring::Event::Cmap::ConnectionCheckedIn.new(@server.address, connection.id, self) ) if connection.interrupted? connection.disconnect!(reason: :stale) return end if connection.error? connection.disconnect!(reason: :error) return end if closed? connection.disconnect!(reason: :pool_closed) return end if connection.closed? # Connection was closed - for example, because it experienced # a network error. Nothing else needs to be done here. @populate_semaphore.signal elsif connection.generation != generation(service_id: connection.service_id) && !connection.pinned? # If connection is marked as pinned, it is used by a transaction # or a series of cursor operations in a load balanced setup. # In this case connection should not be disconnected until # unpinned. connection.disconnect!(reason: :stale) @populate_semaphore.signal else connection.record_checkin! @available_connections << connection @max_connecting_cv.signal end end |
#do_clear(options = nil) ⇒ Object
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 522 def do_clear( = nil) check_invariants service_id = && [:service_id] @lock.synchronize do # Generation must be bumped before emitting pool cleared event. @generation_manager.bump(service_id: service_id) unless && [:lazy] close_available_connections(service_id) end if && [:interrupt_in_use_connections] schedule_for_interruption(@checked_out_connections, service_id) schedule_for_interruption(@pending_connections, service_id) end if @ready publish_cmap_event( Monitoring::Event::Cmap::PoolCleared.new( @server.address, service_id: service_id, interrupt_in_use_connections: &.[](:interrupt_in_use_connections) ) ) # Only pause the connection pool if the server was marked unknown, # otherwise, allow the retry to be attempted with a ready pool. do_pause if !@server.load_balancer? && @server.unknown? end # Broadcast here to cause all of the threads waiting on the max # connecting to break out of the wait loop and error. @max_connecting_cv.broadcast # Broadcast here to cause all of the threads waiting on the pool size # to break out of the wait loop and error. @size_cv.broadcast end # "Schedule the background thread" after clearing. This is responsible # for cleaning up stale threads, and interrupting in use connections. @populate_semaphore.signal true ensure check_invariants end |
#do_pause ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Mark the connection pool as paused without acquiring the lock.
470 471 472 473 474 475 476 477 478 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 470 def do_pause if Lint.enabled? && !@server.unknown? raise Error::LintError, "Attempting to pause pool for server #{@server.summary} which is known" end return if !@ready @ready = false end |
#inspect ⇒ String
Get a pretty printed string inspection for the pool.
668 669 670 671 672 673 674 675 676 677 678 679 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 668 def inspect if closed? "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " + "wait_timeout=#{wait_timeout} closed>" elsif !ready? "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " + "wait_timeout=#{wait_timeout} paused>" else "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " + "wait_timeout=#{wait_timeout} current_size=#{size} available=#{available_count}>" end end |
#max_idle_time ⇒ Float | nil
The maximum seconds a socket can remain idle since it has been checked in to the pool, if set.
211 212 213 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 211 def max_idle_time @max_idle_time ||= [:max_idle_time] end |
#max_size ⇒ Integer
Get the maximum size of the connection pool.
183 184 185 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 183 def max_size @max_size ||= [:max_size] || [DEFAULT_MAX_SIZE, min_size].max end |
#min_size ⇒ Integer
Get the minimum size of the connection pool.
192 193 194 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 192 def min_size @min_size ||= [:min_size] || DEFAULT_MIN_SIZE end |
#pause ⇒ Object
Mark the connection pool as paused.
455 456 457 458 459 460 461 462 463 464 465 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 455 def pause raise_if_closed! check_invariants @lock.synchronize do do_pause end ensure check_invariants end |
#paused? ⇒ true | false
A connection pool is paused if it is not closed and it is not ready.
229 230 231 232 233 234 235 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 229 def paused? raise_if_closed! @lock.synchronize do !@ready end end |
#populate ⇒ true | false
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method does three things:
-
Creates and adds a connection to the pool, if the pool’s size is below min_size. Retries once if a socket-related error is encountered during this process and raises if a second error or a non socket-related error occurs.
-
Removes stale connections from the connection pool.
-
Interrupts connections marked for interruption.
Used by the pool populator background thread.
occured, or the non socket-related error
766 767 768 769 770 771 772 773 774 775 776 777 778 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 766 def populate return false if closed? begin return create_and_add_connection rescue Error::SocketError, Error::SocketTimeoutError => e # an error was encountered while connecting the connection, # ignore this first error and try again. log_warn("Populator failed to connect a connection for #{address}: #{e.class}: #{e}. It will retry.") end return create_and_add_connection end |
#ready ⇒ Object
Instructs the pool to create and return connections.
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 570 def ready raise_if_closed! # TODO: Add this back in RUBY-3174. # if Lint.enabled? # unless @server.connected? # raise Error::LintError, "Attempting to ready a pool for server #{@server.summary} which is disconnected" # end # end @lock.synchronize do return if @ready @ready = true end # Note that the CMAP spec demands serialization of CMAP events for a # pool. In order to implement this, event publication must be done into # a queue which is synchronized, instead of subscribers being invoked # from the trigger method like this one here inline. On MRI, assuming # the threads yield to others when they stop having work to do, it is # likely that the events would in practice always be published in the # required order. JRuby, being truly concurrent with OS threads, # would not offers such a guarantee. publish_cmap_event( Monitoring::Event::Cmap::PoolReady.new(@server.address, , self) ) if .fetch(:populator_io, true) if @populator.running? @populate_semaphore.signal else @populator.run! end end end |
#ready? ⇒ true | false
Whether the pool is ready.
294 295 296 297 298 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 294 def ready? @lock.synchronize do @ready end end |
#size ⇒ Integer
Size of the connection pool.
Includes available and checked out connections.
244 245 246 247 248 249 250 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 244 def size raise_if_closed! @lock.synchronize do unsynchronized_size end end |
#stop_populator ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Stop the background populator thread and clean up any connections created which have not been connected yet.
Used when closing the pool or when terminating the bg thread for testing purposes. In the latter case, this method must be called before the pool is used, to ensure no connections in pending_connections were created in-flow by the check_out method.
738 739 740 741 742 743 744 745 746 747 748 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 738 def stop_populator @populator.stop! @lock.synchronize do # If stop_populator is called while populate is running, there may be # connections waiting to be connected, connections which have not yet # been moved to available_connections, or connections moved to available_connections # but not deleted from pending_connections. These should be cleaned up. clear_pending_connections end end |
#summary ⇒ Object
This method is experimental and subject to change.
304 305 306 307 308 309 310 311 312 313 314 315 316 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 304 def summary @lock.synchronize do state = if closed? 'closed' elsif !@ready 'paused' else 'ready' end "#<ConnectionPool size=#{unsynchronized_size} (#{min_size}-#{max_size}) " + "used=#{@checked_out_connections.length} avail=#{@available_connections.length} pending=#{@pending_connections.length} #{state}>" end end |
#unavailable_connections ⇒ Integer
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The number of unavailable connections in the pool. Used to calculate whether we have hit max_pool_size.
265 266 267 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 265 def unavailable_connections @checked_out_connections.length + @pending_connections.length + @connection_requests end |
#wait_timeout ⇒ Float
The time to wait, in seconds, for a connection to become available.
201 202 203 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 201 def wait_timeout @wait_timeout ||= [:wait_timeout] || DEFAULT_WAIT_TIMEOUT end |
#with_connection(connection_global_id: nil) ⇒ Object
Yield the block to a connection, while handling check in/check out logic.
691 692 693 694 695 696 697 698 699 700 701 702 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/connection_pool.rb', line 691 def with_connection(connection_global_id: nil) raise_if_closed! connection = check_out(connection_global_id: connection_global_id) yield(connection) rescue Error::SocketError, Error::SocketTimeoutError, Error::ConnectionPerished => e maybe_raise_pool_cleared!(connection, e) ensure if connection check_in(connection) end end |