From 86729eb733ce67818f079744fdea5ec63e25259a Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 30 Dec 2011 14:26:29 -0800 Subject: connections can be reaped via the `reap` method --- .../connection_adapters/abstract/connection_pool.rb | 12 ++++++++++++ activerecord/test/cases/connection_pool_test.rb | 15 +++++++++++++++ 2 files changed, 27 insertions(+) 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 a88c9e2c4b..3f3b98ace0 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -232,6 +232,18 @@ module ActiveRecord end end + # Removes dead connections from the pool. A dead connection can occur + # if a programmer forgets to close a connection at the end of a thread + # or a thread dies unexpectedly. + def reap + synchronize do + stale = Time.now - @timeout + connections.dup.each do |conn| + remove conn if conn.in_use? && stale > conn.last_use + end + end + end + private def new_connection diff --git a/activerecord/test/cases/connection_pool_test.rb b/activerecord/test/cases/connection_pool_test.rb index 10f91d7eb0..015c1c7ce7 100644 --- a/activerecord/test/cases/connection_pool_test.rb +++ b/activerecord/test/cases/connection_pool_test.rb @@ -25,6 +25,21 @@ module ActiveRecord @pool.connections.each(&:close) end + def test_reap + @pool.checkout + @pool.checkout + @pool.checkout + @pool.timeout = 0 + + connections = @pool.connections.dup + + @pool.reap + + assert_equal 0, @pool.connections.length + ensure + connections.map(&:close) + end + def test_remove_connection conn = @pool.checkout assert conn.in_use? -- cgit v1.2.3