提交 cde7692d 编写于 作者: A Aaron Patterson

introduce a timer class for reaping connections

上级 cceabe03
......@@ -64,6 +64,25 @@ module ConnectionAdapters
# * +wait_timeout+: number of seconds to block and wait for a connection
# before giving up and raising a timeout error (default 5 seconds).
class ConnectionPool
class Reaper
attr_reader :pool, :frequency
def initialize(pool, frequency)
@pool = pool
@frequency = frequency
end
def start
return unless frequency
Thread.new(frequency, pool) { |t, p|
while true
sleep t
p.reap
end
}
end
end
include MonitorMixin
attr_accessor :automatic_reconnect, :timeout
......
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
# A reaper with nil time should never reap connections
def test_nil_time
conn = pool.checkout
pool.timeout = 0
count = pool.connections.length
conn.extend(Module.new { def active?; false; end; })
reaper = ConnectionPool::Reaper.new(pool, nil)
reaper.start
sleep 0.0001
assert_equal count, pool.connections.length
end
def test_some_time
conn = pool.checkout
pool.timeout = 0
count = pool.connections.length
conn.extend(Module.new { def active?; false; end; })
reaper = ConnectionPool::Reaper.new(pool, 0.0001)
reaper.start
sleep 0.0002
assert_equal(count - 1, pool.connections.length)
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册