Class: Bundler::ConnectionPool::TimedStack
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Inherits: | Object |
Defined in: | lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb |
Overview
Class Method Summary
-
.new(size = 0, &block) ⇒ TimedStack
constructor
Creates a new pool with #size connections that are created from the given
block
.
Instance Attribute Summary
-
#empty? ⇒ Boolean
readonly
Returns
true
if there are no available connections. - #max readonly
Instance Method Summary
-
#<<(obj, options = {})
Alias for #push.
-
#length
The number of connections available on the stack.
-
#pop(timeout = 0.5, options = {})
Retrieves a connection from the stack.
-
#push(obj, options = {})
(also: #<<)
Returns
obj
to the stack. -
#shutdown(&block)
Shuts down the
TimedStack
which prevents connections from being checked out. -
#connection_stored?(options = nil) ⇒ Boolean
private
This is an extension point for
TimedStack
and is called with a mutex. -
#fetch_connection(options = nil)
private
This is an extension point for
TimedStack
and is called with a mutex. -
#shutdown_connections(options = nil)
private
This is an extension point for
TimedStack
and is called with a mutex. -
#store_connection(obj, options = nil)
private
This is an extension point for
TimedStack
and is called with a mutex. -
#try_create(options = nil)
private
This is an extension point for
TimedStack
and is called with a mutex.
Constructor Details
.new(size = 0, &block) ⇒ TimedStack
Creates a new pool with Bundler::ConnectionPool#size connections that are created from the given block
.
Instance Attribute Details
#empty? ⇒ Boolean
(readonly)
Returns true
if there are no available connections.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 111
def empty? (@created - @que.length) >= @max end
#max (readonly)
[ GitHub ]# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 31
attr_reader :max
Instance Method Details
#<<(obj, options = {})
Alias for #push.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 62
alias_method :<<, :push
#connection_stored?(options = nil) ⇒ Boolean
(private)
This is an extension point for TimedStack
and is called with a mutex.
This method must returns true if a connection is available on the stack.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 129
def connection_stored?( = nil) !@que.empty? end
#fetch_connection(options = nil) (private)
This is an extension point for TimedStack
and is called with a mutex.
This method must return a connection from the stack.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 138
def fetch_connection( = nil) @que.pop end
#length
The number of connections available on the stack.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 118
def length @max - @created + @que.length end
#pop(timeout = 0.5, options = {})
Retrieves a connection from the stack. If a connection is available it is immediately returned. If no connection is available within the given timeout a Timeout::Error
is raised.
:timeout
is the only checked entry in options
and is preferred over the timeout
argument (which will be removed in a future release). Other options may be used by subclasses that extend TimedStack
.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 73
def pop(timeout = 0.5, = {}) , timeout = timeout, 0.5 if Hash === timeout timeout = .fetch :timeout, timeout deadline = Bundler::ConnectionPool.monotonic_time + timeout @mutex.synchronize do loop do raise Bundler::ConnectionPool::PoolShuttingDownError if @shutdown_block return fetch_connection( ) if connection_stored?( ) connection = try_create( ) return connection if connection to_wait = deadline - Bundler::ConnectionPool.monotonic_time raise Timeout::Error, "Waited #{timeout} sec" if to_wait <= 0 @resource.wait(@mutex, to_wait) end end end
#push(obj, options = {}) Also known as: #<<
Returns obj
to the stack. options
is ignored in TimedStack
but may be used by subclasses that extend TimedStack
.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 51
def push(obj, = {}) @mutex.synchronize do if @shutdown_block @shutdown_block.call(obj) else store_connection obj, end @resource.broadcast end end
#shutdown(&block)
Shuts down the TimedStack
which prevents connections from being checked out. The block
is called once for each connection on the stack.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 97
def shutdown(&block) raise ArgumentError, "shutdown must receive a block" unless block_given? @mutex.synchronize do @shutdown_block = block @resource.broadcast shutdown_connections end end
#shutdown_connections(options = nil) (private)
This is an extension point for TimedStack
and is called with a mutex.
This method must shut down all connections on the stack.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 147
def shutdown_connections( = nil) while connection_stored?( ) conn = fetch_connection( ) @shutdown_block.call(conn) end end
#store_connection(obj, options = nil) (private)
This is an extension point for TimedStack
and is called with a mutex.
This method must return obj
to the stack.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 159
def store_connection(obj, = nil) @que.push obj end
#try_create(options = nil) (private)
This is an extension point for TimedStack
and is called with a mutex.
This method must create a connection if and only if the total number of connections allowed has not been met.
# File 'lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb', line 169
def try_create( = nil) unless @created == @max object = @create_block.call @created += 1 object end end