class NinjaModel::Adapters::AdapterPool

Attributes

instances[R]
spec[R]

Public Class Methods

new(spec) click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 8
def initialize(spec)
  @spec = spec
  @instances = []
  @checked_out_instances = []
  @assigned_instances = {}
  @instance_mutex = Monitor.new
  @instance_queue = @instance_mutex.new_cond
  @max_size = 5
  @timeout = 3
end

Public Instance Methods

connected?() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 19
def connected?
  !@instances.empty?
end
instance() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 23
def instance
  NinjaModel.logger.debug("instance called for #{current_instance_id}")
  @assigned_instances[current_instance_id] ||= checkout
end
release_instance(with_id = current_instance_id) click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 28
def release_instance(with_id = current_instance_id)
  inst = @assigned_instances.delete(with_id)
  checkin inst if inst
end
shutdown!() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 41
def shutdown!
  @assigned_instances.each do |name,conn|
    checkin conn
  end
  @assigned_instances = {}
  @instances.each do |inst|
    inst.disconnect!
  end
  @instances = []
end
with_instance() { |instance| ... } click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 33
def with_instance
  instance_id = current_instance_id
  fresh_instance = true unless @assigned_instances[instance_id]
  yield instance
ensure
  release_instance(instance_id) if fresh_instance
end

Private Instance Methods

checkin(inst) click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 95
def checkin(inst)
  @instance_mutex.synchronize do
    @checked_out_instances.delete inst
    @instance_queue.signal
  end
end
checkout() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 66
def checkout
  NinjaModel.logger.debug("checking out a connection for #{current_instance_id}")
  @instance_mutex.synchronize do
    loop do
      instance = if @checked_out_instances.size < @instances.size
               checkout_existing_instance
             elsif @instances.size < @max_size
               checkout_new_instance
             end
      return instance if instance

      # If we're here, we didn't get a valid instance
      @instance_queue.wait(@timeout)
      if (@checked_out_instances.size < @instances.size)
        next
      else
        NinjaModel.logger.debug("Connection pool full.  Clearing cached instances.")
        clear_stale_cached_instances!
        if @max_size == @checked_out_instances.size
          NinjaModel.logger.warn("Connection pool full?")
          NinjaModel.logger.warn("@checked_out_instances: #{@checked_out_instances.inspect}")
          NinjaModel.logger.warn("@assigned_instances: #{@assigned_instances.inspect}")
          raise ConnectionTimeoutError, "[ninja-model] *ERROR* Could not obtain an adapter instance within #{@timeout} seconds.  The max adapter pool size is currently #{@max_size}...consider increasing it."
        end
      end
    end
  end
end
checkout_and_verify(inst) click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 121
def checkout_and_verify(inst)
  inst.verify!
  @checked_out_instances << inst
  inst
end
checkout_existing_instance() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 116
def checkout_existing_instance
  i = (@instances - @checked_out_instances).first
  checkout_and_verify(i)
end
checkout_new_instance() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 110
def checkout_new_instance
  i = new_instance
  @instances << i
  checkout_and_verify(i)
end
clear_stale_cached_instances!() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 54
def clear_stale_cached_instances!
  NinjaModel.logger.debug("clearing stale instances: #{@assigned_instances.keys}")
  keys = @assigned_instances.keys - Thread.list.find_all { |t|
    t.alive?
  }.map { |thread| thread.object_id }
  keys.each do |key|
    NinjaModel.logger.debug("Checking in stale connection for #{key}")
    checkin @assigned_instances[key]
    @assigned_instances.delete(key)
  end
end
current_instance_id() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 106
def current_instance_id
  Thread.current.object_id
end
new_instance() click to toggle source
# File lib/ninja_model/adapters/adapter_pool.rb, line 102
def new_instance
  AdapterManager.registered[spec.name.to_sym].new(spec.config)
end