From a9007010c145ebfb32a69b34522fc626c7b9dda5 Mon Sep 17 00:00:00 2001 From: GPT on behalf of DHH <2741+dhh@users.noreply.github.com> Date: Thu, 8 Oct 2026 12:34:18 +0200 Subject: [PATCH] Check cache transactions without leasing a database connection --- app/controllers/concerns/cached_responses.rb | 4 ++-- app/models/record_cache.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/concerns/cached_responses.rb b/app/controllers/concerns/cached_responses.rb index 95fa2a0..05d7be1 100644 --- a/app/controllers/concerns/cached_responses.rb +++ b/app/controllers/concerns/cached_responses.rb @@ -10,7 +10,7 @@ module CachedResponses end def perform_caching - return false unless super && @response_cache_version.present? && !ActiveRecord::Base.connection.transaction_open? + return false unless super && @response_cache_version.present? && !ActiveRecord::Base.connection_pool.active_connection?&.transaction_open? # Check again after authentication, before the first native fragment lookup. # Later renders retain this immutable namespace and cannot poison a new epoch. @@ -103,7 +103,7 @@ module CachedResponses !authenticated_by.bot_key? && flash.empty? && !request.headers["If-None-Match"] && !request.headers["If-Modified-Since"] && !Rails.application.config.content_security_policy_nonce_generator && - !ActiveRecord::Base.connection.transaction_open? + !ActiveRecord::Base.connection_pool.active_connection?&.transaction_open? end def response_cache_key(encoding) diff --git a/app/models/record_cache.rb b/app/models/record_cache.rb index 03924a6..2446093 100644 --- a/app/models/record_cache.rb +++ b/app/models/record_cache.rb @@ -2,7 +2,7 @@ # The observer must still see the captured epoch after lookup and admission. class RecordCache def self.fetch(key, version) - return yield unless version && ResponseCache.instance.budget.positive? && !ActiveRecord::Base.connection.transaction_open? + return yield unless version && ResponseCache.instance.budget.positive? && !ActiveRecord::Base.connection_pool.active_connection?&.transaction_open? key = ActiveSupport::Cache.expand_cache_key([ "record-snapshot-v1", version, key ]) return yield if key.bytesize > ResponseCache::MAX_KEY_BYTES