Spec-Zone.ru › Ruby 2.7

class Bundler::ConnectionPool::TimedStack

Parent:
Объект

Примеры:

ts = TimedStack.new(1) { MyConnection.new }

# fetch a connection
conn = ts.pop

# return a connection
ts.push conn

conn = ts.pop
ts.pop timeout: 5
#=> raises Timeout::Error after 5 seconds

Атрибуты

max[R]

Публичные методы класса

new(size = 0, &block) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 37
def initialize(size = 0, &block)
  @create_block = block
  @created = 0
  @que = []
  @max = size
  @mutex = Mutex.new
  @resource = ConditionVariable.new
  @shutdown_block = nil
end

Создает новый пул с size подключениями, которые создаются из заданного block.

Публичные методы экземпляра

<<(obj, options = {})
Псевдоним для: push
empty?() Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 111
def empty?
  (@created - @que.length) >= @max
end

Возвращает true, если доступных подключений нет.

length() Показать исходный код
# 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 = {}) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 73
def pop(timeout = 0.5, options = {})
  options, timeout = timeout, 0.5 if Hash === timeout
  timeout = options.fetch :timeout, timeout

  deadline = Bundler::ConnectionPool.monotonic_time + timeout
  @mutex.synchronize do
    loop do
      raise Bundler::ConnectionPool::PoolShuttingDownError if @shutdown_block
      return fetch_connection(options) if connection_stored?(options)

      connection = try_create(options)
      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

Извлекает подключение из стека. Если подключение доступно, оно возвращается немедленно. Если подключение недоступно в течение заданного таймаута, генерируется исключение Timeout::Error.

:timeout является единственным проверяемым элементом в options и предпочтительнее аргумента timeout (который будет удален в будущей версии). Другие параметры могут использоваться подклассами, расширяющими TimedStack.

push(obj, options = {}) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 51
def push(obj, options = {})
  @mutex.synchronize do
    if @shutdown_block
      @shutdown_block.call(obj)
    else
      store_connection obj, options
    end

    @resource.broadcast
  end
end

Возвращает obj в стек. options игнорируется в TimedStack, но может использоваться подклассами, расширяющими TimedStack.

Также псевдоним для: <<
shutdown(&block) Показать исходный код
# 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

Закрывает TimedStack, что предотвращает получение подключений. block вызывается один раз для каждого подключения в стеке.

Приватные методы экземпляра

connection_stored?(options = nil) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 129
def connection_stored?(options = nil)
  !@que.empty?
end

Это точка расширения для TimedStack и вызывается с мьютексом.

Этот метод должен возвращать true, если в стеке доступно подключение.

fetch_connection(options = nil) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 138
def fetch_connection(options = nil)
  @que.pop
end

Это точка расширения для TimedStack и вызывается с мьютексом.

Этот метод должен возвращать подключение из стека.

shutdown_connections(options = nil) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 147
def shutdown_connections(options = nil)
  while connection_stored?(options)
    conn = fetch_connection(options)
    @shutdown_block.call(conn)
  end
end

Это точка расширения для TimedStack и вызывается с мьютексом.

Этот метод должен закрыть все подключения в стеке.

store_connection(obj, options = nil) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 159
def store_connection(obj, options = nil)
  @que.push obj
end

Это точка расширения для TimedStack и вызывается с мьютексом.

Этот метод должен поместить obj в стек.

try_create(options = nil) Показать исходный код
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 169
def try_create(options = nil)
  unless @created == @max
    object = @create_block.call
    @created += 1
    object
  end
end

Это точка расширения для TimedStack и вызывается с мьютексом.

Этот метод должен создать подключение только в том случае, если общее количество разрешенных подключений не достигнуто.

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API