Class: ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper
Relationships & Source Files | |
Inherits: | Object |
Defined in: | activerecord/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb |
Overview
Active Record Connection Pool Reaper
Every #frequency seconds, the reaper will call #reap and #flush on #pool. A reaper instantiated with a zero frequency will never reap the connection pool.
Configure the frequency by setting reaping_frequency
in your database YAML file (default 60 seconds).
Class Method Summary
- .new(pool, frequency) ⇒ Reaper constructor
- .spawn_thread(frequency) private
- .register_pool(pool, frequency) Internal use only
Instance Attribute Summary
- #frequency readonly
- #pool readonly
Instance Method Summary
Constructor Details
.new(pool, frequency) ⇒ Reaper
Class Method Details
.register_pool(pool, frequency)
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb', line 29
def register_pool(pool, frequency) # :nodoc: @mutex.synchronize do unless @threads[frequency]&.alive? @threads[frequency] = spawn_thread(frequency) end @pools[frequency] ||= [] @pools[frequency] << WeakRef.new(pool) end end
.spawn_thread(frequency) (private)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb', line 40
def spawn_thread(frequency) Thread.new(frequency) do |t| # Advise multi-threaded app servers to ignore this thread for # the purposes of fork safety warnings Thread.current.thread_variable_set(:fork_safe, true) Thread.current.name = "AR Pool Reaper" running = true while running sleep t @mutex.synchronize do @pools[frequency].select! do |pool| pool.weakref_alive? && !pool.discarded? end @pools[frequency].each do |p| p.reap p.flush rescue WeakRef::RefError end if @pools[frequency].empty? @pools.delete(frequency) @threads.delete(frequency) running = false end end end end end
Instance Attribute Details
#frequency (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb', line 17
attr_reader :pool, :frequency
#pool (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb', line 17
attr_reader :pool, :frequency
Instance Method Details
#run
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb', line 71
def run return unless frequency && frequency > 0 self.class.register_pool(pool, frequency) end