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 d655d57f3615f..45b30ab80a9ad 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -545,20 +545,25 @@ def clear_reloadable_connections! # Raises: # - ActiveRecord::ConnectionTimeoutError no connection can be obtained from the pool. def checkout(checkout_timeout = @checkout_timeout) - if @pinned_connection - @pinned_connection.lock.synchronize do - synchronize do + return checkout_and_verify(acquire_connection(checkout_timeout)) unless @pinned_connection + + @pinned_connection.lock.synchronize do + synchronize do + # The pinned connection may have been cleaned up before we synchronized, so check if it is still present + if @pinned_connection @pinned_connection.verify! + # Any leased connection must be in @connections otherwise # some methods like #connected? won't behave correctly unless @connections.include?(@pinned_connection) @connections << @pinned_connection end + + @pinned_connection + else + checkout_and_verify(acquire_connection(checkout_timeout)) end end - @pinned_connection - else - checkout_and_verify(acquire_connection(checkout_timeout)) end end