mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
cb6f839359
An AR ConnectionSpec `wait_timeout` is pre-patch used for three different things: * mysql2 uses it for MySQL's own wait_timeout (how long MySQL should allow an idle connection before closing it), and defaults to 2592000 seconds. * ConnectionPool uses it for "number of seconds to block and wait for a connection before giving up and raising a timeout error", default 5 seconds. * ConnectionPool uses it for the Reaper, for deciding if a 'dead' connection can be reaped. Default 5 seconds. Previously, if you want to change these from defaults, you need to change them all together. This is problematic _especially_ for the mysql2/ConnectionPool conflict, you will generally _not_ want them to be the same, as evidenced by their wildly different defaults. This has caused real problems for people #6441 #2894 But as long as we're changing this, forcing renaming the ConnectionPool key to be more specific, it made sense to seperate the two ConnectionPool uses too -- these two types of ConnectionPool timeouts ought to be able to be changed independently, you won't neccesarily want them to be the same, even though the defaults are (currently) the same.
81 lines
1.8 KiB
Ruby
81 lines
1.8 KiB
Ruby
require "cases/helper"
|
|
|
|
module ActiveRecord
|
|
module ConnectionAdapters
|
|
class ReaperTest < ActiveRecord::TestCase
|
|
attr_reader :pool
|
|
|
|
def setup
|
|
super
|
|
@pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
|
end
|
|
|
|
def teardown
|
|
super
|
|
@pool.connections.each(&:close)
|
|
end
|
|
|
|
class FakePool
|
|
attr_reader :reaped
|
|
|
|
def initialize
|
|
@reaped = false
|
|
end
|
|
|
|
def reap
|
|
@reaped = true
|
|
end
|
|
end
|
|
|
|
# A reaper with nil time should never reap connections
|
|
def test_nil_time
|
|
fp = FakePool.new
|
|
assert !fp.reaped
|
|
reaper = ConnectionPool::Reaper.new(fp, nil)
|
|
reaper.run
|
|
assert !fp.reaped
|
|
end
|
|
|
|
def test_some_time
|
|
fp = FakePool.new
|
|
assert !fp.reaped
|
|
|
|
reaper = ConnectionPool::Reaper.new(fp, 0.0001)
|
|
reaper.run
|
|
until fp.reaped
|
|
Thread.pass
|
|
end
|
|
assert fp.reaped
|
|
end
|
|
|
|
def test_pool_has_reaper
|
|
assert pool.reaper
|
|
end
|
|
|
|
def test_reaping_frequency_configuration
|
|
spec = ActiveRecord::Base.connection_pool.spec.dup
|
|
spec.config[:reaping_frequency] = 100
|
|
pool = ConnectionPool.new spec
|
|
assert_equal 100, pool.reaper.frequency
|
|
end
|
|
|
|
def test_connection_pool_starts_reaper
|
|
spec = ActiveRecord::Base.connection_pool.spec.dup
|
|
spec.config[:reaping_frequency] = 0.0001
|
|
|
|
pool = ConnectionPool.new spec
|
|
pool.dead_connection_timeout = 0
|
|
|
|
conn = pool.checkout
|
|
count = pool.connections.length
|
|
|
|
conn.extend(Module.new { def active?; false; end; })
|
|
|
|
while count == pool.connections.length
|
|
Thread.pass
|
|
end
|
|
assert_equal(count - 1, pool.connections.length)
|
|
end
|
|
end
|
|
end
|
|
end
|