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
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 134 135 |
# 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) ⇒ Object
163 164 165 166 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 163 def checkin_from_thread(thread) checkin session_for(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 synchronize do unless (session = session_for(Thread.current)) session = get_session reserve(session) end session end end |
#clear(thread = nil) ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 |
# 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 ⇒ Object
168 169 170 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 168 def count @available.count end |
#disconnect(thread = Thread.current) ⇒ Object
150 151 152 153 154 155 156 157 158 159 160 161 |
# 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 ⇒ Object
172 173 174 175 176 177 |
# 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) ⇒ Object
179 180 181 |
# File 'lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb', line 179 def session_for(thread) @reserved_sessions[thread] end |