talentbox-delayed_job_sequel 4.2.1 → 4.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/delayed/backend/sequel.rb +24 -1
- data/spec/delayed/backend/sequel_spec.rb +17 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1852e994414af80378eb9b6dc43f5d0896f5efc
|
4
|
+
data.tar.gz: 5dea3af8a408fdaae2999522b58c39b2be0d59a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d4ece1d72b8cd5325918caa63a71cb06e69ace258c8a1da3ac04a06ba93833fd6748ea156cbe7f944f600aa602afd19d00b1d527821950369ec004f3d010feb
|
7
|
+
data.tar.gz: 728f1b030ff5a21aece61a2da07edb9ca1502301381f5c03465680c33f5fdd30ffdd354ac5b18d902ff02658c5d7a34b4cd17606460de343923d9ad63acb2f9d
|
data/README.md
CHANGED
@@ -44,14 +44,28 @@ module Delayed
|
|
44
44
|
filter(:locked_by => worker_name).update(:locked_by => nil, :locked_at => nil)
|
45
45
|
end
|
46
46
|
|
47
|
+
# adapted from
|
48
|
+
# https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb
|
47
49
|
def self.reserve(worker, max_run_time = Worker.max_run_time)
|
48
50
|
ds = ready_to_run(worker.name, max_run_time)
|
51
|
+
|
49
52
|
ds = ds.filter(::Sequel.lit("priority >= ?", Worker.min_priority)) if Worker.min_priority
|
50
53
|
ds = ds.filter(::Sequel.lit("priority <= ?", Worker.max_priority)) if Worker.max_priority
|
51
54
|
ds = ds.filter(:queue => Worker.queues) if Worker.queues.any?
|
52
55
|
ds = ds.by_priority
|
53
|
-
ds = ds.for_update
|
54
56
|
|
57
|
+
case ::Sequel::Model.db.database_type
|
58
|
+
when :mysql
|
59
|
+
lock_with_read_ahead(ds, worker)
|
60
|
+
else
|
61
|
+
lock_with_for_update(ds, worker)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Lock a single job using SELECT ... FOR UPDATE.
|
66
|
+
# More performant but may cause deadlocks in some databases.
|
67
|
+
def self.lock_with_for_update(ds, worker)
|
68
|
+
ds = ds.for_update
|
55
69
|
db.transaction do
|
56
70
|
if job = ds.first
|
57
71
|
job.locked_at = self.db_time_now
|
@@ -62,6 +76,15 @@ module Delayed
|
|
62
76
|
end
|
63
77
|
end
|
64
78
|
|
79
|
+
# Fetch up-to `worker.read_ahead` jobs, try to lock one at a time.
|
80
|
+
# This query is more conservative as it does not acquire any DB read locks.
|
81
|
+
def self.lock_with_read_ahead(ds, worker)
|
82
|
+
ds.limit(worker.read_ahead).detect do |job|
|
83
|
+
count = ds.where(id: job.id).update(locked_at: self.db_time_now, locked_by: worker.name)
|
84
|
+
count == 1 && job.reload
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
65
88
|
# Get the current time (GMT or local depending on DB)
|
66
89
|
# Note: This does not ping the DB to get the time, so all your clients
|
67
90
|
# must have syncronized clocks.
|
@@ -14,20 +14,33 @@ describe Delayed::Backend::Sequel::Job do
|
|
14
14
|
|
15
15
|
it "does not allow more than 1 worker to grab the same job" do
|
16
16
|
expect do
|
17
|
-
|
17
|
+
jobs_to_run = 200
|
18
|
+
workers_to_run = 20
|
19
|
+
jobs_per_worker = jobs_to_run/workers_to_run
|
20
|
+
|
21
|
+
jobs_to_run.times do
|
18
22
|
described_class.create(payload_object: SimpleJob.new)
|
19
23
|
end
|
20
24
|
|
21
|
-
|
25
|
+
workers_to_run.times.map do |i|
|
22
26
|
Thread.new do
|
23
27
|
worker = Delayed::Worker.new
|
24
28
|
worker.name = "worker_#{i}"
|
25
|
-
|
29
|
+
|
30
|
+
# Ensure each worker performs the expected number of jobs as
|
31
|
+
# `work_off` will ocassionally perform less than the requested number
|
32
|
+
# if it is unable to lock a job within the `worker.read_ahead` limit
|
33
|
+
jobs_completed_by_this_worker = 0
|
34
|
+
while jobs_completed_by_this_worker < jobs_per_worker do
|
35
|
+
successes, failures = worker.work_off(jobs_per_worker - jobs_completed_by_this_worker)
|
36
|
+
expect(failures).to eq(0), "Expected zero failures, got #{failures}"
|
37
|
+
jobs_completed_by_this_worker += successes
|
38
|
+
end
|
26
39
|
end
|
27
40
|
end.map(&:join)
|
28
41
|
end.not_to raise_error
|
29
42
|
|
30
|
-
expect(Delayed::Job.count).to
|
43
|
+
expect(Delayed::Job.count).to eql 0
|
31
44
|
end
|
32
45
|
|
33
46
|
context ".count" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: talentbox-delayed_job_sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Tron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
127
|
version: '0'
|
128
128
|
requirements: []
|
129
129
|
rubyforge_project:
|
130
|
-
rubygems_version: 2.5.
|
130
|
+
rubygems_version: 2.5.2
|
131
131
|
signing_key:
|
132
132
|
specification_version: 4
|
133
133
|
summary: Sequel backend for DelayedJob
|