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