sidekiq 3.5.0 → 3.5.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/COMM-LICENSE +1 -1
- data/Changes.md +9 -1
- data/Ent-Changes.md +14 -0
- data/Gemfile +1 -0
- data/Pro-Changes.md +12 -1
- data/bin/sidekiqload +153 -0
- data/lib/sidekiq.rb +13 -3
- data/lib/sidekiq/cli.rb +10 -10
- data/lib/sidekiq/manager.rb +1 -1
- data/lib/sidekiq/middleware/server/retry_jobs.rb +1 -1
- data/lib/sidekiq/processor.rb +14 -8
- data/lib/sidekiq/testing.rb +14 -5
- data/lib/sidekiq/version.rb +1 -1
- data/sidekiq.gemspec +1 -1
- data/test/test_api.rb +39 -50
- data/test/test_cli.rb +3 -57
- data/test/test_client.rb +60 -135
- data/test/test_extensions.rb +29 -23
- data/test/test_logging.rb +1 -1
- data/test/test_manager.rb +0 -1
- data/test/test_processor.rb +102 -31
- data/test/test_rails.rb +0 -2
- data/test/test_redis_connection.rb +0 -1
- data/test/test_retry.rb +85 -171
- data/test/test_scheduled.rb +7 -13
- data/test/test_scheduling.rb +20 -42
- data/test/test_sidekiq.rb +30 -18
- data/test/test_testing.rb +80 -20
- data/test/test_testing_fake.rb +4 -7
- data/test/test_testing_inline.rb +3 -3
- data/test/test_util.rb +0 -2
- data/test/test_web.rb +9 -2
- data/test/test_web_helpers.rb +3 -2
- data/web/locales/{no.yml → nb.yml} +10 -2
- data/web/locales/uk.yml +76 -0
- metadata +8 -6
data/test/test_logging.rb
CHANGED
data/test/test_manager.rb
CHANGED
data/test/test_processor.rb
CHANGED
@@ -10,8 +10,6 @@ class TestProcessor < Sidekiq::Test
|
|
10
10
|
$invokes = 0
|
11
11
|
@boss = Minitest::Mock.new
|
12
12
|
@processor = ::Sidekiq::Processor.new(@boss)
|
13
|
-
Celluloid.logger = nil
|
14
|
-
Sidekiq.redis = REDIS
|
15
13
|
end
|
16
14
|
|
17
15
|
class MockWorker
|
@@ -88,23 +86,112 @@ class TestProcessor < Sidekiq::Test
|
|
88
86
|
assert_equal [['myarg']], msg['args']
|
89
87
|
end
|
90
88
|
|
91
|
-
describe '
|
89
|
+
describe 'acknowledgement' do
|
90
|
+
class ExceptionRaisingMiddleware
|
91
|
+
def initialize(raise_before_yield, raise_after_yield, skip)
|
92
|
+
@raise_before_yield = raise_before_yield
|
93
|
+
@raise_after_yield = raise_after_yield
|
94
|
+
@skip = skip
|
95
|
+
end
|
96
|
+
|
97
|
+
def call(worker, item, queue)
|
98
|
+
raise TEST_EXCEPTION if @raise_before_yield
|
99
|
+
yield unless @skip
|
100
|
+
raise TEST_EXCEPTION if @raise_after_yield
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
let(:raise_before_yield) { false }
|
105
|
+
let(:raise_after_yield) { false }
|
106
|
+
let(:skip_job) { false }
|
107
|
+
let(:worker_args) { ['myarg'] }
|
108
|
+
let(:work) { MiniTest::Mock.new }
|
109
|
+
let(:actor) { Minitest::Mock.new }
|
110
|
+
|
92
111
|
before do
|
93
|
-
|
112
|
+
work.expect(:queue_name, 'queues:default')
|
113
|
+
work.expect(:message, Sidekiq.dump_json({ 'class' => MockWorker.to_s, 'args' => worker_args }))
|
114
|
+
Sidekiq.server_middleware do |chain|
|
115
|
+
chain.prepend ExceptionRaisingMiddleware, raise_before_yield, raise_after_yield, skip_job
|
116
|
+
end
|
117
|
+
|
118
|
+
actor.expect(:real_thread, nil, [nil, Thread])
|
119
|
+
@boss.expect(:async, actor, [])
|
120
|
+
end
|
121
|
+
|
122
|
+
after do
|
123
|
+
Sidekiq.server_middleware do |chain|
|
124
|
+
chain.remove ExceptionRaisingMiddleware
|
125
|
+
end
|
126
|
+
work.verify
|
127
|
+
end
|
128
|
+
|
129
|
+
describe 'middleware throws an exception before processing the work' do
|
130
|
+
let(:raise_before_yield) { true }
|
131
|
+
|
132
|
+
it 'does not ack' do
|
133
|
+
begin
|
134
|
+
@processor.process(work)
|
135
|
+
flunk "Expected #process to raise exception"
|
136
|
+
rescue TestException
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe 'middleware throws an exception after processing the work' do
|
142
|
+
let(:raise_after_yield) { true }
|
143
|
+
|
144
|
+
it 'acks the job' do
|
145
|
+
work.expect(:acknowledge, nil)
|
146
|
+
begin
|
147
|
+
@processor.process(work)
|
148
|
+
flunk "Expected #process to raise exception"
|
149
|
+
rescue TestException
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe 'middleware decides to skip work' do
|
155
|
+
let(:skip_job) { true }
|
156
|
+
|
157
|
+
it 'acks the job' do
|
158
|
+
work.expect(:acknowledge, nil)
|
159
|
+
@boss.expect(:async, actor, [])
|
160
|
+
actor.expect(:processor_done, nil, [@processor])
|
161
|
+
@processor.process(work)
|
162
|
+
end
|
94
163
|
end
|
95
164
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
165
|
+
describe 'worker raises an exception' do
|
166
|
+
let(:worker_args) { ['boom'] }
|
167
|
+
|
168
|
+
it 'acks the job' do
|
169
|
+
work.expect(:acknowledge, nil)
|
170
|
+
begin
|
171
|
+
@processor.process(work)
|
172
|
+
flunk "Expected #process to raise exception"
|
173
|
+
rescue TestException
|
174
|
+
end
|
103
175
|
end
|
104
176
|
end
|
105
177
|
|
178
|
+
describe 'everything goes well' do
|
179
|
+
it 'acks the job' do
|
180
|
+
work.expect(:acknowledge, nil)
|
181
|
+
@boss.expect(:async, actor, [])
|
182
|
+
actor.expect(:processor_done, nil, [@processor])
|
183
|
+
@processor.process(work)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe 'stats' do
|
189
|
+
before do
|
190
|
+
Sidekiq.redis {|c| c.flushdb }
|
191
|
+
end
|
192
|
+
|
106
193
|
describe 'when successful' do
|
107
|
-
let(:processed_today_key) { "stat:processed:#{Time.now.utc.
|
194
|
+
let(:processed_today_key) { "stat:processed:#{Time.now.utc.strftime("%Y-%m-%d")}" }
|
108
195
|
|
109
196
|
def successful_job
|
110
197
|
msg = Sidekiq.dump_json({ 'class' => MockWorker.to_s, 'args' => ['myarg'] })
|
@@ -117,23 +204,15 @@ class TestProcessor < Sidekiq::Test
|
|
117
204
|
end
|
118
205
|
|
119
206
|
it 'increments processed stat' do
|
207
|
+
assert_equal 0, Sidekiq::Stats.new.processed
|
120
208
|
successful_job
|
121
209
|
assert_equal 1, Sidekiq::Stats.new.processed
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'expires processed stat' do
|
125
|
-
successful_job
|
126
210
|
assert_equal Sidekiq::Processor::STATS_TIMEOUT, Sidekiq.redis { |conn| conn.ttl(processed_today_key) }
|
127
211
|
end
|
128
|
-
|
129
|
-
it 'increments date processed stat' do
|
130
|
-
successful_job
|
131
|
-
assert_equal 1, Sidekiq.redis { |conn| conn.get(processed_today_key) }.to_i
|
132
|
-
end
|
133
212
|
end
|
134
213
|
|
135
214
|
describe 'when failed' do
|
136
|
-
let(:failed_today_key) { "stat:failed:#{Time.now.utc.
|
215
|
+
let(:failed_today_key) { "stat:failed:#{Time.now.utc.strftime("%Y-%m-%d")}" }
|
137
216
|
|
138
217
|
def failed_job
|
139
218
|
actor = Minitest::Mock.new
|
@@ -147,17 +226,9 @@ class TestProcessor < Sidekiq::Test
|
|
147
226
|
end
|
148
227
|
|
149
228
|
it 'increments failed stat' do
|
229
|
+
assert_equal 0, Sidekiq::Stats.new.failed
|
150
230
|
failed_job
|
151
231
|
assert_equal 1, Sidekiq::Stats.new.failed
|
152
|
-
end
|
153
|
-
|
154
|
-
it 'increments date failed stat' do
|
155
|
-
failed_job
|
156
|
-
assert_equal 1, Sidekiq.redis { |conn| conn.get(failed_today_key) }.to_i
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'expires failed stat' do
|
160
|
-
failed_job
|
161
232
|
assert_equal Sidekiq::Processor::STATS_TIMEOUT, Sidekiq.redis { |conn| conn.ttl(failed_today_key) }
|
162
233
|
end
|
163
234
|
end
|
data/test/test_rails.rb
CHANGED
data/test/test_retry.rb
CHANGED
@@ -5,175 +5,136 @@ require 'sidekiq/middleware/server/retry_jobs'
|
|
5
5
|
|
6
6
|
class TestRetry < Sidekiq::Test
|
7
7
|
describe 'middleware' do
|
8
|
+
class SomeWorker
|
9
|
+
include Sidekiq::Worker
|
10
|
+
end
|
11
|
+
|
8
12
|
before do
|
9
|
-
|
10
|
-
|
11
|
-
Sidekiq.instance_variable_set(:@redis, @redis)
|
13
|
+
Sidekiq.redis {|c| c.flushdb }
|
14
|
+
end
|
12
15
|
|
13
|
-
|
14
|
-
|
16
|
+
def worker
|
17
|
+
@worker ||= SomeWorker.new
|
15
18
|
end
|
16
19
|
|
17
|
-
|
18
|
-
Sidekiq.
|
20
|
+
def handler(options={})
|
21
|
+
@handler ||= Sidekiq::Middleware::Server::RetryJobs.new(options)
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
include ::Sidekiq::Worker
|
24
|
-
end
|
24
|
+
def job(options={})
|
25
|
+
@job ||= { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true }.merge(options)
|
25
26
|
end
|
26
27
|
|
27
28
|
it 'allows disabling retry' do
|
28
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => false }
|
29
|
-
msg2 = msg.dup
|
30
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
31
29
|
assert_raises RuntimeError do
|
32
|
-
handler.call(worker,
|
30
|
+
handler.call(worker, job('retry' => false), 'default') do
|
33
31
|
raise "kerblammo!"
|
34
32
|
end
|
35
33
|
end
|
36
|
-
assert_equal
|
34
|
+
assert_equal 0, Sidekiq::RetrySet.new.size
|
37
35
|
end
|
38
36
|
|
39
37
|
it 'allows a numeric retry' do
|
40
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
41
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => 2 }
|
42
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
43
38
|
assert_raises RuntimeError do
|
44
|
-
handler.call(worker,
|
39
|
+
handler.call(worker, job('retry' => 2), 'default') do
|
45
40
|
raise "kerblammo!"
|
46
41
|
end
|
47
42
|
end
|
48
|
-
|
49
|
-
assert_equal
|
50
|
-
@redis.verify
|
43
|
+
assert_equal 1, Sidekiq::RetrySet.new.size
|
44
|
+
assert_equal 0, Sidekiq::DeadSet.new.size
|
51
45
|
end
|
52
46
|
|
53
47
|
it 'allows 0 retry => no retry and dead queue' do
|
54
|
-
@redis.expect :zadd, 1, ['dead', Float, String]
|
55
|
-
@redis.expect :zremrangebyscore, 0, ['dead', String, Float]
|
56
|
-
@redis.expect :zremrangebyrank, 0, ['dead', Numeric, Numeric]
|
57
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => 0 }
|
58
|
-
msg2 = msg.dup
|
59
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
60
48
|
assert_raises RuntimeError do
|
61
|
-
handler.call(worker,
|
49
|
+
handler.call(worker, job('retry' => 0), 'default') do
|
62
50
|
raise "kerblammo!"
|
63
51
|
end
|
64
52
|
end
|
65
|
-
|
66
|
-
|
67
|
-
assert_equal expected, msg
|
68
|
-
@redis.verify # not called
|
53
|
+
assert_equal 0, Sidekiq::RetrySet.new.size
|
54
|
+
assert_equal 1, Sidekiq::DeadSet.new.size
|
69
55
|
end
|
70
56
|
|
71
57
|
it 'handles zany characters in error message, #1705' do
|
72
58
|
skip 'skipped! test requires ruby 2.1+' if RUBY_VERSION <= '2.1.0'
|
73
|
-
|
74
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => 2 }
|
75
|
-
msg2 = msg.dup
|
76
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
59
|
+
|
77
60
|
assert_raises RuntimeError do
|
78
|
-
handler.call(worker,
|
61
|
+
handler.call(worker, job, 'default') do
|
79
62
|
raise "kerblammo! #{195.chr}"
|
80
63
|
end
|
81
64
|
end
|
82
|
-
|
83
|
-
assert_equal({"class"=>"Bob", "args"=>[1, 2, "foo"], "retry"=>2, "queue"=>"default", "error_message"=>"kerblammo! �", "error_class"=>"RuntimeError", "retry_count"=>0}, msg2)
|
84
|
-
@redis.verify
|
65
|
+
assert_equal "kerblammo! �", job["error_message"]
|
85
66
|
end
|
86
67
|
|
87
68
|
|
88
69
|
it 'allows a max_retries option in initializer' do
|
89
70
|
max_retries = 7
|
90
|
-
1.upto(max_retries) do
|
91
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
92
|
-
end
|
93
|
-
@redis.expect :zadd, 1, ['dead', Float, String]
|
94
|
-
@redis.expect :zremrangebyscore, 0, ['dead', String, Float]
|
95
|
-
@redis.expect :zremrangebyrank, 0, ['dead', Numeric, Numeric]
|
96
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true }
|
97
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new({:max_retries => max_retries})
|
98
71
|
1.upto(max_retries + 1) do
|
99
72
|
assert_raises RuntimeError do
|
100
|
-
handler.call(worker,
|
73
|
+
handler(:max_retries => max_retries).call(worker, job, 'default') do
|
101
74
|
raise "kerblammo!"
|
102
75
|
end
|
103
76
|
end
|
104
77
|
end
|
105
|
-
|
78
|
+
|
79
|
+
assert_equal max_retries, Sidekiq::RetrySet.new.size
|
80
|
+
assert_equal 1, Sidekiq::DeadSet.new.size
|
106
81
|
end
|
107
82
|
|
108
83
|
it 'saves backtraces' do
|
109
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
110
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true, 'backtrace' => true }
|
111
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
112
84
|
c = nil
|
113
85
|
assert_raises RuntimeError do
|
114
|
-
handler.call(worker,
|
86
|
+
handler.call(worker, job('backtrace' => true), 'default') do
|
115
87
|
c = caller(0); raise "kerblammo!"
|
116
88
|
end
|
117
89
|
end
|
118
|
-
assert
|
119
|
-
assert_equal c[0],
|
120
|
-
@redis.verify
|
90
|
+
assert job["error_backtrace"]
|
91
|
+
assert_equal c[0], job["error_backtrace"][0]
|
121
92
|
end
|
122
93
|
|
123
94
|
it 'saves partial backtraces' do
|
124
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
125
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true, 'backtrace' => 3 }
|
126
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
127
95
|
c = nil
|
128
96
|
assert_raises RuntimeError do
|
129
|
-
handler.call(worker,
|
97
|
+
handler.call(worker, job('backtrace' => 3), 'default') do
|
130
98
|
c = caller(0)[0...3]; raise "kerblammo!"
|
131
99
|
end
|
132
100
|
end
|
133
|
-
assert
|
134
|
-
assert_equal c,
|
101
|
+
assert job["error_backtrace"]
|
102
|
+
assert_equal c, job["error_backtrace"]
|
135
103
|
assert_equal 3, c.size
|
136
|
-
assert_equal 3, msg["error_backtrace"].size
|
137
104
|
end
|
138
105
|
|
139
106
|
it 'handles a new failed message' do
|
140
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
141
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true }
|
142
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
143
107
|
assert_raises RuntimeError do
|
144
|
-
handler.call(worker,
|
108
|
+
handler.call(worker, job, 'default') do
|
145
109
|
raise "kerblammo!"
|
146
110
|
end
|
147
111
|
end
|
148
|
-
assert_equal 'default',
|
149
|
-
assert_equal 'kerblammo!',
|
150
|
-
assert_equal 'RuntimeError',
|
151
|
-
assert_equal 0,
|
152
|
-
refute
|
153
|
-
assert
|
154
|
-
@redis.verify
|
112
|
+
assert_equal 'default', job["queue"]
|
113
|
+
assert_equal 'kerblammo!', job["error_message"]
|
114
|
+
assert_equal 'RuntimeError', job["error_class"]
|
115
|
+
assert_equal 0, job["retry_count"]
|
116
|
+
refute job["error_backtrace"]
|
117
|
+
assert job["failed_at"]
|
155
118
|
end
|
156
119
|
|
157
120
|
it 'shuts down without retrying work-in-progress, which will resume' do
|
158
|
-
|
121
|
+
rs = Sidekiq::RetrySet.new
|
122
|
+
assert_equal 0, rs.size
|
159
123
|
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true }
|
160
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
161
124
|
assert_raises Sidekiq::Shutdown do
|
162
125
|
handler.call(worker, msg, 'default') do
|
163
126
|
raise Sidekiq::Shutdown
|
164
127
|
end
|
165
128
|
end
|
166
|
-
|
167
|
-
@redis.verify
|
168
|
-
end
|
129
|
+
assert_equal 0, rs.size
|
169
130
|
end
|
170
131
|
|
171
132
|
it 'shuts down cleanly when shutdown causes exception' do
|
172
133
|
skip('Not supported in Ruby < 2.1.0') if RUBY_VERSION < '2.1.0'
|
173
134
|
|
174
|
-
|
135
|
+
rs = Sidekiq::RetrySet.new
|
136
|
+
assert_equal 0, rs.size
|
175
137
|
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true }
|
176
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
177
138
|
assert_raises Sidekiq::Shutdown do
|
178
139
|
handler.call(worker, msg, 'default') do
|
179
140
|
begin
|
@@ -183,19 +144,16 @@ class TestRetry < Sidekiq::Test
|
|
183
144
|
end
|
184
145
|
end
|
185
146
|
end
|
186
|
-
|
187
|
-
@redis.verify
|
188
|
-
end
|
147
|
+
assert_equal 0, rs.size
|
189
148
|
end
|
190
149
|
|
191
150
|
it 'shuts down cleanly when shutdown causes chained exceptions' do
|
192
151
|
skip('Not supported in Ruby < 2.1.0') if RUBY_VERSION < '2.1.0'
|
193
152
|
|
194
|
-
|
195
|
-
|
196
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
153
|
+
rs = Sidekiq::RetrySet.new
|
154
|
+
assert_equal 0, rs.size
|
197
155
|
assert_raises Sidekiq::Shutdown do
|
198
|
-
handler.call(worker,
|
156
|
+
handler.call(worker, job, 'default') do
|
199
157
|
begin
|
200
158
|
raise Sidekiq::Shutdown
|
201
159
|
rescue Interrupt
|
@@ -207,93 +165,55 @@ class TestRetry < Sidekiq::Test
|
|
207
165
|
end
|
208
166
|
end
|
209
167
|
end
|
210
|
-
|
211
|
-
@redis.verify
|
212
|
-
end
|
168
|
+
assert_equal 0, rs.size
|
213
169
|
end
|
214
170
|
|
215
171
|
it 'allows a retry queue' do
|
216
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
217
|
-
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true, 'retry_queue' => 'retry' }
|
218
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
219
172
|
assert_raises RuntimeError do
|
220
|
-
handler.call(worker,
|
173
|
+
handler.call(worker, job("retry_queue" => 'retryx'), 'default') do
|
221
174
|
raise "kerblammo!"
|
222
175
|
end
|
223
176
|
end
|
224
|
-
assert_equal '
|
225
|
-
assert_equal 'kerblammo!',
|
226
|
-
assert_equal 'RuntimeError',
|
227
|
-
assert_equal 0,
|
228
|
-
refute
|
229
|
-
assert
|
230
|
-
@redis.verify
|
177
|
+
assert_equal 'retryx', job["queue"]
|
178
|
+
assert_equal 'kerblammo!', job["error_message"]
|
179
|
+
assert_equal 'RuntimeError', job["error_class"]
|
180
|
+
assert_equal 0, job["retry_count"]
|
181
|
+
refute job["error_backtrace"]
|
182
|
+
assert job["failed_at"]
|
231
183
|
end
|
232
184
|
|
233
185
|
it 'handles a recurring failed message' do
|
234
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
235
186
|
now = Time.now.to_f
|
236
|
-
msg = {"
|
237
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
187
|
+
msg = {"queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry_count"=>10}
|
238
188
|
assert_raises RuntimeError do
|
239
|
-
handler.call(worker, msg, 'default') do
|
189
|
+
handler.call(worker, job(msg), 'default') do
|
240
190
|
raise "kerblammo!"
|
241
191
|
end
|
242
192
|
end
|
243
|
-
assert_equal 'default',
|
244
|
-
assert_equal 'kerblammo!',
|
245
|
-
assert_equal 'RuntimeError',
|
246
|
-
assert_equal 11,
|
247
|
-
assert
|
248
|
-
@redis.verify
|
249
|
-
end
|
250
|
-
|
251
|
-
it 'handles a recurring failed message before reaching user-specifed max' do
|
252
|
-
@redis.expect :zadd, 1, ['retry', String, String]
|
253
|
-
now = Time.now.to_f
|
254
|
-
msg = {"class"=>"Bob", "args"=>[1, 2, "foo"], 'retry' => 10, "queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry_count"=>8}
|
255
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
256
|
-
assert_raises RuntimeError do
|
257
|
-
handler.call(worker, msg, 'default') do
|
258
|
-
raise "kerblammo!"
|
259
|
-
end
|
260
|
-
end
|
261
|
-
assert_equal 'default', msg["queue"]
|
262
|
-
assert_equal 'kerblammo!', msg["error_message"]
|
263
|
-
assert_equal 'RuntimeError', msg["error_class"]
|
264
|
-
assert_equal 9, msg["retry_count"]
|
265
|
-
assert msg["failed_at"]
|
266
|
-
@redis.verify
|
193
|
+
assert_equal 'default', job["queue"]
|
194
|
+
assert_equal 'kerblammo!', job["error_message"]
|
195
|
+
assert_equal 'RuntimeError', job["error_class"]
|
196
|
+
assert_equal 11, job["retry_count"]
|
197
|
+
assert job["failed_at"]
|
267
198
|
end
|
268
199
|
|
269
200
|
it 'throws away old messages after too many retries (using the default)' do
|
201
|
+
q = Sidekiq::Queue.new
|
202
|
+
rs = Sidekiq::RetrySet.new
|
203
|
+
ds = Sidekiq::DeadSet.new
|
204
|
+
assert_equal 0, q.size
|
205
|
+
assert_equal 0, rs.size
|
206
|
+
assert_equal 0, ds.size
|
270
207
|
now = Time.now.to_f
|
271
|
-
msg = {"
|
272
|
-
@redis.expect :zadd, 1, ['dead', Float, String]
|
273
|
-
@redis.expect :zremrangebyscore, 0, ['dead', String, Float]
|
274
|
-
@redis.expect :zremrangebyrank, 0, ['dead', Numeric, Numeric]
|
275
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
276
|
-
assert_raises RuntimeError do
|
277
|
-
handler.call(worker, msg, 'default') do
|
278
|
-
raise "kerblammo!"
|
279
|
-
end
|
280
|
-
end
|
281
|
-
@redis.verify
|
282
|
-
end
|
283
|
-
|
284
|
-
it 'throws away old messages after too many retries (using user-specified max)' do
|
285
|
-
now = Time.now.to_f
|
286
|
-
msg = {"class"=>"Bob", "args"=>[1, 2, "foo"], "queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry"=>3, "retry_count"=>3}
|
287
|
-
@redis.expect :zadd, 1, ['dead', Float, String]
|
288
|
-
@redis.expect :zremrangebyscore, 0, ['dead', String, Float]
|
289
|
-
@redis.expect :zremrangebyrank, 0, ['dead', Numeric, Numeric]
|
290
|
-
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
208
|
+
msg = {"queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry_count"=>25}
|
291
209
|
assert_raises RuntimeError do
|
292
|
-
handler.call(worker, msg, 'default') do
|
210
|
+
handler.call(worker, job(msg), 'default') do
|
293
211
|
raise "kerblammo!"
|
294
212
|
end
|
295
213
|
end
|
296
|
-
|
214
|
+
assert_equal 0, q.size
|
215
|
+
assert_equal 0, rs.size
|
216
|
+
assert_equal 1, ds.size
|
297
217
|
end
|
298
218
|
|
299
219
|
describe "custom retry delay" do
|
@@ -309,38 +229,32 @@ class TestRetry < Sidekiq::Test
|
|
309
229
|
File.unlink @tmp_log_path if File.exist?(@tmp_log_path)
|
310
230
|
end
|
311
231
|
|
312
|
-
|
313
|
-
|
314
|
-
include ::Sidekiq::Worker
|
232
|
+
class CustomWorker
|
233
|
+
include Sidekiq::Worker
|
315
234
|
|
316
|
-
|
317
|
-
|
318
|
-
end
|
235
|
+
sidekiq_retry_in do |count|
|
236
|
+
count * 2
|
319
237
|
end
|
320
238
|
end
|
321
239
|
|
322
|
-
|
323
|
-
|
324
|
-
include ::Sidekiq::Worker
|
240
|
+
class ErrorWorker
|
241
|
+
include Sidekiq::Worker
|
325
242
|
|
326
|
-
|
327
|
-
|
328
|
-
end
|
243
|
+
sidekiq_retry_in do |count|
|
244
|
+
count / 0
|
329
245
|
end
|
330
246
|
end
|
331
247
|
|
332
|
-
let(:handler) { Sidekiq::Middleware::Server::RetryJobs.new }
|
333
|
-
|
334
248
|
it "retries with a default delay" do
|
335
249
|
refute_equal 4, handler.__send__(:delay_for, worker, 2)
|
336
250
|
end
|
337
251
|
|
338
252
|
it "retries with a custom delay" do
|
339
|
-
assert_equal 4, handler.__send__(:delay_for,
|
253
|
+
assert_equal 4, handler.__send__(:delay_for, CustomWorker, 2)
|
340
254
|
end
|
341
255
|
|
342
256
|
it "falls back to the default retry on exception" do
|
343
|
-
refute_equal 4, handler.__send__(:delay_for,
|
257
|
+
refute_equal 4, handler.__send__(:delay_for, ErrorWorker, 2)
|
344
258
|
assert_match(/Failure scheduling retry using the defined `sidekiq_retry_in`/,
|
345
259
|
File.read(@tmp_log_path), 'Log entry missing for sidekiq_retry_in')
|
346
260
|
end
|