sidekiq 5.0.3 → 5.1.0
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/.github/issue_template.md +3 -1
- data/.travis.yml +5 -4
- data/Changes.md +28 -0
- data/Ent-Changes.md +12 -0
- data/Gemfile +2 -23
- data/Pro-4.0-Upgrade.md +32 -0
- data/Pro-Changes.md +76 -0
- data/README.md +4 -2
- data/Rakefile +0 -4
- data/bin/sidekiqload +1 -1
- data/lib/sidekiq/api.rb +24 -10
- data/lib/sidekiq/cli.rb +44 -21
- data/lib/sidekiq/client.rb +5 -3
- data/lib/sidekiq/delay.rb +1 -0
- data/lib/sidekiq/exception_handler.rb +2 -4
- data/lib/sidekiq/job_retry.rb +11 -10
- data/lib/sidekiq/logging.rb +6 -2
- data/lib/sidekiq/manager.rb +2 -2
- data/lib/sidekiq/middleware/server/active_record_cache.rb +11 -0
- data/lib/sidekiq/processor.rb +9 -23
- data/lib/sidekiq/rails.rb +14 -3
- data/lib/sidekiq/redis_connection.rb +11 -3
- data/lib/sidekiq/scheduled.rb +2 -4
- data/lib/sidekiq/util.rb +6 -2
- data/lib/sidekiq/version.rb +1 -1
- data/lib/sidekiq/web/action.rb +1 -1
- data/lib/sidekiq/web/helpers.rb +4 -1
- data/lib/sidekiq/worker.rb +7 -6
- data/lib/sidekiq.rb +16 -8
- data/sidekiq.gemspec +3 -1
- data/web/locales/en.yml +1 -0
- data/web/locales/es.yml +1 -0
- data/web/locales/ja.yml +5 -3
- data/web/views/queues.erb +2 -0
- metadata +14 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ec2845461ba55bb7f8424359c49ee8e339ae4be
|
4
|
+
data.tar.gz: b578722c371f8dc196294da1058279a8794e960e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c900629c592c5eb88b63863e4202667575501cf472257bbf58c211ef743ee887a288bc14744d5da50ea0ff9163285427d93a8946bfb48a26896cd55b5c7b4b3
|
7
|
+
data.tar.gz: 639a844489ccf182d8a3444594c1e5528978f536b3a7c0954d5a8d47d203002285e28ee84e0f47829d1ed7545475400ff3928b6304b65aee7e7595ccc3dd0765
|
data/.github/issue_template.md
CHANGED
@@ -4,6 +4,8 @@ Sidekiq / Pro / Enterprise version(s):
|
|
4
4
|
Please include your initializer and any error message with the full backtrace.
|
5
5
|
|
6
6
|
Are you using an old version?
|
7
|
-
Have you checked the
|
7
|
+
Have you checked the changelogs to see if your issue has been fixed in a later version?
|
8
8
|
|
9
9
|
https://github.com/mperham/sidekiq/blob/master/Changes.md
|
10
|
+
https://github.com/mperham/sidekiq/blob/master/Pro-Changes.md
|
11
|
+
https://github.com/mperham/sidekiq/blob/master/Ent-Changes.md
|
data/.travis.yml
CHANGED
data/Changes.md
CHANGED
@@ -2,6 +2,34 @@
|
|
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
|
+
5.1.0
|
6
|
+
-----------
|
7
|
+
|
8
|
+
- **NEW** Global death handlers - called when your job exhausts all
|
9
|
+
retries and dies. Now you can take action when a job fails permanently. [#3721]
|
10
|
+
- **NEW** Enable ActiveRecord query cache within jobs by default [#3718, sobrinho]
|
11
|
+
This will prevent duplicate SELECTS; cache is cleared upon any UPDATE/INSERT/DELETE.
|
12
|
+
See the issue for how to bypass the cache or disable it completely.
|
13
|
+
- Scheduler timing is now more accurate, 15 -> 5 seconds [#3734]
|
14
|
+
- Exceptions during the :startup event will now kill the process [#3717]
|
15
|
+
- Make `Sidekiq::Client.via` reentrant [#3715]
|
16
|
+
- Fix use of Sidekiq logger outside of the server process [#3714]
|
17
|
+
- Tweak `constantize` to better match Rails class lookup. [#3701, caffeinated-tech]
|
18
|
+
|
19
|
+
5.0.5
|
20
|
+
-----------
|
21
|
+
|
22
|
+
- Update gemspec to allow newer versions of the Redis gem [#3617]
|
23
|
+
- Refactor Worker.set so it can be memoized [#3602]
|
24
|
+
- Fix display of Redis URL in web footer, broken in 5.0.3 [#3560]
|
25
|
+
- Update `Sidekiq::Job#display_args` to avoid mutation [#3621]
|
26
|
+
|
27
|
+
5.0.4
|
28
|
+
-----------
|
29
|
+
|
30
|
+
- Fix "slow startup" performance regression from 5.0.2. [#3525]
|
31
|
+
- Allow users to disable ID generation since some redis providers disable the CLIENT command. [#3521]
|
32
|
+
|
5
33
|
5.0.3
|
6
34
|
-----------
|
7
35
|
|
data/Ent-Changes.md
CHANGED
@@ -4,6 +4,18 @@
|
|
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
|
+
- **NEW FEATURE** [Rolling restarts](https://github.com/mperham/sidekiq/wiki/Ent-Rolling-Restarts) - great for long running jobs!
|
11
|
+
- Adjust middleware so failed unique jobs don't affect batches [#3662]
|
12
|
+
- Add new unlimited rate limiter, useful for testing [#3743]
|
13
|
+
|
14
|
+
1.6.1
|
15
|
+
-------------
|
16
|
+
|
17
|
+
- Fix crash in rate limiter middleware when used with custom exceptions [#3604]
|
18
|
+
|
7
19
|
1.6.0
|
8
20
|
-------------
|
9
21
|
|
data/Gemfile
CHANGED
@@ -2,28 +2,7 @@ source 'https://rubygems.org'
|
|
2
2
|
gemspec
|
3
3
|
|
4
4
|
gem 'rails', '>= 5.0.1'
|
5
|
-
gem "hiredis"
|
5
|
+
#gem "hiredis"
|
6
6
|
gem 'simplecov'
|
7
7
|
gem 'minitest'
|
8
|
-
#gem '
|
9
|
-
gem 'toxiproxy'
|
10
|
-
|
11
|
-
platforms :rbx do
|
12
|
-
gem 'rubysl', '~> 2.0' # if using anything in the ruby standard library
|
13
|
-
gem 'psych' # if using yaml
|
14
|
-
gem 'rubinius-developer_tools' # if using any of coverage, debugger, profiler
|
15
|
-
end
|
16
|
-
|
17
|
-
platforms :ruby do
|
18
|
-
gem 'sqlite3'
|
19
|
-
end
|
20
|
-
|
21
|
-
platforms :mri do
|
22
|
-
gem 'pry-byebug'
|
23
|
-
gem 'ruby-prof'
|
24
|
-
end
|
25
|
-
|
26
|
-
#platforms :jruby do
|
27
|
-
#gem 'jruby-openssl'
|
28
|
-
#gem 'activerecord-jdbcsqlite3-adapter'
|
29
|
-
#end
|
8
|
+
#gem 'toxiproxy'
|
data/Pro-4.0-Upgrade.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# Welcome to Sidekiq Pro 4.0!
|
2
|
+
|
3
|
+
Sidekiq Pro 4.0 is designed to work with Sidekiq 5.0.
|
4
|
+
|
5
|
+
## What's New
|
6
|
+
|
7
|
+
* Batches now "die" if any of their jobs die. You can enumerate the set
|
8
|
+
of dead batches and their associated dead jobs. The success callback
|
9
|
+
for a dead batch will never fire unless these jobs are fixed.
|
10
|
+
```ruby
|
11
|
+
Sidekiq::Batch::DeadSet.new.each do |status|
|
12
|
+
status.dead? # => true
|
13
|
+
status.dead_jobs # => [...]
|
14
|
+
end
|
15
|
+
```
|
16
|
+
* The older `reliable_fetch` and `timed_fetch` algorithms have been
|
17
|
+
removed. Only super\_fetch is available in 4.0.
|
18
|
+
* The statsd middleware has been tweaked to remove support for legacy,
|
19
|
+
pre-3.6.0 configuration.
|
20
|
+
|
21
|
+
## Upgrade
|
22
|
+
|
23
|
+
* Upgrade to the latest Sidekiq Pro 3.x.
|
24
|
+
```ruby
|
25
|
+
gem 'sidekiq-pro', '< 4'
|
26
|
+
```
|
27
|
+
* Fix any deprecation warnings you see.
|
28
|
+
* Upgrade to 4.x.
|
29
|
+
```ruby
|
30
|
+
gem 'sidekiq-pro', '< 5'
|
31
|
+
```
|
32
|
+
|
data/Pro-Changes.md
CHANGED
@@ -4,6 +4,82 @@
|
|
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
|
+
- See the [Sidekiq Pro 4.0](Pro-4.0-Upgrade.md) release notes.
|
11
|
+
|
12
|
+
|
13
|
+
3.7.1
|
14
|
+
---------
|
15
|
+
|
16
|
+
- Deprecate timed\_fetch. Switch to super\_fetch:
|
17
|
+
```ruby
|
18
|
+
config.super_fetch!
|
19
|
+
```
|
20
|
+
|
21
|
+
|
22
|
+
3.7.0
|
23
|
+
---------
|
24
|
+
|
25
|
+
- Refactor batch job success/failure to gracefully handle several edge
|
26
|
+
cases with regard to Sidekiq::Shutdown. This should greatly reduce
|
27
|
+
the chances of seeing the long-standing "negative pending count" problem. [#3710]
|
28
|
+
|
29
|
+
|
30
|
+
3.6.1
|
31
|
+
---------
|
32
|
+
|
33
|
+
- Add support for Datadog::Statsd, it is the recommended Statsd client. [#3699]
|
34
|
+
```ruby
|
35
|
+
Sidekiq::Pro.dogstatsd = ->{ Datadog::Statsd.new("metrics.example.com", 8125) }
|
36
|
+
```
|
37
|
+
- Size the statsd connection pool based on Sidekiq's concurrency [#3700]
|
38
|
+
|
39
|
+
|
40
|
+
3.6.0
|
41
|
+
---------
|
42
|
+
|
43
|
+
This release overhauls the Statsd metrics support and adds more
|
44
|
+
metrics for tracking Pro feature usage. In your initializer:
|
45
|
+
```ruby
|
46
|
+
Sidekiq::Pro.statsd = ->{ ::Statsd.new("127.0.0.1", 8125) }
|
47
|
+
```
|
48
|
+
Sidekiq Pro will emit more metrics to Statsd:
|
49
|
+
```
|
50
|
+
jobs.expired - when a job is expired
|
51
|
+
jobs.recovered.push - when a job is recovered by reliable_push after network outage
|
52
|
+
jobs.recovered.fetch - when a job is recovered by super_fetch after process crash
|
53
|
+
batch.created - when a batch is created
|
54
|
+
batch.complete - when a batch is completed
|
55
|
+
batch.success - when a batch is successful
|
56
|
+
```
|
57
|
+
Sidekiq Pro's existing Statsd middleware has been rewritten to leverage the new API.
|
58
|
+
Everything should be backwards compatible with one deprecation notice.
|
59
|
+
|
60
|
+
|
61
|
+
3.5.4
|
62
|
+
---------
|
63
|
+
|
64
|
+
- Fix case in SuperFetch where Redis downtime can lead to processor thread death [#3684]
|
65
|
+
- Fix case where TimedFetch might not recover some pending jobs
|
66
|
+
- Fix edge case in Batch::Status#poll leading to premature completion [#3640]
|
67
|
+
- Adjust scan API to check 100 elements at a time, to minimize network round trips
|
68
|
+
when scanning large sets.
|
69
|
+
|
70
|
+
3.5.3
|
71
|
+
---------
|
72
|
+
|
73
|
+
- Restore error check for super\_fetch's job ack [#3601]
|
74
|
+
- Trim error messages saved in Batch's failure hash, preventing huge
|
75
|
+
messages from bloating Redis. [#3570]
|
76
|
+
|
77
|
+
3.5.2
|
78
|
+
---------
|
79
|
+
|
80
|
+
- Fix `Status#completed?` when run against a Batch that had succeeded
|
81
|
+
and was deleted. [#3519]
|
82
|
+
|
7
83
|
3.5.1
|
8
84
|
---------
|
9
85
|
|
data/README.md
CHANGED
@@ -77,16 +77,18 @@ Problems?
|
|
77
77
|
If you have a problem, please review the [FAQ](https://github.com/mperham/sidekiq/wiki/FAQ) and [Troubleshooting](https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting) wiki pages.
|
78
78
|
Searching the [issues](https://github.com/mperham/sidekiq/issues) for your problem is also a good idea.
|
79
79
|
|
80
|
+
Sidekiq Pro and Sidekiq Enterprise customers get private email support. You can purchase at http://sidekiq.org; email support@contribsys.com for help.
|
81
|
+
|
80
82
|
Useful resources:
|
81
83
|
|
82
84
|
* Product documentation is in the [wiki](https://github.com/mperham/sidekiq/wiki).
|
83
85
|
* Release announcements are made to the [@sidekiq](https://twitter.com/sidekiq) Twitter account.
|
84
86
|
* The [Sidekiq tag](https://stackoverflow.com/questions/tagged/sidekiq) on Stack Overflow has lots of useful Q & A.
|
85
87
|
|
86
|
-
**No support via Twitter
|
88
|
+
**No support via Twitter**
|
87
89
|
|
88
90
|
Every Friday morning is Sidekiq happy hour: I video chat and answer questions.
|
89
|
-
See the [Sidekiq support page](http://sidekiq.org/support) for details.
|
91
|
+
See the [Sidekiq support page](http://sidekiq.org/support.html) for details.
|
90
92
|
|
91
93
|
Thanks
|
92
94
|
-----------------
|
data/Rakefile
CHANGED
data/bin/sidekiqload
CHANGED
@@ -72,7 +72,7 @@ def handle_signal(launcher, sig)
|
|
72
72
|
launcher.quiet
|
73
73
|
when 'TTIN'
|
74
74
|
Thread.list.each do |thread|
|
75
|
-
Sidekiq.logger.warn "Thread TID-#{thread.object_id.to_s(36)} #{thread['label']}"
|
75
|
+
Sidekiq.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread['label']}"
|
76
76
|
if thread.backtrace
|
77
77
|
Sidekiq.logger.warn thread.backtrace.join("\n")
|
78
78
|
else
|
data/lib/sidekiq/api.rb
CHANGED
@@ -335,7 +335,7 @@ module Sidekiq
|
|
335
335
|
|
336
336
|
def display_args
|
337
337
|
# Unwrap known wrappers so they show up in a human-friendly manner in the Web UI
|
338
|
-
@
|
338
|
+
@display_args ||= case klass
|
339
339
|
when /\ASidekiq::Extensions::Delayed/
|
340
340
|
safe_load(args[0], args) do |_, _, arg|
|
341
341
|
arg
|
@@ -458,14 +458,7 @@ module Sidekiq
|
|
458
458
|
# Place job in the dead set
|
459
459
|
def kill
|
460
460
|
remove_job do |message|
|
461
|
-
|
462
|
-
Sidekiq.redis do |conn|
|
463
|
-
conn.multi do
|
464
|
-
conn.zadd('dead', now, message)
|
465
|
-
conn.zremrangebyscore('dead', '-inf', now - DeadSet.timeout)
|
466
|
-
conn.zremrangebyrank('dead', 0, - DeadSet.max_jobs)
|
467
|
-
end
|
468
|
-
end
|
461
|
+
DeadSet.new.kill(message)
|
469
462
|
end
|
470
463
|
end
|
471
464
|
|
@@ -555,7 +548,7 @@ module Sidekiq
|
|
555
548
|
end
|
556
549
|
break if elements.empty?
|
557
550
|
page -= 1
|
558
|
-
elements.each do |element, score|
|
551
|
+
elements.reverse.each do |element, score|
|
559
552
|
yield SortedEntry.new(self, score, element)
|
560
553
|
end
|
561
554
|
offset_size = initial_size - @_size
|
@@ -663,6 +656,27 @@ module Sidekiq
|
|
663
656
|
super 'dead'
|
664
657
|
end
|
665
658
|
|
659
|
+
def kill(message, opts={})
|
660
|
+
now = Time.now.to_f
|
661
|
+
Sidekiq.redis do |conn|
|
662
|
+
conn.multi do
|
663
|
+
conn.zadd(name, now.to_s, message)
|
664
|
+
conn.zremrangebyscore(name, '-inf', now - self.class.timeout)
|
665
|
+
conn.zremrangebyrank(name, 0, - self.class.max_jobs)
|
666
|
+
end
|
667
|
+
end
|
668
|
+
|
669
|
+
if opts[:notify_failure] != false
|
670
|
+
job = Sidekiq.load_json(message)
|
671
|
+
r = RuntimeError.new("Job killed by API")
|
672
|
+
r.set_backtrace(caller)
|
673
|
+
Sidekiq.death_handlers.each do |handle|
|
674
|
+
handle.call(job, r)
|
675
|
+
end
|
676
|
+
end
|
677
|
+
true
|
678
|
+
end
|
679
|
+
|
666
680
|
def retry_all
|
667
681
|
while size > 0
|
668
682
|
each(&:retry)
|
data/lib/sidekiq/cli.rb
CHANGED
@@ -89,7 +89,7 @@ module Sidekiq
|
|
89
89
|
|
90
90
|
# Before this point, the process is initializing with just the main thread.
|
91
91
|
# Starting here the process will now have multiple threads running.
|
92
|
-
fire_event(:startup)
|
92
|
+
fire_event(:startup, reverse: false, reraise: true)
|
93
93
|
|
94
94
|
logger.debug { "Client Middleware: #{Sidekiq.client_middleware.map(&:klass).join(', ')}" }
|
95
95
|
logger.debug { "Server Middleware: #{Sidekiq.server_middleware.map(&:klass).join(', ')}" }
|
@@ -135,37 +135,45 @@ module Sidekiq
|
|
135
135
|
}
|
136
136
|
end
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
when 'TERM'
|
146
|
-
# Heroku sends TERM and then waits 10 seconds for process to exit.
|
147
|
-
raise Interrupt
|
148
|
-
when 'USR1'
|
138
|
+
SIGNAL_HANDLERS = {
|
139
|
+
# Ctrl-C in terminal
|
140
|
+
'INT' => ->(cli) { raise Interrupt },
|
141
|
+
# TERM is the signal that Sidekiq must exit.
|
142
|
+
# Heroku sends TERM and then waits 30 seconds for process to exit.
|
143
|
+
'TERM' => ->(cli) { raise Interrupt },
|
144
|
+
'USR1' => ->(cli) {
|
149
145
|
Sidekiq.logger.info "Received USR1, no longer accepting new work"
|
150
|
-
launcher.quiet
|
151
|
-
|
152
|
-
|
146
|
+
cli.launcher.quiet
|
147
|
+
},
|
148
|
+
'TSTP' => ->(cli) {
|
153
149
|
Sidekiq.logger.info "Received TSTP, no longer accepting new work"
|
154
|
-
launcher.quiet
|
155
|
-
|
150
|
+
cli.launcher.quiet
|
151
|
+
},
|
152
|
+
'USR2' => ->(cli) {
|
156
153
|
if Sidekiq.options[:logfile]
|
157
154
|
Sidekiq.logger.info "Received USR2, reopening log file"
|
158
155
|
Sidekiq::Logging.reopen_logs
|
159
156
|
end
|
160
|
-
|
157
|
+
},
|
158
|
+
'TTIN' => ->(cli) {
|
161
159
|
Thread.list.each do |thread|
|
162
|
-
Sidekiq.logger.warn "Thread TID-#{thread.object_id.to_s(36)} #{thread['sidekiq_label']}"
|
160
|
+
Sidekiq.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread['sidekiq_label']}"
|
163
161
|
if thread.backtrace
|
164
162
|
Sidekiq.logger.warn thread.backtrace.join("\n")
|
165
163
|
else
|
166
164
|
Sidekiq.logger.warn "<no backtrace available>"
|
167
165
|
end
|
168
166
|
end
|
167
|
+
},
|
168
|
+
}
|
169
|
+
|
170
|
+
def handle_signal(sig)
|
171
|
+
Sidekiq.logger.debug "Got #{sig} signal"
|
172
|
+
handy = SIGNAL_HANDLERS[sig]
|
173
|
+
if handy
|
174
|
+
handy.call(self)
|
175
|
+
else
|
176
|
+
Sidekiq.logger.info { "No signal handler for #{sig}" }
|
169
177
|
end
|
170
178
|
end
|
171
179
|
|
@@ -214,6 +222,14 @@ module Sidekiq
|
|
214
222
|
@environment = cli_env || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
|
215
223
|
end
|
216
224
|
|
225
|
+
def symbolize_keys_deep!(hash)
|
226
|
+
hash.keys.each do |k|
|
227
|
+
symkey = k.respond_to?(:to_sym) ? k.to_sym : k
|
228
|
+
hash[symkey] = hash.delete k
|
229
|
+
symbolize_keys_deep! hash[symkey] if hash[symkey].kind_of? Hash
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
217
233
|
alias_method :die, :exit
|
218
234
|
alias_method :☠, :exit
|
219
235
|
|
@@ -282,7 +298,7 @@ module Sidekiq
|
|
282
298
|
if !File.exist?(options[:require]) ||
|
283
299
|
(File.directory?(options[:require]) && !File.exist?("#{options[:require]}/config/application.rb"))
|
284
300
|
logger.info "=================================================================="
|
285
|
-
logger.info " Please point sidekiq to a Rails
|
301
|
+
logger.info " Please point sidekiq to a Rails 4/5 application or a Ruby file "
|
286
302
|
logger.info " to load your worker classes with -r [DIR|FILE]."
|
287
303
|
logger.info "=================================================================="
|
288
304
|
logger.info @parser
|
@@ -386,7 +402,14 @@ module Sidekiq
|
|
386
402
|
opts = {}
|
387
403
|
if File.exist?(cfile)
|
388
404
|
opts = YAML.load(ERB.new(IO.read(cfile)).result) || opts
|
389
|
-
|
405
|
+
|
406
|
+
if opts.respond_to? :deep_symbolize_keys!
|
407
|
+
opts.deep_symbolize_keys!
|
408
|
+
else
|
409
|
+
symbolize_keys_deep!(opts)
|
410
|
+
end
|
411
|
+
|
412
|
+
opts = opts.merge(opts.delete(environment.to_sym) || {})
|
390
413
|
parse_queues(opts, opts.delete(:queues) || [])
|
391
414
|
else
|
392
415
|
# allow a non-existent config file so Sidekiq
|
data/lib/sidekiq/client.rb
CHANGED
@@ -51,7 +51,10 @@ module Sidekiq
|
|
51
51
|
# at - timestamp to schedule the job (optional), must be Numeric (e.g. Time.now.to_f)
|
52
52
|
# retry - whether to retry this job if it fails, default true or an integer number of retries
|
53
53
|
# backtrace - whether to save any error backtrace, default false
|
54
|
-
#
|
54
|
+
#
|
55
|
+
# If class is set to the class name, the jobs' options will be based on Sidekiq's default
|
56
|
+
# worker options. Otherwise, they will be based on the job class's options.
|
57
|
+
#
|
55
58
|
# Any options valid for a worker class's sidekiq_options are also available here.
|
56
59
|
#
|
57
60
|
# All options must be strings, not symbols. NB: because we are serializing to JSON, all
|
@@ -116,11 +119,10 @@ module Sidekiq
|
|
116
119
|
def self.via(pool)
|
117
120
|
raise ArgumentError, "No pool given" if pool.nil?
|
118
121
|
current_sidekiq_pool = Thread.current[:sidekiq_via_pool]
|
119
|
-
raise RuntimeError, "Sidekiq::Client.via is not re-entrant" if current_sidekiq_pool && current_sidekiq_pool != pool
|
120
122
|
Thread.current[:sidekiq_via_pool] = pool
|
121
123
|
yield
|
122
124
|
ensure
|
123
|
-
Thread.current[:sidekiq_via_pool] =
|
125
|
+
Thread.current[:sidekiq_via_pool] = current_sidekiq_pool
|
124
126
|
end
|
125
127
|
|
126
128
|
class << self
|
data/lib/sidekiq/delay.rb
CHANGED
@@ -7,11 +7,10 @@ module Sidekiq
|
|
7
7
|
class Logger
|
8
8
|
def call(ex, ctxHash)
|
9
9
|
Sidekiq.logger.warn(Sidekiq.dump_json(ctxHash)) if !ctxHash.empty?
|
10
|
-
Sidekiq.logger.warn
|
11
|
-
Sidekiq.logger.warn
|
10
|
+
Sidekiq.logger.warn("#{ex.class.name}: #{ex.message}")
|
11
|
+
Sidekiq.logger.warn(ex.backtrace.join("\n")) unless ex.backtrace.nil?
|
12
12
|
end
|
13
13
|
|
14
|
-
# Set up default handler which just logs the error
|
15
14
|
Sidekiq.error_handlers << Sidekiq::ExceptionHandler::Logger.new
|
16
15
|
end
|
17
16
|
|
@@ -26,6 +25,5 @@ module Sidekiq
|
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
31
29
|
end
|
data/lib/sidekiq/job_retry.rb
CHANGED
@@ -172,10 +172,18 @@ module Sidekiq
|
|
172
172
|
def retries_exhausted(worker, msg, exception)
|
173
173
|
logger.debug { "Retries exhausted for job" }
|
174
174
|
begin
|
175
|
-
block = worker && worker.sidekiq_retries_exhausted_block
|
175
|
+
block = worker && worker.sidekiq_retries_exhausted_block
|
176
176
|
block.call(msg, exception) if block
|
177
177
|
rescue => e
|
178
|
-
handle_exception(e, { context: "Error calling retries_exhausted
|
178
|
+
handle_exception(e, { context: "Error calling retries_exhausted", job: msg })
|
179
|
+
end
|
180
|
+
|
181
|
+
Sidekiq.death_handlers.each do |handler|
|
182
|
+
begin
|
183
|
+
handler.call(msg, exception)
|
184
|
+
rescue => e
|
185
|
+
handle_exception(e, { context: "Error calling death handler", job: msg })
|
186
|
+
end
|
179
187
|
end
|
180
188
|
|
181
189
|
send_to_morgue(msg) unless msg['dead'] == false
|
@@ -184,14 +192,7 @@ module Sidekiq
|
|
184
192
|
def send_to_morgue(msg)
|
185
193
|
Sidekiq.logger.info { "Adding dead #{msg['class']} job #{msg['jid']}" }
|
186
194
|
payload = Sidekiq.dump_json(msg)
|
187
|
-
|
188
|
-
Sidekiq.redis do |conn|
|
189
|
-
conn.multi do
|
190
|
-
conn.zadd('dead', now, payload)
|
191
|
-
conn.zremrangebyscore('dead', '-inf', now - DeadSet.timeout)
|
192
|
-
conn.zremrangebyrank('dead', 0, -DeadSet.max_jobs)
|
193
|
-
end
|
194
|
-
end
|
195
|
+
DeadSet.new.kill(payload, notify_failure: false)
|
195
196
|
end
|
196
197
|
|
197
198
|
def retry_attempts_from(msg_retry, default)
|
data/lib/sidekiq/logging.rb
CHANGED
@@ -11,7 +11,7 @@ module Sidekiq
|
|
11
11
|
|
12
12
|
# Provide a call() method that returns the formatted message.
|
13
13
|
def call(severity, time, program_name, message)
|
14
|
-
"#{time.utc.iso8601(3)} #{::Process.pid} TID-#{
|
14
|
+
"#{time.utc.iso8601(3)} #{::Process.pid} TID-#{Sidekiq::Logging.tid}#{context} #{severity}: #{message}\n"
|
15
15
|
end
|
16
16
|
|
17
17
|
def context
|
@@ -22,10 +22,14 @@ module Sidekiq
|
|
22
22
|
|
23
23
|
class WithoutTimestamp < Pretty
|
24
24
|
def call(severity, time, program_name, message)
|
25
|
-
"#{::Process.pid} TID-#{
|
25
|
+
"#{::Process.pid} TID-#{Sidekiq::Logging.tid}#{context} #{severity}: #{message}\n"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
def self.tid
|
30
|
+
Thread.current['sidekiq_tid'] ||= (Thread.current.object_id ^ ::Process.pid).to_s(36)
|
31
|
+
end
|
32
|
+
|
29
33
|
def self.job_hash_context(job_hash)
|
30
34
|
# If we're using a wrapper class, like ActiveJob, use the "wrapped"
|
31
35
|
# attribute to expose the underlying thing.
|
data/lib/sidekiq/manager.rb
CHANGED
@@ -54,7 +54,7 @@ module Sidekiq
|
|
54
54
|
|
55
55
|
logger.info { "Terminating quiet workers" }
|
56
56
|
@workers.each { |x| x.terminate }
|
57
|
-
fire_event(:quiet, true)
|
57
|
+
fire_event(:quiet, reverse: true)
|
58
58
|
end
|
59
59
|
|
60
60
|
# hack for quicker development / testing environment #2774
|
@@ -62,7 +62,7 @@ module Sidekiq
|
|
62
62
|
|
63
63
|
def stop(deadline)
|
64
64
|
quiet
|
65
|
-
fire_event(:shutdown, true)
|
65
|
+
fire_event(:shutdown, reverse: true)
|
66
66
|
|
67
67
|
# some of the shutdown events can be async,
|
68
68
|
# we don't have any way to know when they're done but
|
data/lib/sidekiq/processor.rb
CHANGED
@@ -111,9 +111,7 @@ module Sidekiq
|
|
111
111
|
if !@down
|
112
112
|
@down = Time.now
|
113
113
|
logger.error("Error fetching job: #{ex}")
|
114
|
-
ex
|
115
|
-
logger.error(bt)
|
116
|
-
end
|
114
|
+
handle_exception(ex)
|
117
115
|
end
|
118
116
|
sleep(1)
|
119
117
|
nil
|
@@ -126,7 +124,7 @@ module Sidekiq
|
|
126
124
|
pristine = cloned(job_hash)
|
127
125
|
|
128
126
|
Sidekiq::Logging.with_job_hash_context(job_hash) do
|
129
|
-
@retrier.global(
|
127
|
+
@retrier.global(pristine, queue) do
|
130
128
|
@logging.call(job_hash, queue) do
|
131
129
|
stats(pristine, queue) do
|
132
130
|
# Rails 5 requires a Reloader to wrap code execution. In order to
|
@@ -137,7 +135,7 @@ module Sidekiq
|
|
137
135
|
klass = constantize(job_hash['class'.freeze])
|
138
136
|
worker = klass.new
|
139
137
|
worker.jid = job_hash['jid'.freeze]
|
140
|
-
@retrier.local(worker,
|
138
|
+
@retrier.local(worker, pristine, queue) do
|
141
139
|
yield worker
|
142
140
|
end
|
143
141
|
end
|
@@ -159,7 +157,8 @@ module Sidekiq
|
|
159
157
|
job_hash = Sidekiq.load_json(jobstr)
|
160
158
|
rescue => ex
|
161
159
|
handle_exception(ex, { :context => "Invalid JSON for job", :jobstr => jobstr })
|
162
|
-
|
160
|
+
# we can't notify because the job isn't a valid hash payload.
|
161
|
+
DeadSet.new.kill(jobstr, notify_failure: false)
|
163
162
|
ack = true
|
164
163
|
raise
|
165
164
|
end
|
@@ -184,31 +183,16 @@ module Sidekiq
|
|
184
183
|
end
|
185
184
|
end
|
186
185
|
|
187
|
-
def send_to_morgue(msg)
|
188
|
-
now = Time.now.to_f
|
189
|
-
Sidekiq.redis do |conn|
|
190
|
-
conn.multi do
|
191
|
-
conn.zadd('dead', now, msg)
|
192
|
-
conn.zremrangebyscore('dead', '-inf', now - DeadSet.timeout)
|
193
|
-
conn.zremrangebyrank('dead', 0, -DeadSet.max_jobs)
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
186
|
def execute_job(worker, cloned_args)
|
199
187
|
worker.perform(*cloned_args)
|
200
188
|
end
|
201
189
|
|
202
|
-
def thread_identity
|
203
|
-
@str ||= Thread.current.object_id.to_s(36)
|
204
|
-
end
|
205
|
-
|
206
190
|
WORKER_STATE = Concurrent::Map.new
|
207
191
|
PROCESSED = Concurrent::AtomicFixnum.new
|
208
192
|
FAILURE = Concurrent::AtomicFixnum.new
|
209
193
|
|
210
194
|
def stats(job_hash, queue)
|
211
|
-
tid =
|
195
|
+
tid = Sidekiq::Logging.tid
|
212
196
|
WORKER_STATE[tid] = {:queue => queue, :payload => job_hash, :run_at => Time.now.to_i }
|
213
197
|
|
214
198
|
begin
|
@@ -234,7 +218,9 @@ module Sidekiq
|
|
234
218
|
names.shift if names.empty? || names.first.empty?
|
235
219
|
|
236
220
|
names.inject(Object) do |constant, name|
|
237
|
-
|
221
|
+
# the false flag limits search for name to under the constant namespace
|
222
|
+
# which mimics Rails' behaviour
|
223
|
+
constant.const_defined?(name, false) ? constant.const_get(name, false) : constant.const_missing(name)
|
238
224
|
end
|
239
225
|
end
|
240
226
|
|
data/lib/sidekiq/rails.rb
CHANGED
@@ -9,10 +9,15 @@ module Sidekiq
|
|
9
9
|
# class block. Definitely before config/environments/*.rb and
|
10
10
|
# config/initializers/*.rb.
|
11
11
|
config.before_configuration do
|
12
|
-
if
|
12
|
+
if defined?(::ActiveRecord)
|
13
13
|
Sidekiq.server_middleware do |chain|
|
14
|
-
|
15
|
-
|
14
|
+
if ::Rails::VERSION::MAJOR < 5
|
15
|
+
require 'sidekiq/middleware/server/active_record'
|
16
|
+
chain.add Sidekiq::Middleware::Server::ActiveRecord
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'sidekiq/middleware/server/active_record_cache'
|
20
|
+
chain.add Sidekiq::Middleware::Server::ActiveRecordCache
|
16
21
|
end
|
17
22
|
end
|
18
23
|
end
|
@@ -49,3 +54,9 @@ module Sidekiq
|
|
49
54
|
end
|
50
55
|
end if defined?(::Rails)
|
51
56
|
end
|
57
|
+
|
58
|
+
if defined?(::Rails) && ::Rails::VERSION::MAJOR < 4
|
59
|
+
$stderr.puts("**************************************************")
|
60
|
+
$stderr.puts("⛔️ WARNING: Sidekiq server is no longer supported by Rails 3.2 - please ensure your server/workers are updated")
|
61
|
+
$stderr.puts("**************************************************")
|
62
|
+
end
|
@@ -12,7 +12,7 @@ module Sidekiq
|
|
12
12
|
options[key.to_sym] = options.delete(key)
|
13
13
|
end
|
14
14
|
|
15
|
-
options[:id]
|
15
|
+
options[:id] = "Sidekiq-#{Sidekiq.server? ? "server" : "client"}-PID-#{$$}" if !options.has_key?(:id)
|
16
16
|
options[:url] ||= determine_redis_provider
|
17
17
|
|
18
18
|
size = options[:size] || (Sidekiq.server? ? (Sidekiq.options[:concurrency] + 5) : 5)
|
@@ -38,7 +38,7 @@ module Sidekiq
|
|
38
38
|
# - enterprise's leader election
|
39
39
|
# - enterprise's cron support
|
40
40
|
def verify_sizing(size, concurrency)
|
41
|
-
raise ArgumentError, "Your Redis connection pool is too small for Sidekiq to work. Your pool has #{size} connections but
|
41
|
+
raise ArgumentError, "Your Redis connection pool is too small for Sidekiq to work. Your pool has #{size} connections but must have at least #{concurrency + 2}" if size <= concurrency
|
42
42
|
end
|
43
43
|
|
44
44
|
def build_client(options)
|
@@ -101,7 +101,15 @@ module Sidekiq
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def determine_redis_provider
|
104
|
-
|
104
|
+
# If you have this in your environment:
|
105
|
+
# MY_REDIS_URL=redis://hostname.example.com:1238/4
|
106
|
+
# then set:
|
107
|
+
# REDIS_PROVIDER=MY_REDIS_URL
|
108
|
+
# and Sidekiq will find your custom URL variable with no custom
|
109
|
+
# initialization code at all.
|
110
|
+
ENV[
|
111
|
+
ENV['REDIS_PROVIDER'] || 'REDIS_URL'
|
112
|
+
]
|
105
113
|
end
|
106
114
|
|
107
115
|
end
|
data/lib/sidekiq/scheduled.rb
CHANGED
@@ -79,9 +79,7 @@ module Sidekiq
|
|
79
79
|
# Most likely a problem with redis networking.
|
80
80
|
# Punt and try again at the next interval
|
81
81
|
logger.error ex.message
|
82
|
-
ex
|
83
|
-
logger.error(bt)
|
84
|
-
end
|
82
|
+
handle_exception(ex)
|
85
83
|
end
|
86
84
|
end
|
87
85
|
|
@@ -95,7 +93,7 @@ module Sidekiq
|
|
95
93
|
# if poll_interval_average hasn't been calculated yet, we can
|
96
94
|
# raise an error trying to reach Redis.
|
97
95
|
logger.error ex.message
|
98
|
-
|
96
|
+
handle_exception(ex)
|
99
97
|
sleep 5
|
100
98
|
end
|
101
99
|
|
data/lib/sidekiq/util.rb
CHANGED
@@ -21,7 +21,7 @@ module Sidekiq
|
|
21
21
|
|
22
22
|
def safe_thread(name, &block)
|
23
23
|
Thread.new do
|
24
|
-
Thread.current['sidekiq_label'] = name
|
24
|
+
Thread.current['sidekiq_label'.freeze] = name
|
25
25
|
watchdog(name, &block)
|
26
26
|
end
|
27
27
|
end
|
@@ -46,7 +46,10 @@ module Sidekiq
|
|
46
46
|
@@identity ||= "#{hostname}:#{$$}:#{process_nonce}"
|
47
47
|
end
|
48
48
|
|
49
|
-
def fire_event(event,
|
49
|
+
def fire_event(event, options={})
|
50
|
+
reverse = options[:reverse]
|
51
|
+
reraise = options[:reraise]
|
52
|
+
|
50
53
|
arr = Sidekiq.options[:lifecycle_events][event]
|
51
54
|
arr.reverse! if reverse
|
52
55
|
arr.each do |block|
|
@@ -54,6 +57,7 @@ module Sidekiq
|
|
54
57
|
block.call
|
55
58
|
rescue => ex
|
56
59
|
handle_exception(ex, { context: "Exception during Sidekiq lifecycle event.", event: event })
|
60
|
+
raise ex if reraise
|
57
61
|
end
|
58
62
|
end
|
59
63
|
arr.clear
|
data/lib/sidekiq/version.rb
CHANGED
data/lib/sidekiq/web/action.rb
CHANGED
@@ -77,7 +77,7 @@ module Sidekiq
|
|
77
77
|
private
|
78
78
|
|
79
79
|
def _erb(file, locals)
|
80
|
-
locals.each {|k, v| define_singleton_method(k){ v } } if locals
|
80
|
+
locals.each {|k, v| define_singleton_method(k){ v } unless (singleton_methods.include? k)} if locals
|
81
81
|
|
82
82
|
if file.kind_of?(String)
|
83
83
|
ERB.new(file).result(binding)
|
data/lib/sidekiq/web/helpers.rb
CHANGED
data/lib/sidekiq/worker.rb
CHANGED
@@ -41,12 +41,13 @@ module Sidekiq
|
|
41
41
|
# SomeWorker.set(queue: 'foo').perform_async(....)
|
42
42
|
#
|
43
43
|
class Setter
|
44
|
-
def initialize(opts)
|
44
|
+
def initialize(klass, opts)
|
45
|
+
@klass = klass
|
45
46
|
@opts = opts
|
46
47
|
end
|
47
48
|
|
48
49
|
def perform_async(*args)
|
49
|
-
@
|
50
|
+
@klass.client_push(@opts.merge('args'.freeze => args, 'class'.freeze => @klass))
|
50
51
|
end
|
51
52
|
|
52
53
|
# +interval+ must be a timestamp, numeric or something that acts
|
@@ -56,10 +57,10 @@ module Sidekiq
|
|
56
57
|
now = Time.now.to_f
|
57
58
|
ts = (int < 1_000_000_000 ? now + int : int)
|
58
59
|
|
59
|
-
@opts.merge
|
60
|
+
payload = @opts.merge('class'.freeze => @klass, 'args'.freeze => args, 'at'.freeze => ts)
|
60
61
|
# Optimization to enqueue something now that is scheduled to go out now or in the past
|
61
|
-
|
62
|
-
@
|
62
|
+
payload.delete('at'.freeze) if ts <= now
|
63
|
+
@klass.client_push(payload)
|
63
64
|
end
|
64
65
|
alias_method :perform_at, :perform_in
|
65
66
|
end
|
@@ -79,7 +80,7 @@ module Sidekiq
|
|
79
80
|
end
|
80
81
|
|
81
82
|
def set(options)
|
82
|
-
Setter.new(options
|
83
|
+
Setter.new(self, options)
|
83
84
|
end
|
84
85
|
|
85
86
|
def perform_async(*args)
|
data/lib/sidekiq.rb
CHANGED
@@ -23,8 +23,9 @@ module Sidekiq
|
|
23
23
|
environment: nil,
|
24
24
|
timeout: 8,
|
25
25
|
poll_interval_average: nil,
|
26
|
-
average_scheduled_poll_interval:
|
26
|
+
average_scheduled_poll_interval: 5,
|
27
27
|
error_handlers: [],
|
28
|
+
death_handlers: [],
|
28
29
|
lifecycle_events: {
|
29
30
|
startup: [],
|
30
31
|
quiet: [],
|
@@ -156,16 +157,23 @@ module Sidekiq
|
|
156
157
|
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
157
158
|
end
|
158
159
|
|
160
|
+
def self.default_retries_exhausted=(prok)
|
161
|
+
logger.info { "default_retries_exhausted is deprecated, please use `config.death_handlers << -> {|job, ex| }`" }
|
162
|
+
return nil unless prok
|
163
|
+
death_handlers << prok
|
164
|
+
end
|
165
|
+
|
166
|
+
##
|
167
|
+
# Death handlers are called when all retries for a job have been exhausted and
|
168
|
+
# the job dies. It's the notification to your application
|
169
|
+
# that this job will not succeed without manual intervention.
|
170
|
+
#
|
159
171
|
# Sidekiq.configure_server do |config|
|
160
|
-
# config.
|
172
|
+
# config.death_handlers << ->(job, ex) do
|
161
173
|
# end
|
162
174
|
# end
|
163
|
-
def self.
|
164
|
-
|
165
|
-
end
|
166
|
-
@default_retries_exhausted = ->(job, ex) { }
|
167
|
-
def self.default_retries_exhausted
|
168
|
-
@default_retries_exhausted
|
175
|
+
def self.death_handlers
|
176
|
+
options[:death_handlers]
|
169
177
|
end
|
170
178
|
|
171
179
|
def self.load_json(string)
|
data/sidekiq.gemspec
CHANGED
@@ -15,7 +15,9 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.name = "sidekiq"
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = Sidekiq::VERSION
|
18
|
-
gem.
|
18
|
+
gem.required_ruby_version = ">= 2.2.2"
|
19
|
+
|
20
|
+
gem.add_dependency 'redis', '>= 3.3.4', '< 5'
|
19
21
|
gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.0'
|
20
22
|
gem.add_dependency 'concurrent-ruby', '~> 1.0'
|
21
23
|
gem.add_dependency 'rack-protection', '>= 1.5.0'
|
data/web/locales/en.yml
CHANGED
data/web/locales/es.yml
CHANGED
data/web/locales/ja.yml
CHANGED
@@ -60,9 +60,9 @@ ja:
|
|
60
60
|
SixMonths: 6 ヶ月
|
61
61
|
Batches: バッチ
|
62
62
|
Failures: 失敗
|
63
|
-
DeadJobs:
|
64
|
-
NoDeadJobsFound:
|
65
|
-
Dead:
|
63
|
+
DeadJobs: デッドジョブ
|
64
|
+
NoDeadJobsFound: デッドジョブはありません
|
65
|
+
Dead: デッド
|
66
66
|
Processes: プロセス
|
67
67
|
Thread: スレッド
|
68
68
|
Threads: スレッド
|
@@ -76,3 +76,5 @@ ja:
|
|
76
76
|
Plugins: プラグイン
|
77
77
|
NotYetEnqueued: キューに入っていません
|
78
78
|
CreatedAt: 作成日時
|
79
|
+
BackToApp: アプリに戻る
|
80
|
+
Latency: レイテンシ
|
data/web/views/queues.erb
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
<thead>
|
6
6
|
<th><%= t('Queue') %></th>
|
7
7
|
<th><%= t('Size') %></th>
|
8
|
+
<th><%= t('Latency') %></th>
|
8
9
|
<th><%= t('Actions') %></th>
|
9
10
|
</thead>
|
10
11
|
<% @queues.each do |queue| %>
|
@@ -16,6 +17,7 @@
|
|
16
17
|
<% end %>
|
17
18
|
</td>
|
18
19
|
<td><%= number_with_delimiter(queue.size) %> </td>
|
20
|
+
<td><%= number_with_delimiter(queue.latency.round(2)) %> </td>
|
19
21
|
<td class="delete-confirm">
|
20
22
|
<form action="<%=root_path %>queues/<%= CGI.escape(queue.name) %>" method="post">
|
21
23
|
<%= csrf_tag %>
|
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: 5.0
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Perham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-02 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.3'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: 3.3.
|
19
|
+
version: 3.3.4
|
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.3'
|
30
27
|
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
|
-
version: 3.3.
|
29
|
+
version: 3.3.4
|
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
|
@@ -169,6 +169,7 @@ files:
|
|
169
169
|
- LICENSE
|
170
170
|
- Pro-2.0-Upgrade.md
|
171
171
|
- Pro-3.0-Upgrade.md
|
172
|
+
- Pro-4.0-Upgrade.md
|
172
173
|
- Pro-Changes.md
|
173
174
|
- README.md
|
174
175
|
- Rakefile
|
@@ -200,6 +201,7 @@ files:
|
|
200
201
|
- lib/sidekiq/middleware/chain.rb
|
201
202
|
- lib/sidekiq/middleware/i18n.rb
|
202
203
|
- lib/sidekiq/middleware/server/active_record.rb
|
204
|
+
- lib/sidekiq/middleware/server/active_record_cache.rb
|
203
205
|
- lib/sidekiq/paginator.rb
|
204
206
|
- lib/sidekiq/processor.rb
|
205
207
|
- lib/sidekiq/rails.rb
|
@@ -281,7 +283,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
281
283
|
requirements:
|
282
284
|
- - ">="
|
283
285
|
- !ruby/object:Gem::Version
|
284
|
-
version:
|
286
|
+
version: 2.2.2
|
285
287
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
286
288
|
requirements:
|
287
289
|
- - ">="
|
@@ -289,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
289
291
|
version: '0'
|
290
292
|
requirements: []
|
291
293
|
rubyforge_project:
|
292
|
-
rubygems_version: 2.
|
294
|
+
rubygems_version: 2.6.13
|
293
295
|
signing_key:
|
294
296
|
specification_version: 4
|
295
297
|
summary: Simple, efficient background processing for Ruby
|