From e663aa39aa8599f01cce2f61c68e8bea736fc186 Mon Sep 17 00:00:00 2001 From: Andrew Selder Date: Wed, 23 May 2012 11:08:41 -0700 Subject: Synchronize the ConnectionPool#release method to avoid thread safety issues [#6464] Fixes #6464 Synchronize the contents of the release method in ConnectionPool due to errors when running in high concurrency environments. Detected invalid hash contents due to unsynchronized modifications with concurrent users org/jruby/RubyHash.java:1356:in `keys' /usr/local/rvm/gems/jruby-1.6.7@new_import/gems/activerecord-3.2.3/lib/a ctive_record/connection_adapters/abstract/connection_pool.rb:294:in `release' /usr/local/rvm/gems/jruby-1.6.7@new_import/gems/activerecord-3.2.3/lib/a ctive_record/connection_adapters/abstract/connection_pool.rb:282:in `checkin' --- .../abstract/connection_pool.rb | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'activerecord') 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 f44cba3978..d4649102df 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -290,17 +290,19 @@ connection. For example: ActiveRecord::Base.connection.close private def release(conn) - thread_id = nil - - if @reserved_connections[current_connection_id] == conn - thread_id = current_connection_id - else - thread_id = @reserved_connections.keys.find { |k| - @reserved_connections[k] == conn - } - end + synchronize do + thread_id = nil + + if @reserved_connections[current_connection_id] == conn + thread_id = current_connection_id + else + thread_id = @reserved_connections.keys.find { |k| + @reserved_connections[k] == conn + } + end - @reserved_connections.delete thread_id if thread_id + @reserved_connections.delete thread_id if thread_id + end end def new_connection -- cgit v1.2.3