Class: Mongoid::Sessions::SessionPool

Inherits:
Object
  • Object
show all
Includes:
MonitorMixin
Defined in:
lib/mongoid_connection_pool/mongoid/sessions/session_pool.rb

Defined Under Namespace

Classes: ConnectionTimeoutError, Queue, Reaper

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#availableObject (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

#reaperObject (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_sessionsObject (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

#sessionsObject (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

#sizeObject (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

#checkoutObject



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

#countObject



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

#reapObject



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