diff options
author | Andrew Selder <aselder@nextag.com> | 2012-05-23 11:08:41 -0700 |
---|---|---|
committer | Andrew Selder <aselder@nextag.com> | 2012-05-23 11:08:41 -0700 |
commit | e663aa39aa8599f01cce2f61c68e8bea736fc186 (patch) | |
tree | b5fde51c08b212c7fec13d29ff50b1973f845eb9 /activerecord | |
parent | ff3cddf8763e100947cdffe9c25716e93ccbac62 (diff) | |
download | rails-e663aa39aa8599f01cce2f61c68e8bea736fc186.tar.gz rails-e663aa39aa8599f01cce2f61c68e8bea736fc186.tar.bz2 rails-e663aa39aa8599f01cce2f61c68e8bea736fc186.zip |
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'
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb | 22 |
1 files changed, 12 insertions, 10 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 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 |