Skip to content

Commit f308c5c

Browse files
authored
Add lock-related scopes to ActiveRecord backend (#41)
1 parent 03b571f commit f308c5c

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

lib/delayed/backend/active_record.rb

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class Job < AbstractJob
2828
attr_accessor :enqueue_result
2929

3030
scope :next_in_strand_order, -> { order(:strand_order_override, :id) }
31+
scope :locked, -> { where.not(locked_by: nil) }
32+
scope :not_locked, -> { where(locked_by: nil) }
33+
scope :prefetched, -> { where(arel_table[:locked_by].matches("prefetch%")) }
3134

3235
def self.reconnect!
3336
::ActiveRecord::Base.connection_handler.clear_all_connections!(nil)

spec/active_record_job_spec.rb

+39
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,45 @@
1111

1212
include_examples "a delayed_jobs implementation"
1313

14+
describe ".locked" do
15+
subject(:locked_jobs) { Delayed::Job.locked }
16+
17+
let!(:not_locked_job) { Delayed::Job.create(payload_object: SimpleJob.new) }
18+
let!(:locked_job) { Delayed::Job.create(payload_object: SimpleJob.new) }
19+
20+
before { locked_job.send(:lock_exclusively!, "worker-123") }
21+
22+
it "only includes locked jobs" do
23+
expect(locked_jobs).to eq [locked_job]
24+
end
25+
end
26+
27+
describe ".not_locked" do
28+
subject(:not_locked_jobs) { Delayed::Job.not_locked }
29+
30+
let!(:not_locked_job) { Delayed::Job.create(payload_object: SimpleJob.new) }
31+
let!(:locked_job) { Delayed::Job.create(payload_object: SimpleJob.new) }
32+
33+
before { locked_job.send(:lock_exclusively!, "worker-123") }
34+
35+
it "only includes not locked jobs" do
36+
expect(not_locked_jobs).to eq [not_locked_job]
37+
end
38+
end
39+
40+
describe ".prefetched" do
41+
subject(:prefetched_jobs) { Delayed::Job.prefetched }
42+
43+
let!(:not_prefetched_job) { Delayed::Job.create(payload_object: SimpleJob.new) }
44+
let!(:prefetched_job) { Delayed::Job.create(payload_object: SimpleJob.new) }
45+
46+
before { prefetched_job.update!(locked_by: "prefetch:worker-123") }
47+
48+
it "only includes prefetched jobs" do
49+
expect(prefetched_jobs).to eq [prefetched_job]
50+
end
51+
end
52+
1453
it "recovers as well as possible from a failure failing a job" do
1554
allow(Delayed::Job::Failed).to receive(:create).and_raise(RuntimeError)
1655
job = "test".delay(ignore_transaction: true).reverse

0 commit comments

Comments
 (0)