sidekiq 4.2.10 → 5.2.8

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 (75) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +61 -0
  3. data/.github/issue_template.md +3 -1
  4. data/.gitignore +3 -0
  5. data/.travis.yml +6 -13
  6. data/5.0-Upgrade.md +56 -0
  7. data/COMM-LICENSE +12 -10
  8. data/Changes.md +164 -1
  9. data/Ent-Changes.md +67 -2
  10. data/Gemfile +14 -20
  11. data/LICENSE +1 -1
  12. data/Pro-4.0-Upgrade.md +35 -0
  13. data/Pro-Changes.md +133 -2
  14. data/README.md +8 -6
  15. data/Rakefile +2 -5
  16. data/bin/sidekiqctl +13 -92
  17. data/bin/sidekiqload +5 -10
  18. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +1 -1
  19. data/lib/sidekiq/api.rb +145 -57
  20. data/lib/sidekiq/cli.rb +120 -81
  21. data/lib/sidekiq/client.rb +25 -18
  22. data/lib/sidekiq/core_ext.rb +1 -119
  23. data/lib/sidekiq/ctl.rb +221 -0
  24. data/lib/sidekiq/delay.rb +42 -0
  25. data/lib/sidekiq/exception_handler.rb +2 -4
  26. data/lib/sidekiq/extensions/generic_proxy.rb +7 -1
  27. data/lib/sidekiq/fetch.rb +1 -1
  28. data/lib/sidekiq/job_logger.rb +25 -0
  29. data/lib/sidekiq/job_retry.rb +262 -0
  30. data/lib/sidekiq/launcher.rb +19 -19
  31. data/lib/sidekiq/logging.rb +18 -2
  32. data/lib/sidekiq/manager.rb +5 -6
  33. data/lib/sidekiq/middleware/server/active_record.rb +10 -0
  34. data/lib/sidekiq/processor.rb +126 -48
  35. data/lib/sidekiq/rails.rb +8 -73
  36. data/lib/sidekiq/redis_connection.rb +43 -5
  37. data/lib/sidekiq/scheduled.rb +35 -8
  38. data/lib/sidekiq/testing.rb +16 -7
  39. data/lib/sidekiq/util.rb +5 -2
  40. data/lib/sidekiq/version.rb +1 -1
  41. data/lib/sidekiq/web/action.rb +2 -6
  42. data/lib/sidekiq/web/application.rb +33 -16
  43. data/lib/sidekiq/web/helpers.rb +69 -22
  44. data/lib/sidekiq/web/router.rb +10 -10
  45. data/lib/sidekiq/web.rb +4 -4
  46. data/lib/sidekiq/worker.rb +118 -19
  47. data/lib/sidekiq.rb +27 -27
  48. data/sidekiq.gemspec +6 -17
  49. data/web/assets/javascripts/application.js +0 -0
  50. data/web/assets/javascripts/dashboard.js +32 -17
  51. data/web/assets/stylesheets/application-rtl.css +246 -0
  52. data/web/assets/stylesheets/application.css +371 -6
  53. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  54. data/web/assets/stylesheets/bootstrap.css +2 -2
  55. data/web/locales/ar.yml +81 -0
  56. data/web/locales/en.yml +2 -0
  57. data/web/locales/es.yml +4 -3
  58. data/web/locales/fa.yml +1 -0
  59. data/web/locales/he.yml +79 -0
  60. data/web/locales/ja.yml +5 -3
  61. data/web/locales/ur.yml +80 -0
  62. data/web/views/_footer.erb +5 -2
  63. data/web/views/_nav.erb +4 -18
  64. data/web/views/_paging.erb +1 -1
  65. data/web/views/busy.erb +9 -5
  66. data/web/views/dashboard.erb +1 -1
  67. data/web/views/layout.erb +11 -2
  68. data/web/views/morgue.erb +4 -4
  69. data/web/views/queue.erb +8 -7
  70. data/web/views/queues.erb +2 -0
  71. data/web/views/retries.erb +9 -5
  72. data/web/views/scheduled.erb +2 -2
  73. metadata +31 -160
  74. data/lib/sidekiq/middleware/server/logging.rb +0 -31
  75. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
metadata CHANGED
@@ -1,35 +1,35 @@
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.2.8
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: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.2'
20
17
  - - ">="
21
18
  - !ruby/object:Gem::Version
22
- version: 3.2.1
19
+ version: 3.3.5
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '3.2'
30
27
  - - ">="
31
28
  - !ruby/object:Gem::Version
32
- version: 3.2.1
29
+ version: 3.3.5
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: connection_pool
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: '2.2'
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 2.2.0
42
+ version: 2.2.2
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,21 +49,21 @@ dependencies:
49
49
  version: '2.2'
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 2.2.0
52
+ version: 2.2.2
53
53
  - !ruby/object:Gem::Dependency
54
- name: concurrent-ruby
54
+ name: rack
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - "~>"
57
+ - - "<"
58
58
  - !ruby/object:Gem::Version
59
- version: '1.0'
59
+ version: 2.1.0
60
60
  type: :runtime
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - "~>"
64
+ - - "<"
65
65
  - !ruby/object:Gem::Version
66
- version: '1.0'
66
+ version: 2.1.0
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: rack-protection
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -78,144 +78,6 @@ dependencies:
78
78
  - - ">="
79
79
  - !ruby/object:Gem::Version
80
80
  version: 1.5.0
81
- - !ruby/object:Gem::Dependency
82
- name: redis-namespace
83
- requirement: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - "~>"
86
- - !ruby/object:Gem::Version
87
- version: '1.5'
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- version: 1.5.2
91
- type: :development
92
- prerelease: false
93
- version_requirements: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - "~>"
96
- - !ruby/object:Gem::Version
97
- version: '1.5'
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- version: 1.5.2
101
- - !ruby/object:Gem::Dependency
102
- name: minitest
103
- requirement: !ruby/object:Gem::Requirement
104
- requirements:
105
- - - "~>"
106
- - !ruby/object:Gem::Version
107
- version: '5.10'
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: 5.10.1
111
- type: :development
112
- prerelease: false
113
- version_requirements: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '5.10'
118
- - - ">="
119
- - !ruby/object:Gem::Version
120
- version: 5.10.1
121
- - !ruby/object:Gem::Dependency
122
- name: rake
123
- requirement: !ruby/object:Gem::Requirement
124
- requirements:
125
- - - "~>"
126
- - !ruby/object:Gem::Version
127
- version: '10.0'
128
- type: :development
129
- prerelease: false
130
- version_requirements: !ruby/object:Gem::Requirement
131
- requirements:
132
- - - "~>"
133
- - !ruby/object:Gem::Version
134
- version: '10.0'
135
- - !ruby/object:Gem::Dependency
136
- name: rails
137
- requirement: !ruby/object:Gem::Requirement
138
- requirements:
139
- - - ">="
140
- - !ruby/object:Gem::Version
141
- version: 3.2.0
142
- type: :development
143
- prerelease: false
144
- version_requirements: !ruby/object:Gem::Requirement
145
- requirements:
146
- - - ">="
147
- - !ruby/object:Gem::Version
148
- version: 3.2.0
149
- - !ruby/object:Gem::Dependency
150
- name: capybara
151
- requirement: !ruby/object:Gem::Requirement
152
- requirements:
153
- - - "~>"
154
- - !ruby/object:Gem::Version
155
- version: '2.11'
156
- type: :development
157
- prerelease: false
158
- version_requirements: !ruby/object:Gem::Requirement
159
- requirements:
160
- - - "~>"
161
- - !ruby/object:Gem::Version
162
- version: '2.11'
163
- - !ruby/object:Gem::Dependency
164
- name: poltergeist
165
- requirement: !ruby/object:Gem::Requirement
166
- requirements:
167
- - - "~>"
168
- - !ruby/object:Gem::Version
169
- version: '1.12'
170
- type: :development
171
- prerelease: false
172
- version_requirements: !ruby/object:Gem::Requirement
173
- requirements:
174
- - - "~>"
175
- - !ruby/object:Gem::Version
176
- version: '1.12'
177
- - !ruby/object:Gem::Dependency
178
- name: percy-capybara
179
- requirement: !ruby/object:Gem::Requirement
180
- requirements:
181
- - - "~>"
182
- - !ruby/object:Gem::Version
183
- version: '2.3'
184
- type: :development
185
- prerelease: false
186
- version_requirements: !ruby/object:Gem::Requirement
187
- requirements:
188
- - - "~>"
189
- - !ruby/object:Gem::Version
190
- version: '2.3'
191
- - !ruby/object:Gem::Dependency
192
- name: timecop
193
- requirement: !ruby/object:Gem::Requirement
194
- requirements:
195
- - - "~>"
196
- - !ruby/object:Gem::Version
197
- version: '0.8'
198
- type: :development
199
- prerelease: false
200
- version_requirements: !ruby/object:Gem::Requirement
201
- requirements:
202
- - - "~>"
203
- - !ruby/object:Gem::Version
204
- version: '0.8'
205
- - !ruby/object:Gem::Dependency
206
- name: mocha
207
- requirement: !ruby/object:Gem::Requirement
208
- requirements:
209
- - - "~>"
210
- - !ruby/object:Gem::Version
211
- version: '1.1'
212
- type: :development
213
- prerelease: false
214
- version_requirements: !ruby/object:Gem::Requirement
215
- requirements:
216
- - - "~>"
217
- - !ruby/object:Gem::Version
218
- version: '1.1'
219
81
  description: Simple, efficient background processing for Ruby.
220
82
  email:
221
83
  - mperham@gmail.com
@@ -225,12 +87,14 @@ executables:
225
87
  extensions: []
226
88
  extra_rdoc_files: []
227
89
  files:
90
+ - ".circleci/config.yml"
228
91
  - ".github/contributing.md"
229
92
  - ".github/issue_template.md"
230
93
  - ".gitignore"
231
94
  - ".travis.yml"
232
95
  - 3.0-Upgrade.md
233
96
  - 4.0-Upgrade.md
97
+ - 5.0-Upgrade.md
234
98
  - COMM-LICENSE
235
99
  - Changes.md
236
100
  - Ent-Changes.md
@@ -238,6 +102,7 @@ files:
238
102
  - LICENSE
239
103
  - Pro-2.0-Upgrade.md
240
104
  - Pro-3.0-Upgrade.md
105
+ - Pro-4.0-Upgrade.md
241
106
  - Pro-Changes.md
242
107
  - README.md
243
108
  - Rakefile
@@ -254,20 +119,22 @@ files:
254
119
  - lib/sidekiq/cli.rb
255
120
  - lib/sidekiq/client.rb
256
121
  - lib/sidekiq/core_ext.rb
122
+ - lib/sidekiq/ctl.rb
123
+ - lib/sidekiq/delay.rb
257
124
  - lib/sidekiq/exception_handler.rb
258
125
  - lib/sidekiq/extensions/action_mailer.rb
259
126
  - lib/sidekiq/extensions/active_record.rb
260
127
  - lib/sidekiq/extensions/class_methods.rb
261
128
  - lib/sidekiq/extensions/generic_proxy.rb
262
129
  - lib/sidekiq/fetch.rb
130
+ - lib/sidekiq/job_logger.rb
131
+ - lib/sidekiq/job_retry.rb
263
132
  - lib/sidekiq/launcher.rb
264
133
  - lib/sidekiq/logging.rb
265
134
  - lib/sidekiq/manager.rb
266
135
  - lib/sidekiq/middleware/chain.rb
267
136
  - lib/sidekiq/middleware/i18n.rb
268
137
  - lib/sidekiq/middleware/server/active_record.rb
269
- - lib/sidekiq/middleware/server/logging.rb
270
- - lib/sidekiq/middleware/server/retry_jobs.rb
271
138
  - lib/sidekiq/paginator.rb
272
139
  - lib/sidekiq/processor.rb
273
140
  - lib/sidekiq/rails.rb
@@ -289,8 +156,11 @@ files:
289
156
  - web/assets/images/status.png
290
157
  - web/assets/javascripts/application.js
291
158
  - web/assets/javascripts/dashboard.js
159
+ - web/assets/stylesheets/application-rtl.css
292
160
  - web/assets/stylesheets/application.css
161
+ - web/assets/stylesheets/bootstrap-rtl.min.css
293
162
  - web/assets/stylesheets/bootstrap.css
163
+ - web/locales/ar.yml
294
164
  - web/locales/cs.yml
295
165
  - web/locales/da.yml
296
166
  - web/locales/de.yml
@@ -299,6 +169,7 @@ files:
299
169
  - web/locales/es.yml
300
170
  - web/locales/fa.yml
301
171
  - web/locales/fr.yml
172
+ - web/locales/he.yml
302
173
  - web/locales/hi.yml
303
174
  - web/locales/it.yml
304
175
  - web/locales/ja.yml
@@ -312,6 +183,7 @@ files:
312
183
  - web/locales/sv.yml
313
184
  - web/locales/ta.yml
314
185
  - web/locales/uk.yml
186
+ - web/locales/ur.yml
315
187
  - web/locales/zh-cn.yml
316
188
  - web/locales/zh-tw.yml
317
189
  - web/views/_footer.erb
@@ -344,15 +216,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
344
216
  requirements:
345
217
  - - ">="
346
218
  - !ruby/object:Gem::Version
347
- version: '0'
219
+ version: 2.2.2
348
220
  required_rubygems_version: !ruby/object:Gem::Requirement
349
221
  requirements:
350
222
  - - ">="
351
223
  - !ruby/object:Gem::Version
352
224
  version: '0'
353
225
  requirements: []
354
- rubyforge_project:
355
- rubygems_version: 2.5.2
226
+ rubygems_version: 3.0.3
356
227
  signing_key:
357
228
  specification_version: 4
358
229
  summary: Simple, efficient background processing for Ruby
@@ -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