Class: Mongoid::Sessions::SessionPool
- Inherits:
-
Object
- Object
- Mongoid::Sessions::SessionPool
- Includes:
- MonitorMixin
- Defined in:
- lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb
Defined Under Namespace
Classes: ConnectionTimeoutError, Queue, Reaper
Instance Attribute Summary collapse
-
#available ⇒ Object
readonly
Returns the value of attribute available.
-
#reaper ⇒ Object
readonly
Returns the value of attribute reaper.
-
#reserved_sessions ⇒ Object
readonly
Returns the value of attribute reserved_sessions.
-
#sessions ⇒ Object
readonly
Returns the value of attribute sessions.
-
#size ⇒ Object
readonly
Returns the value of attribute size.
Instance Method Summary collapse
-
#checkin(session) ⇒ Object
Returns a session back to the available pool.
- #checkin_from_thread(thread) ⇒ Object
- #checkout ⇒ Object
- #clear(thread = nil) ⇒ Object
- #count ⇒ Object
- #disconnect(thread = Thread.current) ⇒ Object
-
#initialize(opts = {}) ⇒ SessionPool
constructor
A new instance of SessionPool.
- #reap ⇒ Object
- #session_for(thread) ⇒ Object
- #session_for_thread(thread) ⇒ Object
Constructor Details
#initialize(opts = {}) ⇒ SessionPool
Returns a new instance of SessionPool.
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# 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 |
Instance Attribute Details
#available ⇒ Object (readonly)
Returns the value of attribute available.
94 95 96 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 94 def available @available end |
#reaper ⇒ Object (readonly)
Returns the value of attribute reaper.
94 95 96 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 94 def reaper @reaper end |
#reserved_sessions ⇒ Object (readonly)
Returns the value of attribute reserved_sessions.
94 95 96 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 94 def reserved_sessions @reserved_sessions end |
#sessions ⇒ Object (readonly)
Returns the value of attribute sessions.
94 95 96 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 94 def sessions @sessions end |
#size ⇒ Object (readonly)
Returns the value of attribute size.
94 95 96 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 94 def size @size end |
Instance Method Details
#checkin(session) ⇒ Object
Returns a session back to the available pool
127 128 129 130 131 132 133 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 127 def checkin(session) synchronize do @available.add session release(session) end true end |
#checkin_from_thread(thread) ⇒ Object
161 162 163 164 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 161 def checkin_from_thread(thread) checkin @reserved_sessions[thread] true end |
#checkout ⇒ Object
116 117 118 119 120 121 122 123 124 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 116 def checkout unless (session = session_for_thread(Thread.current)) synchronize do session = get_session reserve(session) end end session end |
#clear(thread = nil) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 135 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 ⇒ Object
166 167 168 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 166 def count @available.count end |
#disconnect(thread = Thread.current) ⇒ Object
148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 148 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 ⇒ Object
170 171 172 173 174 175 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 170 def reap @reserved_sessions.keys.each do |thread| session = @reserved_sessions[thread] checkin(session) unless thread.alive? end end |
#session_for(thread) ⇒ Object
181 182 183 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 181 def session_for(thread) @reserved_sessions[thread] end |
#session_for_thread(thread) ⇒ Object
177 178 179 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 177 def session_for_thread(thread) @reserved_sessions[thread] end |