aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2011-12-30 15:19:07 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2011-12-30 15:19:07 -0800
commitcde7692d4e3e0e67e480cc6172f6e2bacaceeb5e (patch)
tree8b31ee31bee1cebc067174fc7355ea1f0b503708 /activerecord
parentcceabe03a80c4a0121a2b1187b56a2d29586a43b (diff)
downloadrails-cde7692d4e3e0e67e480cc6172f6e2bacaceeb5e.tar.gz
rails-cde7692d4e3e0e67e480cc6172f6e2bacaceeb5e.tar.bz2
rails-cde7692d4e3e0e67e480cc6172f6e2bacaceeb5e.zip
introduce a timer class for reaping connections
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb19
-rw-r--r--activerecord/test/cases/reaper_test.rb46
2 files changed, 65 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb
index 124875d52f..a26c435dad 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb
@@ -64,6 +64,25 @@ module ActiveRecord
# * +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
diff --git a/activerecord/test/cases/reaper_test.rb b/activerecord/test/cases/reaper_test.rb
new file mode 100644
index 0000000000..ed3daa175d
--- /dev/null
+++ b/activerecord/test/cases/reaper_test.rb
@@ -0,0 +1,46 @@
+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