123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper

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

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(pool, frequency) ⇒ Reaper

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb', line 19

def initialize(pool, frequency)
  @pool      = pool
  @frequency = frequency
end

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