From 700639e4f6d4d9e9be50fe282756045f9189dd23 Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Wed, 16 Nov 2016 05:24:45 +0900 Subject: [PATCH] Fix the race condition caused by `with_new_connections_blocked` `with_new_connections_blocked` was introduced at #14938. But the method sometimes causes `@new_cons_enabled = false` then never toggled to true. --- .../connection_adapters/abstract/connection_pool.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 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 e6b6b60c1b..ee51419f8d 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -350,8 +350,7 @@ module ActiveRecord # currently in the process of independently establishing connections to the DB. @now_connecting = 0 - # A boolean toggle that allows/disallows new connections. - @new_cons_enabled = true + @new_cons_blocks = 0 @available = ConnectionLeasingQueue.new self end @@ -700,13 +699,10 @@ module ActiveRecord end def with_new_connections_blocked - previous_value = nil - synchronize do - previous_value, @new_cons_enabled = @new_cons_enabled, false - end + synchronize { @new_cons_blocks += 1 } yield ensure - synchronize { @new_cons_enabled = previous_value } + synchronize { @new_cons_blocks -= 1 } end # Acquire a connection by one of 1) immediately removing one @@ -758,7 +754,7 @@ module ActiveRecord # and increment @now_connecting, to prevent overstepping this pool's @size # constraint do_checkout = synchronize do - if @new_cons_enabled && (@connections.size + @now_connecting) < @size + if @new_cons_blocks.zero? && (@connections.size + @now_connecting) < @size @now_connecting += 1 end end