2011-12-30 18:19:07 -05:00
|
|
|
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
|
|
|
|
|
2011-12-30 19:10:53 -05:00
|
|
|
class FakePool
|
|
|
|
attr_reader :reaped
|
2011-12-30 18:19:07 -05:00
|
|
|
|
2011-12-30 19:10:53 -05:00
|
|
|
def initialize
|
|
|
|
@reaped = false
|
|
|
|
end
|
2011-12-30 18:19:07 -05:00
|
|
|
|
2011-12-30 19:10:53 -05:00
|
|
|
def reap
|
|
|
|
@reaped = true
|
|
|
|
end
|
2011-12-30 18:19:07 -05:00
|
|
|
end
|
|
|
|
|
2011-12-30 19:10:53 -05:00
|
|
|
# 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
|
2011-12-30 18:19:07 -05:00
|
|
|
|
2011-12-30 19:10:53 -05:00
|
|
|
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
|
2011-12-30 18:19:07 -05:00
|
|
|
end
|
2011-12-30 18:27:41 -05:00
|
|
|
|
|
|
|
def test_pool_has_reaper
|
|
|
|
assert pool.reaper
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_reaping_frequency_configuration
|
2011-12-30 18:36:48 -05:00
|
|
|
spec = ActiveRecord::Base.connection_pool.spec.dup
|
2011-12-30 18:27:41 -05:00
|
|
|
spec.config[:reaping_frequency] = 100
|
|
|
|
pool = ConnectionPool.new spec
|
|
|
|
assert_equal 100, pool.reaper.frequency
|
|
|
|
end
|
2011-12-30 18:39:39 -05:00
|
|
|
|
|
|
|
def test_connection_pool_starts_reaper
|
|
|
|
spec = ActiveRecord::Base.connection_pool.spec.dup
|
|
|
|
spec.config[:reaping_frequency] = 0.0001
|
|
|
|
|
|
|
|
pool = ConnectionPool.new spec
|
ConnectionPool wait_timeout no longer used for different types of timeouts. #6441
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.
2012-05-23 12:08:11 -04:00
|
|
|
pool.dead_connection_timeout = 0
|
2011-12-30 18:39:39 -05:00
|
|
|
|
|
|
|
conn = pool.checkout
|
|
|
|
count = pool.connections.length
|
|
|
|
|
|
|
|
conn.extend(Module.new { def active?; false; end; })
|
|
|
|
|
2011-12-30 19:10:53 -05:00
|
|
|
while count == pool.connections.length
|
|
|
|
Thread.pass
|
|
|
|
end
|
2011-12-30 18:39:39 -05:00
|
|
|
assert_equal(count - 1, pool.connections.length)
|
|
|
|
end
|
2011-12-30 18:19:07 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|