From c2d416fe7712cbaf69036f9e638c825e08415e34 Mon Sep 17 00:00:00 2001 From: Patrick Mahoney Date: Sat, 19 May 2012 11:45:55 -0500 Subject: [PATCH] Synchronize read and modification of @reserved_connections hash to avoid concurrency error. --- .../connection_adapters/abstract/connection_pool.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 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 46c7fc71ac1a..c6699737b41e 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -139,14 +139,18 @@ def initialize(spec) # #connection can be called any number of times; the connection is # held in a hash keyed by the thread id. def connection - @reserved_connections[current_connection_id] ||= checkout + synchronize do + @reserved_connections[current_connection_id] ||= checkout + end end # Is there an open connection that is being used for the current thread? def active_connection? - @reserved_connections.fetch(current_connection_id) { - return false - }.in_use? + synchronize do + @reserved_connections.fetch(current_connection_id) { + return false + }.in_use? + end end # Signal that the thread is finished with the current connection.