From 28071420e6894387951d9911dac66ac48880c569 Mon Sep 17 00:00:00 2001 From: Rosa Gutierrez Date: Wed, 8 Oct 2025 14:27:48 +0200 Subject: [PATCH] Replace use of `ActiveRecord::Base.connection` with `with_connection` So that when running with `permanent_connection_checkout` set to `false`, this doesn't cause any problems. Using `connection` is deprecated in any case, so this was needed regardless. --- app/models/solid_queue/failed_execution.rb | 7 +++++-- app/models/solid_queue/record.rb | 18 +++++++++++++----- app/models/solid_queue/recurring_execution.rb | 2 +- app/models/solid_queue/recurring_task.rb | 2 +- app/models/solid_queue/semaphore.rb | 2 +- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/models/solid_queue/failed_execution.rb b/app/models/solid_queue/failed_execution.rb index 0b7fffe0..8bcdc92f 100644 --- a/app/models/solid_queue/failed_execution.rb +++ b/app/models/solid_queue/failed_execution.rb @@ -58,8 +58,11 @@ def exception_backtrace end def determine_backtrace_size_limit - column = self.class.connection.schema_cache.columns_hash(self.class.table_name)["error"] - if column.limit.present? + column = self.class.connection_pool.with_connection do |connection| + connection.schema_cache.columns_hash(self.class.table_name)["error"] + end + + if column && column.limit.present? column.limit - exception_class_name.bytesize - exception_message.bytesize - JSON_OVERHEAD end end diff --git a/app/models/solid_queue/record.rb b/app/models/solid_queue/record.rb index d73e41b2..0a704d2c 100644 --- a/app/models/solid_queue/record.rb +++ b/app/models/solid_queue/record.rb @@ -6,11 +6,19 @@ class Record < ActiveRecord::Base connects_to(**SolidQueue.connects_to) if SolidQueue.connects_to - def self.non_blocking_lock - if SolidQueue.use_skip_locked - lock(Arel.sql("FOR UPDATE SKIP LOCKED")) - else - lock + class << self + def non_blocking_lock + if SolidQueue.use_skip_locked + lock(Arel.sql("FOR UPDATE SKIP LOCKED")) + else + lock + end + end + + def supports_insert_conflict_target? + connection_pool.with_connection do |connection| + connection.supports_insert_conflict_target? + end end end end diff --git a/app/models/solid_queue/recurring_execution.rb b/app/models/solid_queue/recurring_execution.rb index 26b24e00..7b7bab29 100644 --- a/app/models/solid_queue/recurring_execution.rb +++ b/app/models/solid_queue/recurring_execution.rb @@ -8,7 +8,7 @@ class AlreadyRecorded < StandardError; end class << self def create_or_insert!(**attributes) - if connection.supports_insert_conflict_target? + if supports_insert_conflict_target? # PostgreSQL fails and aborts the current transaction when it hits a duplicate key conflict # during two concurrent INSERTs for the same value of an unique index. We need to explicitly # indicate unique_by to ignore duplicate rows by this value when inserting diff --git a/app/models/solid_queue/recurring_task.rb b/app/models/solid_queue/recurring_task.rb index 364caef3..e6d4db57 100644 --- a/app/models/solid_queue/recurring_task.rb +++ b/app/models/solid_queue/recurring_task.rb @@ -36,7 +36,7 @@ def from_configuration(key, **options) end def create_or_update_all(tasks) - if connection.supports_insert_conflict_target? + if supports_insert_conflict_target? # PostgreSQL fails and aborts the current transaction when it hits a duplicate key conflict # during two concurrent INSERTs for the same value of an unique index. We need to explicitly # indicate unique_by to ignore duplicate rows by this value when inserting diff --git a/app/models/solid_queue/semaphore.rb b/app/models/solid_queue/semaphore.rb index 62eeb035..e93b2419 100644 --- a/app/models/solid_queue/semaphore.rb +++ b/app/models/solid_queue/semaphore.rb @@ -20,7 +20,7 @@ def signal_all(jobs) # Requires a unique index on key def create_unique_by(attributes) - if connection.supports_insert_conflict_target? + if supports_insert_conflict_target? insert({ **attributes }, unique_by: :key).any? else create!(**attributes)