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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 595500a3810c25e8e04e86c644f966ff01cb035f
4
- data.tar.gz: 3f92a9f61e61848bc2c0639469ce3588f3848fc0
3
+ metadata.gz: 95da469a298b66ee3541eebedff02fa7e78bafa5
4
+ data.tar.gz: 527583034d9da07b968edaf9e5494d86fd953a3c
5
5
  SHA512:
6
- metadata.gz: c4e97c3665d1e902f47cfb579fda437dc834ac4b584606f1ca3b8fd9225e8502cacf5fb687673b4735b359de6af179589759a34369f1c74e904b37f8fe70a4ee
7
- data.tar.gz: a4e6d41067bf6b88c77577def0c1f9ecc3f5d46f0bdfb0821952c26867e91a71c64231aab09a25096d22c3272dea2dcc37547bc6096dd7622a192fa00e0a4e50
6
+ metadata.gz: 69243c242c3a520711d6afd75a986287b0a064751565d11ee136de74e74261c42646f2f2d0dd6c590213f58bb2ad40bd5c0aca7478a614cc6811b4aa27dfaa7a
7
+ data.tar.gz: 21159d28edee7f271deec190f7ce013d91cdac0d91e69c995643c26d0c4df97ce7425131f3e749da0e5880a374569fb1361cdd1c5ec598150b2d29a49f8fbbcf
@@ -1,9 +1,4 @@
1
1
  Ruby version:
2
2
  Sidekiq / Pro / Enterprise version(s):
3
3
 
4
- Please include your initializer and any error message with the full backtrace.
5
-
6
- Are you using an old version?
7
- Have you checked the changelog to see if your issue has been fixed in a later version?
8
-
9
- https://github.com/mperham/sidekiq/blob/master/Changes.md
4
+ If relevant, please include your initializer and any error message with the full backtrace.
data/.gitignore CHANGED
@@ -10,3 +10,4 @@ vendor/
10
10
  .bundle/
11
11
  .sass-cache/
12
12
  tmp/
13
+ pkg/*.gem
data/5.0-Upgrade.md ADDED
@@ -0,0 +1,52 @@
1
+ # Welcome to Sidekiq 5.0!
2
+
3
+ Sidekiq 5.0 contains a reworked job dispatch and execution core to integrate
4
+ better with the new Rails 5.0 Executor. It also drops support for older
5
+ versions of Ruby and Rails.
6
+
7
+ ## What's New
8
+
9
+ * Integrate the job logging and retry logic directly in with the job
10
+ execution logic in Sidekiq::Processor. Previously this logic was
11
+ defined as middleware. In Rails 5.0, ActiveSupport::Executor handles ActiveRecord
12
+ connection management, job callbacks, development mode class loading,
13
+ etc. Because of its extensive responsibilities, the Executor can't be
14
+ integrated as Sidekiq middleware; the logging/retry logic had to be pulled out
15
+ too. Sidekiq 4.2 had a hack to make it work but this redesign provides
16
+ a cleaner integration. [#3235]
17
+ * The Delayed Extensions `delay`, `delay_in` and `delay_until` APIs are
18
+ no longer available by default. The extensions allow you to marshal
19
+ job arguments as YAML, leading to cases where job payloads could be many
20
+ 100s of KB or larger if not careful, leading to Redis networking
21
+ timeouts or other problems. As noted in the Best Practices wiki page,
22
+ Sidekiq is designed for jobs with small, simple arguments.
23
+
24
+ Add this line to your initializer to re-enable them and get the old behavior:
25
+ ```ruby
26
+ Sidekiq::Extensions.enable_delay!
27
+ ```
28
+ The old `Sidekiq.remove_delay!` API has been removed as it is now the default. [#3299]
29
+ * Sidekiq's quiet signal is now `TSTP` (think of it as **T**hread
30
+ **ST**o**P**) instead of USR1 as USR1 is not available on JRuby.
31
+ USR1 will continue to be supported in Sidekiq 5.x for backwards
32
+ compatibility and will be removed in Sidekiq 6.x. [#3302]
33
+ * Rails 3.2 is no longer supported.
34
+ * Ruby 2.0 and Ruby 2.1 are no longer supported. Ruby 2.2.2+ is required.
35
+ * Jobs which can't be parsed due to invalid JSON are now pushed
36
+ immediately to the Dead set since they require manual intervention and
37
+ will never execute successfully as is. [#3296]
38
+
39
+ ## Upgrade
40
+
41
+ As always, please upgrade Sidekiq **one major version at a time**.
42
+ If you are already running Sidekiq 4.x, then:
43
+
44
+ * Upgrade to the latest Sidekiq 4.x.
45
+ ```ruby
46
+ gem 'sidekiq', '< 5'
47
+ ```
48
+ * Fix any deprecation warnings you see.
49
+ * Upgrade to 5.x.
50
+ ```ruby
51
+ gem 'sidekiq', '< 6'
52
+ ```
data/Changes.md CHANGED
@@ -1,13 +1,21 @@
1
1
  # Sidekiq Changes
2
2
 
3
- HEAD
3
+ 5.0.0
4
4
  -----------
5
5
 
6
- - Scheduled jobs can now be moved directly to the Dead queue via API [#3390]
7
- - Fix edge case leading to job duplication when using Sidekiq Pro's
8
- reliability feature [#3388]
9
- - Fix error class name display on retry page [#3348]
10
- - More robust latency calculation [#3340]
6
+ - **BREAKING CHANGE** Job dispatch was refactored for safer integration with
7
+ Rails 5. The **Logging** and **RetryJobs** server middleware were removed and
8
+ functionality integrated directly into Sidekiq::Processor. These aren't
9
+ commonly used public APIs so this shouldn't impact most users.
10
+ ```
11
+ Sidekiq::Middleware::Server::RetryJobs -> Sidekiq::JobRetry
12
+ Sidekiq::Middleware::Server::Logging -> Sidekiq::JobLogging
13
+ ```
14
+ - Quieting Sidekiq is now done via the TSTP signal, the USR1 signal is deprecated.
15
+ - The `delay` extension APIs are no longer available by default, you
16
+ must opt into them.
17
+ - Rails 3.2 and Ruby 2.0 and 2.1 are no longer supported.
18
+ - Please see the [5.0 Upgrade notes](5.0-Upgrade.md) for more detail.
11
19
 
12
20
  4.2.9
13
21
  -----------
data/Ent-Changes.md CHANGED
@@ -3,10 +3,9 @@ Sidekiq Enterprise Changelog
3
3
 
4
4
  Please see [http://sidekiq.org/](http://sidekiq.org/) for more details and how to buy.
5
5
 
6
- 1.5.2
6
+ HEAD
7
7
  -------------
8
8
 
9
- - Fix encrypted arguments double-encrypted by retry or rate limiting [#3368]
10
9
  - Fix leak in concurrent rate limiter, run this in Rails console to clean up existing data [#3323]
11
10
  ```ruby
12
11
  expiry = 1.month.to_i; Sidekiq::Limiter.redis { |c| c.scan_each(match: "lmtr-cfree-*") { |key| c.expire(key, expiry) } }
data/Pro-Changes.md CHANGED
@@ -6,25 +6,7 @@ Please see [http://sidekiq.org/](http://sidekiq.org/) for more details and how t
6
6
  HEAD
7
7
  ---------
8
8
 
9
- - Make Batch UI progress bar more friendly to the colorblind [#3387]
10
-
11
- 3.4.5
12
- ---------
13
-
14
- - Fix potential job loss with reliable scheduler when lots of jobs are scheduled
15
- at precisely the same time. Thanks to raivil for his hard work in
16
- reproducing the bug. [#3371]
17
-
18
- 3.4.4
19
- ---------
20
-
21
- - Optimize super\_fetch shutdown to restart jobs quicker [#3249]
22
-
23
- 3.4.3
24
- ---------
25
-
26
- - Limit reliable scheduler to enqueue up to 100 jobs per call, minimizing Redis latency [#3332]
27
- - Fix bug in super\_fetch logic for queues with `_` in the name [#3339]
9
+ - Update reliable scheduler to enqueue up to 100 jobs per call, minimizing Redis latency [#3332]
28
10
 
29
11
  3.4.2
30
12
  ---------
data/README.md CHANGED
@@ -32,9 +32,9 @@ DelayedJob 4.1.1 | - | - | 465 sec | 215 jobs/sec
32
32
  Requirements
33
33
  -----------------
34
34
 
35
- Sidekiq supports CRuby 2.0+ and JRuby 9k.
35
+ Sidekiq supports CRuby 2.2.2+ and JRuby 9k.
36
36
 
37
- All Rails releases >= 3.2 are officially supported.
37
+ All Rails releases >= 4.0 are officially supported.
38
38
 
39
39
  Redis 2.8 or greater is required. 3.0.3+ is recommended for large
40
40
  installations with thousands of worker threads.
data/bin/sidekiqctl CHANGED
@@ -64,7 +64,7 @@ class Sidekiqctl
64
64
  end
65
65
 
66
66
  def quiet
67
- `kill -USR1 #{pid}`
67
+ `kill -TSTP #{pid}`
68
68
  end
69
69
 
70
70
  def stop
data/bin/sidekiqload CHANGED
@@ -14,7 +14,7 @@ include Sidekiq::Util
14
14
 
15
15
  Sidekiq.configure_server do |config|
16
16
  #config.options[:concurrency] = 1
17
- config.redis = { db: 13 }
17
+ config.redis = { driver: :hiredis, db: 13, port: 6380 }
18
18
  config.options[:queues] << 'default'
19
19
  config.logger.level = Logger::ERROR
20
20
  config.average_scheduled_poll_interval = 2
@@ -36,17 +36,17 @@ end
36
36
  # brew tap shopify/shopify
37
37
  # brew install toxiproxy
38
38
  # gem install toxiproxy
39
- #require 'toxiproxy'
39
+ require 'toxiproxy'
40
40
  # simulate a non-localhost network for realer-world conditions.
41
41
  # adding 1ms of network latency has an ENORMOUS impact on benchmarks
42
- #Toxiproxy.populate([{
43
- #"name": "redis",
44
- #"listen": "127.0.0.1:6380",
45
- #"upstream": "127.0.0.1:6379"
46
- #}])
42
+ Toxiproxy.populate([{
43
+ "name": "redis",
44
+ "listen": "127.0.0.1:6380",
45
+ "upstream": "127.0.0.1:6379"
46
+ }])
47
47
 
48
48
  self_read, self_write = IO.pipe
49
- %w(INT TERM USR1 USR2 TTIN).each do |sig|
49
+ %w(INT TERM TSTP TTIN).each do |sig|
50
50
  begin
51
51
  trap sig do
52
52
  self_write.puts(sig)
@@ -67,14 +67,9 @@ def handle_signal(launcher, sig)
67
67
  when 'TERM'
68
68
  # Heroku sends TERM and then waits 10 seconds for process to exit.
69
69
  raise Interrupt
70
- when 'USR1'
71
- Sidekiq.logger.info "Received USR1, no longer accepting new work"
70
+ when 'TSTP'
71
+ Sidekiq.logger.info "Received TSTP, no longer accepting new work"
72
72
  launcher.quiet
73
- when 'USR2'
74
- if Sidekiq.options[:logfile]
75
- Sidekiq.logger.info "Received USR2, reopening log file"
76
- Sidekiq::Logging.reopen_logs
77
- end
78
73
  when 'TTIN'
79
74
  Thread.list.each do |thread|
80
75
  Sidekiq.logger.warn "Thread TID-#{thread.object_id.to_s(36)} #{thread['label']}"
@@ -108,7 +103,7 @@ Sidekiq.logger.error "Created #{count*iter} jobs"
108
103
  Monitoring = Thread.new do
109
104
  watchdog("monitor thread") do
110
105
  while true
111
- sleep 1
106
+ sleep 2
112
107
  qsize, retries = Sidekiq.redis do |conn|
113
108
  conn.pipelined do
114
109
  conn.llen "queue:default"
@@ -130,8 +125,8 @@ begin
130
125
  #RubyProf::exclude_threads = [ Monitoring ]
131
126
  #RubyProf.start
132
127
  fire_event(:startup)
133
- #Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
134
- #Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
128
+ Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
129
+ Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
135
130
  launcher = Sidekiq::Launcher.new(Sidekiq.options)
136
131
  launcher.run
137
132
 
@@ -139,7 +134,7 @@ begin
139
134
  signal = readable_io.first[0].gets.strip
140
135
  handle_signal(launcher, signal)
141
136
  end
142
- #end
137
+ end
143
138
  rescue SystemExit => e
144
139
  #Sidekiq.logger.error("Profiling...")
145
140
  #result = RubyProf.stop
data/lib/sidekiq.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
3
  require 'sidekiq/version'
4
- fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.0.0." if RUBY_PLATFORM != 'java' && RUBY_VERSION < '2.0.0'
4
+ fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.2.2." if RUBY_PLATFORM != 'java' && RUBY_VERSION < '2.2.2'
5
5
 
6
6
  require 'sidekiq/logging'
7
7
  require 'sidekiq/client'
8
8
  require 'sidekiq/worker'
9
9
  require 'sidekiq/redis_connection'
10
+ require 'sidekiq/delay'
10
11
 
11
12
  require 'json'
12
13
 
@@ -33,7 +34,6 @@ module Sidekiq
33
34
  dead_max_jobs: 10_000,
34
35
  dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
35
36
  reloader: proc { |&block| block.call },
36
- executor: proc { |&block| block.call },
37
37
  }
38
38
 
39
39
  DEFAULT_WORKER_OPTIONS = {
@@ -145,13 +145,7 @@ module Sidekiq
145
145
  end
146
146
 
147
147
  def self.default_server_middleware
148
- require 'sidekiq/middleware/server/retry_jobs'
149
- require 'sidekiq/middleware/server/logging'
150
-
151
- Middleware::Chain.new do |m|
152
- m.add Middleware::Server::RetryJobs
153
- m.add Middleware::Server::Logging
154
- end
148
+ Middleware::Chain.new
155
149
  end
156
150
 
157
151
  def self.default_worker_options=(hash)
@@ -231,7 +225,4 @@ module Sidekiq
231
225
 
232
226
  end
233
227
 
234
- require 'sidekiq/extensions/class_methods'
235
- require 'sidekiq/extensions/action_mailer'
236
- require 'sidekiq/extensions/active_record'
237
228
  require 'sidekiq/rails' if defined?(::Rails::Engine)
data/lib/sidekiq/api.rb CHANGED
@@ -75,10 +75,7 @@ module Sidekiq
75
75
  enqueued = pipe2_res[s..-1].map(&:to_i).inject(0, &:+)
76
76
 
77
77
  default_queue_latency = if (entry = pipe1_res[6].first)
78
- job = Sidekiq.load_json(entry)
79
- now = Time.now.to_f
80
- thence = job['enqueued_at'.freeze] || now
81
- now - thence
78
+ Time.now.to_f - Sidekiq.load_json(entry)['enqueued_at'.freeze]
82
79
  else
83
80
  0
84
81
  end
@@ -228,10 +225,7 @@ module Sidekiq
228
225
  conn.lrange(@rname, -1, -1)
229
226
  end.first
230
227
  return 0 unless entry
231
- job = Sidekiq.load_json(entry)
232
- now = Time.now.to_f
233
- thence = job['enqueued_at'] || now
234
- now - thence
228
+ Time.now.to_f - Sidekiq.load_json(entry)['enqueued_at']
235
229
  end
236
230
 
237
231
  def each
@@ -288,12 +282,16 @@ module Sidekiq
288
282
 
289
283
  def initialize(item, queue_name=nil)
290
284
  @value = item
291
- @item = item.is_a?(Hash) ? item : Sidekiq.load_json(item)
292
- @queue = queue_name || @item['queue']
285
+ @item = if item.is_a?(Hash)
286
+ item
287
+ else
288
+ Sidekiq.load_json(item) rescue nil
289
+ end
290
+ @queue = queue_name || self['queue']
293
291
  end
294
292
 
295
293
  def klass
296
- @item['class']
294
+ self['class']
297
295
  end
298
296
 
299
297
  def display_class
@@ -324,8 +322,8 @@ module Sidekiq
324
322
  arg
325
323
  end
326
324
  when "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper"
327
- job_args = @item['wrapped'] ? args[0]["arguments"] : []
328
- if 'ActionMailer::DeliveryJob' == (@item['wrapped'] || args[0])
325
+ job_args = self['wrapped'] ? args[0]["arguments"] : []
326
+ if 'ActionMailer::DeliveryJob' == (self['wrapped'] || args[0])
329
327
  # remove MailerClass, mailer_method and 'deliver_now'
330
328
  job_args.drop(3)
331
329
  else
@@ -337,19 +335,19 @@ module Sidekiq
337
335
  end
338
336
 
339
337
  def args
340
- @item['args']
338
+ self['args']
341
339
  end
342
340
 
343
341
  def jid
344
- @item['jid']
342
+ self['jid']
345
343
  end
346
344
 
347
345
  def enqueued_at
348
- @item['enqueued_at'] ? Time.at(@item['enqueued_at']).utc : nil
346
+ self['enqueued_at'] ? Time.at(self['enqueued_at']).utc : nil
349
347
  end
350
348
 
351
349
  def created_at
352
- Time.at(@item['created_at'] || @item['enqueued_at'] || 0).utc
350
+ Time.at(self['created_at'] || self['enqueued_at'] || 0).utc
353
351
  end
354
352
 
355
353
  def queue
@@ -357,8 +355,7 @@ module Sidekiq
357
355
  end
358
356
 
359
357
  def latency
360
- now = Time.now.to_f
361
- now - (@item['enqueued_at'] || @item['created_at'] || now)
358
+ Time.now.to_f - (self['enqueued_at'] || self['created_at'] || 0)
362
359
  end
363
360
 
364
361
  ##
@@ -371,7 +368,10 @@ module Sidekiq
371
368
  end
372
369
 
373
370
  def [](name)
374
- @item[name]
371
+ # nil will happen if the JSON fails to parse.
372
+ # We don't guarantee Sidekiq will work with bad job JSON but we should
373
+ # make a best effort to minimize the damage.
374
+ @item ? @item[name] : nil
375
375
  end
376
376
 
377
377
  private
@@ -423,9 +423,10 @@ module Sidekiq
423
423
  end
424
424
 
425
425
  def retry
426
+ raise "Retry not available on jobs which have not failed" unless item["failed_at"]
426
427
  remove_job do |message|
427
428
  msg = Sidekiq.load_json(message)
428
- msg['retry_count'] -= 1 if msg['retry_count']
429
+ msg['retry_count'] -= 1
429
430
  Sidekiq::Client.push(msg)
430
431
  end
431
432
  end
@@ -433,7 +434,9 @@ module Sidekiq
433
434
  ##
434
435
  # Place job in the dead set
435
436
  def kill
437
+ raise 'Kill not available on jobs which have not failed' unless item['failed_at']
436
438
  remove_job do |message|
439
+ Sidekiq.logger.info { "Killing job #{message['jid']}" }
437
440
  now = Time.now.to_f
438
441
  Sidekiq.redis do |conn|
439
442
  conn.multi do
@@ -445,10 +448,6 @@ module Sidekiq
445
448
  end
446
449
  end
447
450
 
448
- def error?
449
- !!item['error_class']
450
- end
451
-
452
451
  private
453
452
 
454
453
  def remove_job
@@ -593,13 +592,13 @@ module Sidekiq
593
592
  # Allows enumeration of scheduled jobs within Sidekiq.
594
593
  # Based on this, you can search/filter for jobs. Here's an
595
594
  # example where I'm selecting all jobs of a certain type
596
- # and deleting them from the schedule queue.
595
+ # and deleting them from the retry queue.
597
596
  #
598
597
  # r = Sidekiq::ScheduledSet.new
599
- # r.select do |scheduled|
600
- # scheduled.klass == 'Sidekiq::Extensions::DelayedClass' &&
601
- # scheduled.args[0] == 'User' &&
602
- # scheduled.args[1] == 'setup_new_subscriber'
598
+ # r.select do |retri|
599
+ # retri.klass == 'Sidekiq::Extensions::DelayedClass' &&
600
+ # retri.args[0] == 'User' &&
601
+ # retri.args[1] == 'setup_new_subscriber'
603
602
  # end.map(&:delete)
604
603
  class ScheduledSet < JobSet
605
604
  def initialize
@@ -756,7 +755,7 @@ module Sidekiq
756
755
  end
757
756
 
758
757
  def quiet!
759
- signal('USR1')
758
+ signal('TSTP')
760
759
  end
761
760
 
762
761
  def stop!