sidekiq 4.2.10 → 5.0.0.beta1

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.

Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/issue_template.md +1 -6
  3. data/.gitignore +1 -0
  4. data/5.0-Upgrade.md +52 -0
  5. data/Changes.md +14 -6
  6. data/Ent-Changes.md +1 -2
  7. data/Pro-Changes.md +1 -19
  8. data/README.md +2 -2
  9. data/bin/sidekiqctl +1 -1
  10. data/bin/sidekiqload +14 -19
  11. data/lib/sidekiq.rb +3 -12
  12. data/lib/sidekiq/api.rb +30 -31
  13. data/lib/sidekiq/cli.rb +12 -5
  14. data/lib/sidekiq/delay.rb +21 -0
  15. data/lib/sidekiq/extensions/generic_proxy.rb +7 -1
  16. data/lib/sidekiq/job_logger.rb +36 -0
  17. data/lib/sidekiq/job_retry.rb +232 -0
  18. data/lib/sidekiq/launcher.rb +1 -7
  19. data/lib/sidekiq/middleware/server/active_record.rb +9 -0
  20. data/lib/sidekiq/processor.rb +63 -29
  21. data/lib/sidekiq/rails.rb +2 -65
  22. data/lib/sidekiq/testing.rb +0 -6
  23. data/lib/sidekiq/version.rb +1 -1
  24. data/lib/sidekiq/web/application.rb +1 -1
  25. data/lib/sidekiq/web/helpers.rb +1 -2
  26. data/sidekiq.gemspec +2 -2
  27. data/test/config.yml +9 -0
  28. data/test/env_based_config.yml +11 -0
  29. data/test/fake_env.rb +1 -0
  30. data/test/fixtures/en.yml +2 -0
  31. data/test/helper.rb +98 -0
  32. data/test/test_actors.rb +138 -0
  33. data/test/test_api.rb +529 -0
  34. data/test/test_cli.rb +418 -0
  35. data/test/test_client.rb +266 -0
  36. data/test/test_exception_handler.rb +56 -0
  37. data/test/test_extensions.rb +115 -0
  38. data/test/test_fetch.rb +50 -0
  39. data/test/test_launcher.rb +92 -0
  40. data/test/test_logging.rb +35 -0
  41. data/test/test_manager.rb +50 -0
  42. data/test/test_middleware.rb +158 -0
  43. data/test/test_processor.rb +266 -0
  44. data/test/test_rails.rb +22 -0
  45. data/test/test_redis_connection.rb +132 -0
  46. data/test/test_retry.rb +335 -0
  47. data/test/test_retry_exhausted.rb +149 -0
  48. data/test/test_scheduled.rb +115 -0
  49. data/test/test_scheduling.rb +58 -0
  50. data/test/test_sidekiq.rb +107 -0
  51. data/test/test_testing.rb +135 -0
  52. data/test/test_testing_fake.rb +352 -0
  53. data/test/test_testing_inline.rb +93 -0
  54. data/test/test_util.rb +13 -0
  55. data/test/test_web.rb +638 -0
  56. data/test/test_web_auth.rb +54 -0
  57. data/test/test_web_helpers.rb +54 -0
  58. data/test/test_web_sessions.rb +67 -0
  59. data/web/assets/javascripts/dashboard.js +1 -1
  60. data/web/views/_job_info.erb +1 -1
  61. data/web/views/dashboard.erb +2 -2
  62. data/web/views/morgue.erb +0 -2
  63. data/web/views/queue.erb +1 -1
  64. data/web/views/retry.erb +1 -1
  65. metadata +73 -8
  66. data/lib/sidekiq/middleware/server/logging.rb +0 -31
  67. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  68. data/web/locales/fa.yml +0 -79
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+ require_relative 'helper'
4
+ require 'sidekiq/web'
5
+ require 'rack/test'
6
+
7
+ class TestWebAuth < Sidekiq::Test
8
+ describe 'sidekiq web with basic auth' do
9
+ include Rack::Test::Methods
10
+
11
+ def app
12
+ app = Sidekiq::Web.new
13
+ app.use(Rack::Auth::Basic) { |user, pass| user == "a" && pass == "b" }
14
+
15
+ app
16
+ end
17
+
18
+ it 'requires basic authentication' do
19
+ get '/'
20
+
21
+ assert_equal 401, last_response.status
22
+ refute_nil last_response.header["WWW-Authenticate"]
23
+ end
24
+
25
+ it 'authenticates successfuly' do
26
+ basic_authorize 'a', 'b'
27
+
28
+ get '/'
29
+
30
+ assert_equal 200, last_response.status
31
+ end
32
+ end
33
+
34
+ describe 'sidekiq web with custom session' do
35
+ include Rack::Test::Methods
36
+
37
+ def app
38
+ app = Sidekiq::Web.new
39
+
40
+ app.use Rack::Session::Cookie, secret: 'v3rys3cr31', host: 'nicehost.org'
41
+
42
+ app
43
+ end
44
+
45
+ it 'requires basic authentication' do
46
+ get '/'
47
+
48
+ session_options = last_request.env['rack.session'].options
49
+
50
+ assert_equal 'v3rys3cr31', session_options[:secret]
51
+ assert_equal 'nicehost.org', session_options[:host]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'helper'
3
+
4
+ class TestWebHelpers < Sidekiq::Test
5
+
6
+ class Helpers
7
+ include Sidekiq::WebHelpers
8
+
9
+ def initialize(params={})
10
+ @thehash = default.merge(params)
11
+ end
12
+
13
+ def request
14
+ self
15
+ end
16
+
17
+ def settings
18
+ self
19
+ end
20
+
21
+ def locales
22
+ ['web/locales']
23
+ end
24
+
25
+ def env
26
+ @thehash
27
+ end
28
+
29
+ def default
30
+ {
31
+ }
32
+ end
33
+ end
34
+
35
+ def test_locale_determination
36
+ obj = Helpers.new
37
+ assert_equal 'en', obj.locale
38
+
39
+ obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,ru;q=0.2')
40
+ assert_equal 'fr', obj.locale
41
+
42
+ obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4,ru;q=0.2')
43
+ assert_equal 'zh-cn', obj.locale
44
+
45
+ obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'nb-NO,nb;q=0.2')
46
+ assert_equal 'nb', obj.locale
47
+
48
+ obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'en-us; *')
49
+ assert_equal 'en', obj.locale
50
+
51
+ obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => '*')
52
+ assert_equal 'en', obj.locale
53
+ end
54
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+ require_relative 'helper'
4
+ require 'sidekiq/web'
5
+ require 'rack/test'
6
+
7
+ class TestWebSessions < Sidekiq::Test
8
+ describe 'sidekiq web sessions options' do
9
+ include Rack::Test::Methods
10
+
11
+ describe 'using #disable' do
12
+ def app
13
+ app = Sidekiq::Web.new
14
+ app.disable(:sessions)
15
+ app
16
+ end
17
+
18
+ it "doesn't create sessions" do
19
+ get '/'
20
+ assert_nil last_request.env['rack.session']
21
+ end
22
+ end
23
+
24
+ describe 'using #set with false argument' do
25
+ def app
26
+ app = Sidekiq::Web.new
27
+ app.set(:sessions, false)
28
+ app
29
+ end
30
+
31
+ it "doesn't create sessions" do
32
+ get '/'
33
+ assert_nil last_request.env['rack.session']
34
+ end
35
+ end
36
+
37
+ describe 'using #set with an hash' do
38
+ def app
39
+ app = Sidekiq::Web.new
40
+ app.set(:sessions, { domain: :all })
41
+ app
42
+ end
43
+
44
+ it "creates sessions" do
45
+ get '/'
46
+ refute_nil last_request.env['rack.session']
47
+ refute_empty last_request.env['rack.session'].options
48
+ assert_equal :all, last_request.env['rack.session'].options[:domain]
49
+ end
50
+ end
51
+
52
+ describe 'using #enable' do
53
+ def app
54
+ app = Sidekiq::Web.new
55
+ app.enable(:sessions)
56
+ app
57
+ end
58
+
59
+ it "creates sessions" do
60
+ get '/'
61
+ refute_nil last_request.env['rack.session']
62
+ refute_empty last_request.env['rack.session'].options
63
+ refute_nil last_request.env['rack.session'].options[:secret]
64
+ end
65
+ end
66
+ end
67
+ end
@@ -20,7 +20,7 @@ factory.defined&&factory.defined(function(d){return d.y!==null});return factory}
20
20
  var poller;
21
21
 
22
22
  var realtimeGraph = function(updatePath) {
23
- var timeInterval = parseInt(localStorage.timeInterval || '5000');
23
+ var timeInterval = parseInt(localStorage.timeInterval || '2000');
24
24
 
25
25
  var graphElement = document.getElementById("realtime");
26
26
 
@@ -80,7 +80,7 @@
80
80
  <% if type == :dead %>
81
81
  <tr>
82
82
  <th><%= t('LastRetry') %></th>
83
- <td><%= relative_time(job.at) if job['retry_count'] %></td>
83
+ <td><%= relative_time(job.at) %></td>
84
84
  </tr>
85
85
  <% end %>
86
86
  </tbody>
@@ -9,9 +9,9 @@
9
9
  </h3>
10
10
  <div class="interval-slider">
11
11
  <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
12
- <span class="current-interval">5 sec</span>
12
+ <span class="current-interval">2 sec</span>
13
13
  <br/>
14
- <input type="range" min="2000" max="20000" step="1000" value="5000"/>
14
+ <input type="range" min="2000" max="20000" step="1000" value="2000"/>
15
15
  </div>
16
16
  </div>
17
17
 
data/web/views/morgue.erb CHANGED
@@ -47,9 +47,7 @@
47
47
  <div class="args"><%= display_args(entry.display_args) %></div>
48
48
  </td>
49
49
  <td>
50
- <% if entry.error? %>
51
50
  <div><%= h truncate("#{entry['error_class']}: #{entry['error_message']}", 200) %></div>
52
- <% end %>
53
51
  </td>
54
52
  </tr>
55
53
  <% end %>
data/web/views/queue.erb CHANGED
@@ -34,7 +34,7 @@
34
34
  <td>
35
35
  <form action="<%= root_path %>queues/<%= CGI.escape(@name) %>/delete" method="post">
36
36
  <%= csrf_tag %>
37
- <input name="key_val" value="<%= h Sidekiq.dump_json(msg.item) %>" type="hidden" />
37
+ <input name="key_val" value="<%= h msg.value %>" type="hidden" />
38
38
  <input class="btn btn-danger btn-xs" type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSure') %>" />
39
39
  </form>
40
40
  </td>
data/web/views/retry.erb CHANGED
@@ -7,7 +7,7 @@
7
7
  <tr>
8
8
  <th><%= t('ErrorClass') %></th>
9
9
  <td>
10
- <code><%= h @retry['error_class'] %></code>
10
+ <code><%= h @retry.display_class %></code>
11
11
  </td>
12
12
  </tr>
13
13
  <tr>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.10
4
+ version: 5.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-17 00:00:00.000000000 Z
11
+ date: 2017-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -231,6 +231,7 @@ files:
231
231
  - ".travis.yml"
232
232
  - 3.0-Upgrade.md
233
233
  - 4.0-Upgrade.md
234
+ - 5.0-Upgrade.md
234
235
  - COMM-LICENSE
235
236
  - Changes.md
236
237
  - Ent-Changes.md
@@ -254,20 +255,21 @@ files:
254
255
  - lib/sidekiq/cli.rb
255
256
  - lib/sidekiq/client.rb
256
257
  - lib/sidekiq/core_ext.rb
258
+ - lib/sidekiq/delay.rb
257
259
  - lib/sidekiq/exception_handler.rb
258
260
  - lib/sidekiq/extensions/action_mailer.rb
259
261
  - lib/sidekiq/extensions/active_record.rb
260
262
  - lib/sidekiq/extensions/class_methods.rb
261
263
  - lib/sidekiq/extensions/generic_proxy.rb
262
264
  - lib/sidekiq/fetch.rb
265
+ - lib/sidekiq/job_logger.rb
266
+ - lib/sidekiq/job_retry.rb
263
267
  - lib/sidekiq/launcher.rb
264
268
  - lib/sidekiq/logging.rb
265
269
  - lib/sidekiq/manager.rb
266
270
  - lib/sidekiq/middleware/chain.rb
267
271
  - lib/sidekiq/middleware/i18n.rb
268
272
  - lib/sidekiq/middleware/server/active_record.rb
269
- - lib/sidekiq/middleware/server/logging.rb
270
- - lib/sidekiq/middleware/server/retry_jobs.rb
271
273
  - lib/sidekiq/paginator.rb
272
274
  - lib/sidekiq/processor.rb
273
275
  - lib/sidekiq/rails.rb
@@ -284,6 +286,38 @@ files:
284
286
  - lib/sidekiq/web/router.rb
285
287
  - lib/sidekiq/worker.rb
286
288
  - sidekiq.gemspec
289
+ - test/config.yml
290
+ - test/env_based_config.yml
291
+ - test/fake_env.rb
292
+ - test/fixtures/en.yml
293
+ - test/helper.rb
294
+ - test/test_actors.rb
295
+ - test/test_api.rb
296
+ - test/test_cli.rb
297
+ - test/test_client.rb
298
+ - test/test_exception_handler.rb
299
+ - test/test_extensions.rb
300
+ - test/test_fetch.rb
301
+ - test/test_launcher.rb
302
+ - test/test_logging.rb
303
+ - test/test_manager.rb
304
+ - test/test_middleware.rb
305
+ - test/test_processor.rb
306
+ - test/test_rails.rb
307
+ - test/test_redis_connection.rb
308
+ - test/test_retry.rb
309
+ - test/test_retry_exhausted.rb
310
+ - test/test_scheduled.rb
311
+ - test/test_scheduling.rb
312
+ - test/test_sidekiq.rb
313
+ - test/test_testing.rb
314
+ - test/test_testing_fake.rb
315
+ - test/test_testing_inline.rb
316
+ - test/test_util.rb
317
+ - test/test_web.rb
318
+ - test/test_web_auth.rb
319
+ - test/test_web_helpers.rb
320
+ - test/test_web_sessions.rb
287
321
  - web/assets/images/favicon.ico
288
322
  - web/assets/images/logo.png
289
323
  - web/assets/images/status.png
@@ -297,7 +331,6 @@ files:
297
331
  - web/locales/el.yml
298
332
  - web/locales/en.yml
299
333
  - web/locales/es.yml
300
- - web/locales/fa.yml
301
334
  - web/locales/fr.yml
302
335
  - web/locales/hi.yml
303
336
  - web/locales/it.yml
@@ -347,13 +380,45 @@ required_ruby_version: !ruby/object:Gem::Requirement
347
380
  version: '0'
348
381
  required_rubygems_version: !ruby/object:Gem::Requirement
349
382
  requirements:
350
- - - ">="
383
+ - - ">"
351
384
  - !ruby/object:Gem::Version
352
- version: '0'
385
+ version: 1.3.1
353
386
  requirements: []
354
387
  rubyforge_project:
355
388
  rubygems_version: 2.5.2
356
389
  signing_key:
357
390
  specification_version: 4
358
391
  summary: Simple, efficient background processing for Ruby
359
- test_files: []
392
+ test_files:
393
+ - test/config.yml
394
+ - test/env_based_config.yml
395
+ - test/fake_env.rb
396
+ - test/fixtures/en.yml
397
+ - test/helper.rb
398
+ - test/test_actors.rb
399
+ - test/test_api.rb
400
+ - test/test_cli.rb
401
+ - test/test_client.rb
402
+ - test/test_exception_handler.rb
403
+ - test/test_extensions.rb
404
+ - test/test_fetch.rb
405
+ - test/test_launcher.rb
406
+ - test/test_logging.rb
407
+ - test/test_manager.rb
408
+ - test/test_middleware.rb
409
+ - test/test_processor.rb
410
+ - test/test_rails.rb
411
+ - test/test_redis_connection.rb
412
+ - test/test_retry.rb
413
+ - test/test_retry_exhausted.rb
414
+ - test/test_scheduled.rb
415
+ - test/test_scheduling.rb
416
+ - test/test_sidekiq.rb
417
+ - test/test_testing.rb
418
+ - test/test_testing_fake.rb
419
+ - test/test_testing_inline.rb
420
+ - test/test_util.rb
421
+ - test/test_web.rb
422
+ - test/test_web_auth.rb
423
+ - test/test_web_helpers.rb
424
+ - test/test_web_sessions.rb
@@ -1,31 +0,0 @@
1
- module Sidekiq
2
- module Middleware
3
- module Server
4
- class Logging
5
-
6
- def call(worker, item, queue)
7
- begin
8
- start = Time.now
9
- logger.info("start".freeze)
10
- yield
11
- logger.info("done: #{elapsed(start)} sec")
12
- rescue Exception
13
- logger.info("fail: #{elapsed(start)} sec")
14
- raise
15
- end
16
- end
17
-
18
- private
19
-
20
- def elapsed(start)
21
- (Time.now - start).round(3)
22
- end
23
-
24
- def logger
25
- Sidekiq.logger
26
- end
27
- end
28
- end
29
- end
30
- end
31
-
@@ -1,205 +0,0 @@
1
- require 'sidekiq/scheduled'
2
- require 'sidekiq/api'
3
-
4
- module Sidekiq
5
- module Middleware
6
- module Server
7
- ##
8
- # Automatically retry jobs that fail in Sidekiq.
9
- # Sidekiq's retry support assumes a typical development lifecycle:
10
- #
11
- # 0. Push some code changes with a bug in it.
12
- # 1. Bug causes job processing to fail, Sidekiq's middleware captures
13
- # the job and pushes it onto a retry queue.
14
- # 2. Sidekiq retries jobs in the retry queue multiple times with
15
- # an exponential delay, the job continues to fail.
16
- # 3. After a few days, a developer deploys a fix. The job is
17
- # reprocessed successfully.
18
- # 4. Once retries are exhausted, Sidekiq will give up and move the
19
- # job to the Dead Job Queue (aka morgue) where it must be dealt with
20
- # manually in the Web UI.
21
- # 5. After 6 months on the DJQ, Sidekiq will discard the job.
22
- #
23
- # A job looks like:
24
- #
25
- # { 'class' => 'HardWorker', 'args' => [1, 2, 'foo'], 'retry' => true }
26
- #
27
- # The 'retry' option also accepts a number (in place of 'true'):
28
- #
29
- # { 'class' => 'HardWorker', 'args' => [1, 2, 'foo'], 'retry' => 5 }
30
- #
31
- # The job will be retried this number of times before giving up. (If simply
32
- # 'true', Sidekiq retries 25 times)
33
- #
34
- # We'll add a bit more data to the job to support retries:
35
- #
36
- # * 'queue' - the queue to use
37
- # * 'retry_count' - number of times we've retried so far.
38
- # * 'error_message' - the message from the exception
39
- # * 'error_class' - the exception class
40
- # * 'failed_at' - the first time it failed
41
- # * 'retried_at' - the last time it was retried
42
- # * 'backtrace' - the number of lines of error backtrace to store
43
- #
44
- # We don't store the backtrace by default as that can add a lot of overhead
45
- # to the job and everyone is using an error service, right?
46
- #
47
- # The default number of retry attempts is 25 which works out to about 3 weeks
48
- # of retries. You can pass a value for the max number of retry attempts when
49
- # adding the middleware using the options hash:
50
- #
51
- # Sidekiq.configure_server do |config|
52
- # config.server_middleware do |chain|
53
- # chain.add Sidekiq::Middleware::Server::RetryJobs, :max_retries => 7
54
- # end
55
- # end
56
- #
57
- # or limit the number of retries for a particular worker with:
58
- #
59
- # class MyWorker
60
- # include Sidekiq::Worker
61
- # sidekiq_options :retry => 10
62
- # end
63
- #
64
- class RetryJobs
65
- include Sidekiq::Util
66
-
67
- DEFAULT_MAX_RETRY_ATTEMPTS = 25
68
-
69
- def initialize(options = {})
70
- @max_retries = options.fetch(:max_retries, DEFAULT_MAX_RETRY_ATTEMPTS)
71
- end
72
-
73
- def call(worker, msg, queue)
74
- yield
75
- rescue Sidekiq::Shutdown
76
- # ignore, will be pushed back onto queue during hard_shutdown
77
- raise
78
- rescue Exception => e
79
- # ignore, will be pushed back onto queue during hard_shutdown
80
- raise Sidekiq::Shutdown if exception_caused_by_shutdown?(e)
81
-
82
- raise e unless msg['retry']
83
- attempt_retry(worker, msg, queue, e)
84
- end
85
-
86
- private
87
-
88
- def attempt_retry(worker, msg, queue, exception)
89
- max_retry_attempts = retry_attempts_from(msg['retry'], @max_retries)
90
-
91
- msg['queue'] = if msg['retry_queue']
92
- msg['retry_queue']
93
- else
94
- queue
95
- end
96
-
97
- # App code can stuff all sorts of crazy binary data into the error message
98
- # that won't convert to JSON.
99
- m = exception.message.to_s[0, 10_000]
100
- if m.respond_to?(:scrub!)
101
- m.force_encoding("utf-8")
102
- m.scrub!
103
- end
104
-
105
- msg['error_message'] = m
106
- msg['error_class'] = exception.class.name
107
- count = if msg['retry_count']
108
- msg['retried_at'] = Time.now.to_f
109
- msg['retry_count'] += 1
110
- else
111
- msg['failed_at'] = Time.now.to_f
112
- msg['retry_count'] = 0
113
- end
114
-
115
- if msg['backtrace'] == true
116
- msg['error_backtrace'] = exception.backtrace
117
- elsif !msg['backtrace']
118
- # do nothing
119
- elsif msg['backtrace'].to_i != 0
120
- msg['error_backtrace'] = exception.backtrace[0...msg['backtrace'].to_i]
121
- end
122
-
123
- if count < max_retry_attempts
124
- delay = delay_for(worker, count, exception)
125
- logger.debug { "Failure! Retry #{count} in #{delay} seconds" }
126
- retry_at = Time.now.to_f + delay
127
- payload = Sidekiq.dump_json(msg)
128
- Sidekiq.redis do |conn|
129
- conn.zadd('retry', retry_at.to_s, payload)
130
- end
131
- else
132
- # Goodbye dear message, you (re)tried your best I'm sure.
133
- retries_exhausted(worker, msg, exception)
134
- end
135
-
136
- raise exception
137
- end
138
-
139
- def retries_exhausted(worker, msg, exception)
140
- logger.debug { "Retries exhausted for job" }
141
- begin
142
- block = worker.sidekiq_retries_exhausted_block || Sidekiq.default_retries_exhausted
143
- block.call(msg, exception) if block
144
- rescue => e
145
- handle_exception(e, { context: "Error calling retries_exhausted for #{worker.class}", job: msg })
146
- end
147
-
148
- send_to_morgue(msg) unless msg['dead'] == false
149
- end
150
-
151
- def send_to_morgue(msg)
152
- Sidekiq.logger.info { "Adding dead #{msg['class']} job #{msg['jid']}" }
153
- payload = Sidekiq.dump_json(msg)
154
- now = Time.now.to_f
155
- Sidekiq.redis do |conn|
156
- conn.multi do
157
- conn.zadd('dead', now, payload)
158
- conn.zremrangebyscore('dead', '-inf', now - DeadSet.timeout)
159
- conn.zremrangebyrank('dead', 0, -DeadSet.max_jobs)
160
- end
161
- end
162
- end
163
-
164
- def retry_attempts_from(msg_retry, default)
165
- if msg_retry.is_a?(Integer)
166
- msg_retry
167
- else
168
- default
169
- end
170
- end
171
-
172
- def delay_for(worker, count, exception)
173
- worker.sidekiq_retry_in_block? && retry_in(worker, count, exception) || seconds_to_delay(count)
174
- end
175
-
176
- # delayed_job uses the same basic formula
177
- def seconds_to_delay(count)
178
- (count ** 4) + 15 + (rand(30)*(count+1))
179
- end
180
-
181
- def retry_in(worker, count, exception)
182
- begin
183
- worker.sidekiq_retry_in_block.call(count, exception).to_i
184
- rescue Exception => e
185
- handle_exception(e, { context: "Failure scheduling retry using the defined `sidekiq_retry_in` in #{worker.class.name}, falling back to default" })
186
- nil
187
- end
188
- end
189
-
190
- def exception_caused_by_shutdown?(e, checked_causes = [])
191
- # In Ruby 2.1.0 only, check if exception is a result of shutdown.
192
- return false unless defined?(e.cause)
193
-
194
- # Handle circular causes
195
- checked_causes << e.object_id
196
- return false if checked_causes.include?(e.cause.object_id)
197
-
198
- e.cause.instance_of?(Sidekiq::Shutdown) ||
199
- exception_caused_by_shutdown?(e.cause, checked_causes)
200
- end
201
-
202
- end
203
- end
204
- end
205
- end