aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/abstract
diff options
context:
space:
mode:
authorAndrew Selder <aselder@nextag.com>2012-05-23 11:08:41 -0700
committerAndrew Selder <aselder@nextag.com>2012-05-23 11:08:41 -0700
commite663aa39aa8599f01cce2f61c68e8bea736fc186 (patch)
treeb5fde51c08b212c7fec13d29ff50b1973f845eb9 /activerecord/lib/active_record/connection_adapters/abstract
parentff3cddf8763e100947cdffe9c25716e93ccbac62 (diff)
downloadrails-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/lib/active_record/connection_adapters/abstract')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb22
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