From b7a5dc4f1b7a7c2d44fb55ab2ce36325e78cbc1a Mon Sep 17 00:00:00 2001 From: Sjoerd Lagarde Date: Fri, 27 Dec 2024 10:05:15 +0100 Subject: [PATCH] Check if pinned connection is still available before checking it out --- .../abstract/connection_pool.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 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 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