diff --git a/app/models/solid_queue/job/concurrency_controls.rb b/app/models/solid_queue/job/concurrency_controls.rb index b59c464ad..68d223266 100644 --- a/app/models/solid_queue/job/concurrency_controls.rb +++ b/app/models/solid_queue/job/concurrency_controls.rb @@ -63,7 +63,7 @@ def handle_concurrency_conflict end def block - BlockedExecution.create_or_find_by!(job_id: id) + BlockedExecution.create_or_find_by!(job_id: id) { |e| e.job = self } end def release_next_blocked_job diff --git a/app/models/solid_queue/job/executable.rb b/app/models/solid_queue/job/executable.rb index 75a5d2111..09faf614c 100644 --- a/app/models/solid_queue/job/executable.rb +++ b/app/models/solid_queue/job/executable.rb @@ -106,7 +106,7 @@ def discard private def ready - ReadyExecution.create_or_find_by!(job_id: id) + ReadyExecution.create_or_find_by!(job_id: id) { |e| e.job = self } end def execution diff --git a/app/models/solid_queue/job/schedulable.rb b/app/models/solid_queue/job/schedulable.rb index 04419aa61..75f9b6cba 100644 --- a/app/models/solid_queue/job/schedulable.rb +++ b/app/models/solid_queue/job/schedulable.rb @@ -38,7 +38,7 @@ def scheduled? private def schedule - ScheduledExecution.create_or_find_by!(job_id: id) + ScheduledExecution.create_or_find_by!(job_id: id) { |e| e.job = self } end def execution diff --git a/test/models/solid_queue/job_test.rb b/test/models/solid_queue/job_test.rb index 7e9c1568f..c7eb79231 100644 --- a/test/models/solid_queue/job_test.rb +++ b/test/models/solid_queue/job_test.rb @@ -87,6 +87,21 @@ class DiscardableNonOverlappingGroupedJob2 < NonOverlappingJob assert_equal solid_queue_job.scheduled_at, execution.scheduled_at end + test "scheduling a single future job does not SELECT the job record back" do + active_job = AddToBufferJob.new(1) + job_selects = 0 + + subscriber = ->(*, payload) do + job_selects += 1 if payload[:sql].match?(/\ASELECT.*FROM.*solid_queue_jobs/i) + end + + ActiveSupport::Notifications.subscribed(subscriber, "sql.active_record") do + SolidQueue::Job.enqueue(active_job, scheduled_at: 5.minutes.from_now) + end + + assert_equal 0, job_selects + end + test "enqueue jobs within a connected_to block for the primary DB" do ShardedRecord.connected_to(role: :writing, shard: :shard_two) do ShardedJobResult.create!(value: "in shard two")