class Mongoid::Sessions::SessionPool

Attributes

available[R]
reaper[R]
reserved_sessions[R]
sessions[R]
size[R]

Public Class Methods

new(opts={}) click to toggle source
Calls superclass method
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 95
def initialize(opts={})
  super()

  opts[:name] ||= :default
  opts[:size] ||= 5
  opts[:checkout_timeout] ||= 5
  # Might be false, disables Reaper
  opts[:reap_frequency] = 3 if opts[:reap_frequency].nil?

  @reaper = Reaper.new(opts[:reap_frequency], self)
  @reaper.run

  @checkout_timeout = opts[:checkout_timeout]

  @size = opts[:size]
  @name = opts[:name]
  @sessions = []
  @reserved_sessions = ThreadSafe::Cache.new(:initial_capacity => @size)
  @available = Queue.new self
end

Public Instance Methods

checkin(session) click to toggle source

Returns a session back to the available pool

# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 127
def checkin(session)
  if session
    synchronize do
      @available.add session
      release(session)
    end
    true
  end
end
checkin_from_thread(thread) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 163
def checkin_from_thread(thread)
  checkin session_for(thread)
  true
end
checkout() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 116
def checkout
  synchronize do
    unless (session = session_for(Thread.current))
      session = get_session
      reserve(session)
    end
    session
  end
end
clear(thread=nil) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 137
def clear(thread=nil)
  if thread
    disconnect(thread)
    @reserved_sessions.delete(thread) if session_for(thread)
    @sessions.pop
  else
    @reserved_sessions = {}
    @sessions = []
    @available = Queue.new self
  end
  @reserved_sessions
end
count() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 168
def count
  @available.count
end
disconnect(thread=Thread.current) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 150
def disconnect(thread=Thread.current)
  synchronize do
    @session_pool.try(:each) do |name, pool|
      if thread
        pool.session_for(thread).try(:disconnect)
      else
        pool.sessions.try(:each) { |session| session.disconnect }
      end
    end
  end
  true
end
reap() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 172
def reap
  @reserved_sessions.keys.each do |thread|
    session = @reserved_sessions[thread]
    checkin(session) unless thread.alive?
  end
end
session_for(thread) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 179
def session_for(thread)
  @reserved_sessions[thread]
end

Private Instance Methods

checkout_new_session() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 217
def checkout_new_session
  session = new_session
  @sessions << session
  session
end
create_new_session() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 229
def create_new_session
  Factory.create(@name)
end
current_session_id() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 190
def current_session_id
  Thread.current
end
get_session() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 205
def get_session
  # always double check the reaper is running, if we got forked after it starts we dont have a thread anymore
  @reaper.run unless @reaper.alive?
  if session = @available.poll
    session
  elsif @sessions.size < @size
    checkout_new_session
  else
    @available.poll(@checkout_timeout)
  end
end
new_session() click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 223
def new_session
  Factory.create(@name)
end
release(session) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 194
def release(session)
  thread =  if @reserved_sessions[current_session_id] == session
                current_session_id
            else
              @reserved_sessions.keys.find do |k|
                @reserved_sessions[k] == session
              end
            end
  @reserved_sessions.delete thread if thread
end
reserve(session) click to toggle source
# File lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb, line 186
def reserve(session)
  @reserved_sessions[current_session_id] = session
end