sidekiq 6.0.0 → 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fda3ed37e1d981e1b32eea70669c678d400c071a9146a919848bcc598612de25
4
- data.tar.gz: 6580ab6c188b2514efe807479ca25c06ea584d1def175d84d94639bc20f80b1e
3
+ metadata.gz: 792692164ce00b070d352bda8869518e3d20d92cfdb70cda88456b53d5a4a627
4
+ data.tar.gz: b489c2ecc7b3708dd578a0184a9da58ac32d36e737a3b704d094e1ef375e93e1
5
5
  SHA512:
6
- metadata.gz: 25682d3dbf99d29fa3f56b7c74419863d3549b6e0c182e69c83fbc02a2955d053bca85eec53b474d4d22c7526e44e865f378aa4111152a91377b373be27c4d47
7
- data.tar.gz: e55d07434b1e2ab26df6748101bf10640fc08d4d93f00b75ed04d82ed309ee8529d652982430cd00671c98b5e53cc733bef4b686df58a6b0e116ba04c12139aa
6
+ metadata.gz: 80d7bd6a6fc9ef0a6026c9c5bb8aaf727db7323e1f1d9e057550681329991ddf82de030df70dc80e8f3a3608fc1f999ecb5d251765a5bcf09f23f764d86365a7
7
+ data.tar.gz: 3148011168f88fbc4fa67f244a56be0b0e7da36d5009f4d465e0df2a7df93ddf8a99fc1c57c43fa0365a0cdb1de9fb770306daf070bcea5f330c1f3522210bf9
@@ -32,6 +32,9 @@ jobs:
32
32
  - <<: *save
33
33
  - <<: *unit
34
34
  "ruby-2.6":
35
+ environment:
36
+ COVERAGE: true
37
+ CC_TEST_REPORTER_ID: 003c3033501d70a2653bd887ff9a8b2884a263e6a4e27f2ba68748e15530918d
35
38
  docker:
36
39
  - image: circleci/ruby:2.6
37
40
  - image: circleci/redis:4.0
@@ -40,7 +43,25 @@ jobs:
40
43
  - <<: *restore
41
44
  - <<: *bundle
42
45
  - <<: *save
46
+
47
+ - run:
48
+ name: Setup Code Climate test-reporter
49
+ command: |
50
+ # download test reporter as a static binary
51
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
52
+ chmod +x ./cc-test-reporter
53
+
54
+ - run:
55
+ name: Code Climate before-build
56
+ command: |
57
+ ./cc-test-reporter before-build
58
+
43
59
  - <<: *unit
60
+
61
+ - run:
62
+ name: Report code coverage to Code Climate
63
+ command: |
64
+ ./cc-test-reporter after-build -t simplecov --exit-code $?
44
65
  "jruby":
45
66
  docker:
46
67
  - image: circleci/jruby:latest
@@ -10,6 +10,7 @@ This release has major breaking changes. Read and test carefully in production.
10
10
  - ActiveJobs can now use `sidekiq_options` directly to configure Sidekiq
11
11
  features/internals like the retry subsystem. Prefer the native
12
12
  Sidekiq::Worker APIs as some Sidekiq features (e.g. unique jobs) do not work well with AJ.
13
+ (requires Rails 6.0.1)
13
14
  ```ruby
14
15
  class MyJob < ActiveJob::Base
15
16
  queue_as :myqueue
@@ -31,9 +32,10 @@ you can override it by configuring the log formatter explicitly. See
31
32
  ```ruby
32
33
  Sidekiq.configure_server do |config|
33
34
  config.log_formatter = AcmeCorp::PlainLogFormatter.new
34
- # config.log_formatter = Sidekiq::Logger::Format::JSON.new
35
+ # config.log_formatter = Sidekiq::Logger::Formatters::JSON.new
35
36
  end
36
37
  ```
38
+ Please see the [Logging](https://github.com/mperham/sidekiq/wiki/Logging) wiki page for the latest documentation and notes.
37
39
  - **Remove the daemonization, logfile and pidfile command line arguments and `sidekiqctl` binary**.
38
40
  I've [noted for years](https://www.mikeperham.com/2014/09/22/dont-daemonize-your-daemons/)
39
41
  how modern services should be managed with a proper init system.
data/Changes.md CHANGED
@@ -2,12 +2,80 @@
2
2
 
3
3
  [Sidekiq Changes](https://github.com/mperham/sidekiq/blob/master/Changes.md) | [Sidekiq Pro Changes](https://github.com/mperham/sidekiq/blob/master/Pro-Changes.md) | [Sidekiq Enterprise Changes](https://github.com/mperham/sidekiq/blob/master/Ent-Changes.md)
4
4
 
5
+ HEAD
6
+ ---------
7
+
8
+ - **Performance tuning**, Sidekiq should be 10-15% faster now [#4303, 4299,
9
+ 4269, fatkodima]
10
+ - **Dark Mode support in Web UI** (further design polish welcome!) [#4227, mperham,
11
+ fatkodima, silent-e]
12
+ - **Job-specific log levels**, allowing you to turn on debugging for
13
+ problematic workers. [fatkodima, #4287]
14
+ ```ruby
15
+ MyWorker.set(log_level: :debug).perform_async(...)
16
+ ```
17
+ - **Ad-hoc job tags**. You can tag your jobs with, e.g, subdomain, tenant, country,
18
+ locale, application, version, user/client, "alpha/beta/pro/ent", types of jobs,
19
+ teams/people responsible for jobs, additional metadata, etc.
20
+ Tags are shown on different pages with job listings. Sidekiq Pro users
21
+ can filter based on them [fatkodima, #4280]
22
+ ```ruby
23
+ class MyWorker
24
+ include Sidekiq::Worker
25
+ sidekiq_options tags: ['bank-ops', 'alpha']
26
+ ...
27
+ end
28
+ ```
29
+ - Fetch scheduled jobs in batches before pushing into specific queues.
30
+ This will decrease enqueueing time of scheduled jobs by a third. [fatkodima, #4273]
31
+ ```
32
+ ScheduledSet with 10,000 jobs
33
+ Before: 56.6 seconds
34
+ After: 39.2 seconds
35
+ ```
36
+ - Compress error backtraces before pushing into Redis, if you are
37
+ storing error backtraces, this will halve the size of your RetrySet
38
+ in Redis [fatkodima, #4272]
39
+ ```
40
+ RetrySet with 100,000 jobs
41
+ Before: 261 MB
42
+ After: 129 MB
43
+ ```
44
+ - Support display of ActiveJob 6.0 payloads in the Web UI [#4263]
45
+ - Add `SortedSet#scan` for pattern based scanning. For large sets this API will be **MUCH** faster
46
+ than standard iteration using each. [fatkodima, #4262]
47
+ ```ruby
48
+ Sidekiq::DeadSet.new.scan("UnreliableApi") do |job|
49
+ job.retry
50
+ end
51
+ ```
52
+ - Dramatically speed up SortedSet#find\_job(jid) by using Redis's ZSCAN
53
+ support, approx 10x faster. [fatkodima, #4259]
54
+ ```
55
+ zscan 0.179366 0.047727 0.227093 ( 1.161376)
56
+ enum 8.522311 0.419826 8.942137 ( 9.785079)
57
+ ```
58
+ - Respect rails' generators `test_framework` option and gracefully handle extra `worker` suffix on generator [fatkodima, #4256]
59
+ - Add ability to sort 'Enqueued' page on Web UI by position in the queue [fatkodima, #4248]
60
+ - Support `Client.push_bulk` with different delays [fatkodima, #4243]
61
+ ```ruby
62
+ Sidekiq::Client.push_bulk("class" => FooJob, "args" => [[1], [2]], "at" => [1.minute.from_now.to_f, 5.minutes.from_now.to_f])
63
+ ```
64
+ - Easier way to test enqueuing specific ActionMailer and ActiveRecord delayed jobs. Instead of manually
65
+ parsing embedded class, you can now test by fetching jobs for specific classes. [fatkodima, #4292]
66
+ ```ruby
67
+ assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs_for(FooMailer).size
68
+ ```
69
+ - Add `sidekiqmon` to gemspec executables [#4242]
70
+ - Gracefully handle `Sidekiq.logger = nil` [#4240]
71
+ - Inject Sidekiq::LogContext module if user-supplied logger does not include it [#4239]
72
+
5
73
  6.0
6
74
  ---------
7
75
 
8
76
  This release has major breaking changes. Read and test carefully in production.
9
77
 
10
- - ActiveJobs can now use `sidekiq_options` directly to configure Sidekiq
78
+ - With Rails 6.0.1+, ActiveJobs can now use `sidekiq_options` directly to configure Sidekiq
11
79
  features/internals like the retry subsystem. [#4213, pirj]
12
80
  ```ruby
13
81
  class MyJob < ActiveJob::Base
@@ -17,6 +85,13 @@ class MyJob < ActiveJob::Base
17
85
  end
18
86
  end
19
87
  ```
88
+ - Logging has been redesigned to allow for pluggable log formatters:
89
+ ```ruby
90
+ Sidekiq.configure_server do |config|
91
+ config.log_formatter = Sidekiq::Logger::Formatters::JSON.new
92
+ end
93
+ ```
94
+ See the [Logging wiki page](https://github.com/mperham/sidekiq/wiki/Logging) for more details.
20
95
  - **BREAKING CHANGE** Validate proper usage of the `REDIS_PROVIDER`
21
96
  variable. This variable is meant to hold the name of the environment
22
97
  variable which contains your Redis URL, so that you can switch Redis
@@ -4,6 +4,12 @@
4
4
 
5
5
  Please see [http://sidekiq.org/](http://sidekiq.org/) for more details and how to buy.
6
6
 
7
+ HEAD
8
+ -------------
9
+
10
+ - Periodic job registration API adjusted to avoid loading classes in
11
+ initializer [#4271]
12
+
7
13
  2.0.0
8
14
  -------------
9
15
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sidekiq (6.0.0)
4
+ sidekiq (6.0.1)
5
5
  connection_pool (>= 2.2.2)
6
6
  rack (>= 2.0.0)
7
7
  rack-protection (>= 2.0.0)
@@ -97,7 +97,7 @@ GEM
97
97
  nokogiri (1.10.4)
98
98
  mini_portile2 (~> 2.4.0)
99
99
  parallel (1.17.0)
100
- parser (2.6.3.0)
100
+ parser (2.6.4.1)
101
101
  ast (~> 2.4.0)
102
102
  pry (0.12.2)
103
103
  coderay (~> 1.1.0)
@@ -164,7 +164,7 @@ GEM
164
164
  activesupport (>= 4.0)
165
165
  sprockets (>= 3.0.0)
166
166
  sqlite3 (1.4.1)
167
- standard (0.1.2)
167
+ standard (0.1.4)
168
168
  rubocop (~> 0.72.0)
169
169
  rubocop-performance (~> 1.4.0)
170
170
  thor (0.20.3)
@@ -4,12 +4,20 @@
4
4
 
5
5
  Please see [http://sidekiq.org/](http://sidekiq.org/) for more details and how to buy.
6
6
 
7
+ 5.0.1
8
+ ---------
9
+
10
+ - Rejigger batch failures UI to add direct links to retries and scheduled jobs [#4209]
11
+ - Delete batch data with `UNLINK` [#4155]
12
+ - Fix bug where a scheduled job can lose its scheduled time when using reliable push [#4267]
13
+ - Sidekiq::JobSet#scan and #find_job APIs have been promoted to Sidekiq OSS. [#4259]
14
+
7
15
  5.0.0
8
16
  ---------
9
17
 
10
18
  - There is no significant migration from Sidekiq Pro 4.0 to 5.0
11
19
  but make sure you read the [update notes for Sidekiq
12
- 6.0](/mperham/sidekiq/blob/master/6.0-Upgrade.md).
20
+ 6.0](https://github.com/mperham/sidekiq/blob/master/6.0-Upgrade.md).
13
21
  - Removed various deprecated APIs and associated warnings.
14
22
  - **BREAKING CHANGE** Remove the `Sidekiq::Batch::Status#dead_jobs` API in favor of
15
23
  `Sidekiq::Batch::Status#dead_jids`. [#4217]
data/README.md CHANGED
@@ -3,6 +3,7 @@ Sidekiq
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/sidekiq.svg)](https://rubygems.org/gems/sidekiq)
5
5
  [![Code Climate](https://codeclimate.com/github/mperham/sidekiq.svg)](https://codeclimate.com/github/mperham/sidekiq)
6
+ [![Test Coverage](https://codeclimate.com/github/mperham/sidekiq/badges/coverage.svg)](https://codeclimate.com/github/mperham/sidekiq/coverage)
6
7
  [![Build Status](https://circleci.com/gh/mperham/sidekiq/tree/master.svg?style=svg)](https://circleci.com/gh/mperham/sidekiq/tree/master)
7
8
  [![Gitter Chat](https://badges.gitter.im/mperham/sidekiq.svg)](https://gitter.im/mperham/sidekiq)
8
9
 
@@ -5,7 +5,8 @@
5
5
  $TESTING = false
6
6
 
7
7
  #require 'ruby-prof'
8
- Bundler.require(:default)
8
+ require 'bundler/setup'
9
+ Bundler.require(:default, :load_test)
9
10
 
10
11
  require_relative '../lib/sidekiq/cli'
11
12
  require_relative '../lib/sidekiq/launcher'
@@ -102,17 +103,20 @@ iter.times do
102
103
  end
103
104
  Sidekiq.logger.error "Created #{count*iter} jobs"
104
105
 
106
+ start = Time.now
107
+
105
108
  Monitoring = Thread.new do
106
109
  watchdog("monitor thread") do
107
110
  while true
108
- sleep 0.5
111
+ sleep 0.2
109
112
  qsize = Sidekiq.redis do |conn|
110
113
  conn.llen "queue:default"
111
114
  end
112
115
  total = qsize
113
- Sidekiq.logger.error("RSS: #{Process.rss} Pending: #{total}")
116
+ #Sidekiq.logger.error("RSS: #{Process.rss} Pending: #{total}")
114
117
  if total == 0
115
- Sidekiq.logger.error("Done, now here's the latency for three jobs")
118
+ Sidekiq.logger.error("Done, #{iter * count} jobs in #{Time.now - start} sec")
119
+ Sidekiq.logger.error("Now here's the latency for three jobs")
116
120
 
117
121
  LoadWorker.perform_async(1, Time.now.to_f)
118
122
  LoadWorker.perform_async(2, Time.now.to_f)
@@ -2,8 +2,7 @@
2
2
 
3
3
  require 'sidekiq/monitor'
4
4
 
5
- if ARGV[0] == 'status'
6
- Sidekiq::Monitor::Status.new.display(ARGV[1])
7
- else
8
- Sidekiq::Monitor.print_usage
9
- end
5
+ section = "all"
6
+ section = ARGV[0] if ARGV.size == 1
7
+
8
+ Sidekiq::Monitor::Status.new.display(section)
@@ -16,6 +16,8 @@ module Sidekiq
16
16
  end
17
17
 
18
18
  def create_test_file
19
+ return unless test_framework
20
+
19
21
  if defined?(RSpec)
20
22
  create_worker_spec
21
23
  else
@@ -42,6 +44,14 @@ module Sidekiq
42
44
  )
43
45
  template "worker_test.rb.erb", template_file
44
46
  end
47
+
48
+ def file_name
49
+ @_file_name ||= super.sub(/_?worker\z/i, "")
50
+ end
51
+
52
+ def test_framework
53
+ ::Rails.application.config.generators.options[:rails][:test_framework]
54
+ end
45
55
  end
46
56
  end
47
57
  end
@@ -192,6 +192,7 @@ module Sidekiq
192
192
 
193
193
  def self.log_formatter=(log_formatter)
194
194
  @log_formatter = log_formatter
195
+ logger.formatter = log_formatter
195
196
  end
196
197
 
197
198
  def self.logger
@@ -199,6 +200,13 @@ module Sidekiq
199
200
  end
200
201
 
201
202
  def self.logger=(logger)
203
+ if logger.nil?
204
+ self.logger.level = Logger::FATAL
205
+ return self.logger
206
+ end
207
+
208
+ logger.extend(Sidekiq::LoggingUtils)
209
+
202
210
  @logger = logger
203
211
  end
204
212
 
@@ -2,23 +2,11 @@
2
2
 
3
3
  require "sidekiq"
4
4
 
5
- module Sidekiq
6
- module RedisScanner
7
- def sscan(conn, key)
8
- cursor = "0"
9
- result = []
10
- loop do
11
- cursor, values = conn.sscan(key, cursor)
12
- result.push(*values)
13
- break if cursor == "0"
14
- end
15
- result
16
- end
17
- end
5
+ require "zlib"
6
+ require "base64"
18
7
 
8
+ module Sidekiq
19
9
  class Stats
20
- include RedisScanner
21
-
22
10
  def initialize
23
11
  fetch_stats!
24
12
  end
@@ -77,11 +65,11 @@ module Sidekiq
77
65
  }
78
66
 
79
67
  processes = Sidekiq.redis { |conn|
80
- sscan(conn, "processes")
68
+ conn.sscan_each("processes").to_a
81
69
  }
82
70
 
83
71
  queues = Sidekiq.redis { |conn|
84
- sscan(conn, "queues")
72
+ conn.sscan_each("queues").to_a
85
73
  }
86
74
 
87
75
  pipe2_res = Sidekiq.redis { |conn|
@@ -142,11 +130,9 @@ module Sidekiq
142
130
  end
143
131
 
144
132
  class Queues
145
- include RedisScanner
146
-
147
133
  def lengths
148
134
  Sidekiq.redis do |conn|
149
- queues = sscan(conn, "queues")
135
+ queues = conn.sscan_each("queues").to_a
150
136
 
151
137
  lengths = conn.pipelined {
152
138
  queues.each do |queue|
@@ -225,13 +211,12 @@ module Sidekiq
225
211
  #
226
212
  class Queue
227
213
  include Enumerable
228
- extend RedisScanner
229
214
 
230
215
  ##
231
216
  # Return all known queues within Redis.
232
217
  #
233
218
  def self.all
234
- Sidekiq.redis { |c| sscan(c, "queues") }.sort.map { |q| Sidekiq::Queue.new(q) }
219
+ Sidekiq.redis { |c| c.sscan_each("queues").to_a }.sort.map { |q| Sidekiq::Queue.new(q) }
235
220
  end
236
221
 
237
222
  attr_reader :name
@@ -349,7 +334,7 @@ module Sidekiq
349
334
  end
350
335
  when "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper"
351
336
  job_class = @item["wrapped"] || args[0]
352
- if job_class == "ActionMailer::DeliveryJob"
337
+ if job_class == "ActionMailer::DeliveryJob" || job_class == "ActionMailer::MailDeliveryJob"
353
338
  # MailerClass#mailer_method
354
339
  args[0]["arguments"][0..1].join("#")
355
340
  else
@@ -372,6 +357,9 @@ module Sidekiq
372
357
  if (self["wrapped"] || args[0]) == "ActionMailer::DeliveryJob"
373
358
  # remove MailerClass, mailer_method and 'deliver_now'
374
359
  job_args.drop(3)
360
+ elsif (self["wrapped"] || args[0]) == "ActionMailer::MailDeliveryJob"
361
+ # remove MailerClass, mailer_method and 'deliver_now'
362
+ job_args.drop(3).first["args"]
375
363
  else
376
364
  job_args
377
365
  end
@@ -400,6 +388,20 @@ module Sidekiq
400
388
  Time.at(self["created_at"] || self["enqueued_at"] || 0).utc
401
389
  end
402
390
 
391
+ def tags
392
+ self["tags"] || []
393
+ end
394
+
395
+ def error_backtrace
396
+ # Cache nil values
397
+ if defined?(@error_backtrace)
398
+ @error_backtrace
399
+ else
400
+ value = self["error_backtrace"]
401
+ @error_backtrace = value && uncompress_backtrace(value)
402
+ end
403
+ end
404
+
403
405
  attr_reader :queue
404
406
 
405
407
  def latency
@@ -433,6 +435,17 @@ module Sidekiq
433
435
  Sidekiq.logger.warn "Unable to load YAML: #{ex.message}" unless Sidekiq.options[:environment] == "development"
434
436
  default
435
437
  end
438
+
439
+ def uncompress_backtrace(backtrace)
440
+ if backtrace.is_a?(Array)
441
+ # Handle old jobs with previous backtrace format
442
+ backtrace
443
+ else
444
+ decoded = Base64.decode64(backtrace)
445
+ uncompressed = Zlib::Inflate.inflate(decoded)
446
+ Marshal.load(uncompressed)
447
+ end
448
+ end
436
449
  end
437
450
 
438
451
  class SortedEntry < Job
@@ -540,6 +553,17 @@ module Sidekiq
540
553
  Sidekiq.redis { |c| c.zcard(name) }
541
554
  end
542
555
 
556
+ def scan(match, count = 100)
557
+ return to_enum(:scan, match) unless block_given?
558
+
559
+ match = "*#{match}*" unless match.include?("*")
560
+ Sidekiq.redis do |conn|
561
+ conn.zscan_each(name, match: match, count: count) do |entry, score|
562
+ yield SortedEntry.new(self, score, entry)
563
+ end
564
+ end
565
+ end
566
+
543
567
  def clear
544
568
  Sidekiq.redis do |conn|
545
569
  conn.del(name)
@@ -576,28 +600,40 @@ module Sidekiq
576
600
  end
577
601
  end
578
602
 
603
+ ##
604
+ # Fetch jobs that match a given time or Range. Job ID is an
605
+ # optional second argument.
579
606
  def fetch(score, jid = nil)
607
+ begin_score, end_score =
608
+ if score.is_a?(Range)
609
+ [score.first, score.last]
610
+ else
611
+ [score, score]
612
+ end
613
+
580
614
  elements = Sidekiq.redis { |conn|
581
- conn.zrangebyscore(name, score, score)
615
+ conn.zrangebyscore(name, begin_score, end_score, with_scores: true)
582
616
  }
583
617
 
584
618
  elements.each_with_object([]) do |element, result|
585
- entry = SortedEntry.new(self, score, element)
586
- if jid
587
- result << entry if entry.jid == jid
588
- else
589
- result << entry
590
- end
619
+ data, job_score = element
620
+ entry = SortedEntry.new(self, job_score, data)
621
+ result << entry if jid.nil? || entry.jid == jid
591
622
  end
592
623
  end
593
624
 
594
625
  ##
595
626
  # Find the job with the given JID within this sorted set.
596
- #
597
- # This is a slow, inefficient operation. Do not use under
598
- # normal conditions. Sidekiq Pro contains a faster version.
627
+ # This is a slower O(n) operation. Do not use for app logic.
599
628
  def find_job(jid)
600
- detect { |j| j.jid == jid }
629
+ Sidekiq.redis do |conn|
630
+ conn.zscan_each(name, match: "*#{jid}*", count: 100) do |entry, score|
631
+ job = JSON.parse(entry)
632
+ matched = job["jid"] == jid
633
+ return SortedEntry.new(self, score, entry) if matched
634
+ end
635
+ end
636
+ nil
601
637
  end
602
638
 
603
639
  def delete_by_value(name, value)
@@ -720,7 +756,6 @@ module Sidekiq
720
756
  #
721
757
  class ProcessSet
722
758
  include Enumerable
723
- include RedisScanner
724
759
 
725
760
  def initialize(clean_plz = true)
726
761
  cleanup if clean_plz
@@ -731,7 +766,7 @@ module Sidekiq
731
766
  def cleanup
732
767
  count = 0
733
768
  Sidekiq.redis do |conn|
734
- procs = sscan(conn, "processes").sort
769
+ procs = conn.sscan_each("processes").to_a.sort
735
770
  heartbeats = conn.pipelined {
736
771
  procs.each do |key|
737
772
  conn.hget(key, "info")
@@ -751,7 +786,7 @@ module Sidekiq
751
786
  end
752
787
 
753
788
  def each
754
- procs = Sidekiq.redis { |conn| sscan(conn, "processes") }.sort
789
+ procs = Sidekiq.redis { |conn| conn.sscan_each("processes").to_a }.sort
755
790
 
756
791
  Sidekiq.redis do |conn|
757
792
  # We're making a tradeoff here between consuming more memory instead of
@@ -885,11 +920,10 @@ module Sidekiq
885
920
  #
886
921
  class Workers
887
922
  include Enumerable
888
- include RedisScanner
889
923
 
890
924
  def each
891
925
  Sidekiq.redis do |conn|
892
- procs = sscan(conn, "processes")
926
+ procs = conn.sscan_each("processes").to_a
893
927
  procs.sort.each do |key|
894
928
  valid, workers = conn.pipelined {
895
929
  conn.exists(key)
@@ -911,7 +945,7 @@ module Sidekiq
911
945
  # which can easily get out of sync with crashy processes.
912
946
  def size
913
947
  Sidekiq.redis do |conn|
914
- procs = sscan(conn, "processes")
948
+ procs = conn.sscan_each("processes").to_a
915
949
  if procs.empty?
916
950
  0
917
951
  else