sidekiq 5.2.1 → 6.0.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 +5 -5
- data/.circleci/config.yml +61 -0
- data/.gitignore +1 -1
- data/.standard.yml +20 -0
- data/6.0-Upgrade.md +70 -0
- data/COMM-LICENSE +11 -9
- data/Changes.md +79 -0
- data/Ent-2.0-Upgrade.md +37 -0
- data/Ent-Changes.md +30 -1
- data/Gemfile +19 -9
- data/Gemfile.lock +196 -0
- data/Pro-5.0-Upgrade.md +25 -0
- data/Pro-Changes.md +29 -0
- data/README.md +17 -31
- data/Rakefile +6 -4
- data/bin/sidekiqload +27 -23
- data/bin/sidekiqmon +9 -0
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
- data/lib/generators/sidekiq/worker_generator.rb +12 -14
- data/lib/sidekiq.rb +56 -43
- data/lib/sidekiq/api.rb +141 -148
- data/lib/sidekiq/cli.rb +142 -207
- data/lib/sidekiq/client.rb +45 -46
- data/lib/sidekiq/delay.rb +5 -6
- data/lib/sidekiq/exception_handler.rb +10 -12
- data/lib/sidekiq/extensions/action_mailer.rb +10 -20
- data/lib/sidekiq/extensions/active_record.rb +9 -7
- data/lib/sidekiq/extensions/class_methods.rb +9 -7
- data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
- data/lib/sidekiq/fetch.rb +5 -6
- data/lib/sidekiq/job_logger.rb +39 -9
- data/lib/sidekiq/job_retry.rb +62 -54
- data/lib/sidekiq/launcher.rb +60 -52
- data/lib/sidekiq/logger.rb +69 -0
- data/lib/sidekiq/manager.rb +10 -12
- data/lib/sidekiq/middleware/chain.rb +3 -2
- data/lib/sidekiq/middleware/i18n.rb +5 -7
- data/lib/sidekiq/monitor.rb +148 -0
- data/lib/sidekiq/paginator.rb +11 -12
- data/lib/sidekiq/processor.rb +98 -62
- data/lib/sidekiq/rails.rb +24 -29
- data/lib/sidekiq/redis_connection.rb +34 -21
- data/lib/sidekiq/scheduled.rb +17 -19
- data/lib/sidekiq/testing.rb +22 -23
- data/lib/sidekiq/testing/inline.rb +2 -1
- data/lib/sidekiq/util.rb +17 -14
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web.rb +41 -49
- data/lib/sidekiq/web/action.rb +14 -10
- data/lib/sidekiq/web/application.rb +67 -58
- data/lib/sidekiq/web/helpers.rb +72 -66
- data/lib/sidekiq/web/router.rb +17 -14
- data/lib/sidekiq/worker.rb +134 -91
- data/sidekiq.gemspec +16 -18
- data/web/assets/javascripts/dashboard.js +14 -23
- data/web/assets/stylesheets/application.css +35 -2
- data/web/assets/stylesheets/bootstrap.css +1 -1
- data/web/locales/ar.yml +1 -0
- data/web/locales/en.yml +1 -0
- data/web/locales/ja.yml +2 -1
- data/web/views/_nav.erb +3 -17
- data/web/views/queue.erb +1 -0
- data/web/views/queues.erb +1 -1
- data/web/views/retries.erb +4 -0
- metadata +31 -26
- data/.travis.yml +0 -14
- data/bin/sidekiqctl +0 -99
- data/lib/sidekiq/core_ext.rb +0 -1
- data/lib/sidekiq/logging.rb +0 -122
- data/lib/sidekiq/middleware/server/active_record.rb +0 -23
data/Pro-5.0-Upgrade.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Welcome to Sidekiq Pro 5.0!
|
2
|
+
|
3
|
+
Sidekiq Pro 5.0 is mainly a cleanup release for Sidekiq 6.0. The
|
4
|
+
migration should be as close to trivial as a major version bump can be.
|
5
|
+
Note that Sidekiq 6.0 does have major breaking changes.
|
6
|
+
|
7
|
+
## What's New
|
8
|
+
|
9
|
+
* New localizations for the Sidekiq Pro Web UI: ES, ZH, PT, JA, RU
|
10
|
+
* Removed deprecated APIs and warnings.
|
11
|
+
* Various changes for Sidekiq 6.0
|
12
|
+
* Requires Ruby 2.5+ and Redis 4.0+
|
13
|
+
* Requires Sidekiq 6.0+.
|
14
|
+
|
15
|
+
## Upgrade
|
16
|
+
|
17
|
+
* Upgrade to the latest Sidekiq Pro 4.x.
|
18
|
+
```ruby
|
19
|
+
gem 'sidekiq-pro', '< 5'
|
20
|
+
```
|
21
|
+
* Fix any deprecation warnings you see.
|
22
|
+
* Upgrade to 5.x.
|
23
|
+
```ruby
|
24
|
+
gem 'sidekiq-pro', '< 6'
|
25
|
+
```
|
data/Pro-Changes.md
CHANGED
@@ -4,6 +4,34 @@
|
|
4
4
|
|
5
5
|
Please see [http://sidekiq.org/](http://sidekiq.org/) for more details and how to buy.
|
6
6
|
|
7
|
+
5.0.0
|
8
|
+
---------
|
9
|
+
|
10
|
+
- There is no significant migration from Sidekiq Pro 4.0 to 5.0
|
11
|
+
but make sure you read the [update notes for Sidekiq
|
12
|
+
6.0](/mperham/sidekiq/blob/master/6.0-Upgrade.md).
|
13
|
+
- Removed various deprecated APIs and associated warnings.
|
14
|
+
- **BREAKING CHANGE** Remove the `Sidekiq::Batch::Status#dead_jobs` API in favor of
|
15
|
+
`Sidekiq::Batch::Status#dead_jids`. [#4217]
|
16
|
+
- Update Sidekiq Pro codebase to use StandardRB formatting
|
17
|
+
- Fix lingering "b-XXX-died" elements in Redis which could cause
|
18
|
+
excessive memory usage. [#4217]
|
19
|
+
- Add ES translations, see issues [#3949](https://github.com/mperham/sidekiq/issues/3949) and [#3951](https://github.com/mperham/sidekiq/issues/3951) to add your own language.
|
20
|
+
|
21
|
+
4.0.5
|
22
|
+
---------
|
23
|
+
|
24
|
+
- Increase super\_fetch retriever thread count from 1 to 2 to make it
|
25
|
+
less sensitive to Redis latency.
|
26
|
+
- Better handling of invalid job JSON by reliable scheduler [#4053]
|
27
|
+
- Added ZH, PT, JA and RU translations.
|
28
|
+
|
29
|
+
4.0.4
|
30
|
+
---------
|
31
|
+
|
32
|
+
- Update Sidekiq::Client patches to work with new Module#prepend
|
33
|
+
mechanism in Sidekiq 5.2.0. [#3930]
|
34
|
+
|
7
35
|
4.0.3
|
8
36
|
---------
|
9
37
|
|
@@ -26,6 +54,7 @@ batch.on(:death, ...)
|
|
26
54
|
---------
|
27
55
|
|
28
56
|
- Fix incompatibility with the statsd-ruby gem [#3740]
|
57
|
+
- Add tags to Statsd metrics when using Datadog [#3744]
|
29
58
|
|
30
59
|
4.0.0
|
31
60
|
---------
|
data/README.md
CHANGED
@@ -3,7 +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
|
-
[![Build Status](https://
|
6
|
+
[![Build Status](https://circleci.com/gh/mperham/sidekiq/tree/master.svg?style=svg)](https://circleci.com/gh/mperham/sidekiq/tree/master)
|
7
7
|
[![Gitter Chat](https://badges.gitter.im/mperham/sidekiq.svg)](https://gitter.im/mperham/sidekiq)
|
8
8
|
|
9
9
|
|
@@ -13,32 +13,26 @@ Sidekiq uses threads to handle many jobs at the same time in the
|
|
13
13
|
same process. It does not require Rails but will integrate tightly with
|
14
14
|
Rails to make background processing dead simple.
|
15
15
|
|
16
|
-
Sidekiq is compatible with Resque. It uses the exact same
|
17
|
-
message format as Resque so it can integrate into an existing Resque processing farm.
|
18
|
-
You can have Sidekiq and Resque run side-by-side at the same time and
|
19
|
-
use the Resque client to enqueue jobs in Redis to be processed by Sidekiq.
|
20
|
-
|
21
16
|
Performance
|
22
17
|
---------------
|
23
18
|
|
24
|
-
Version | Latency | Garbage created for
|
25
|
-
|
26
|
-
Sidekiq
|
27
|
-
Sidekiq
|
28
|
-
|
29
|
-
|
19
|
+
Version | Latency | Garbage created for 10k jobs | Time to process 100k jobs | Throughput | Ruby
|
20
|
+
-----------------|------|---------|---------|------------------------|-----
|
21
|
+
Sidekiq 6.0.0 | 3 ms | 156 MB | 19 sec | **5200 jobs/sec** | MRI 2.6.3
|
22
|
+
Sidekiq 4.0.0 | 10 ms | 151 MB | 22 sec | 4500 jobs/sec |
|
23
|
+
Sidekiq 3.5.1 | 22 ms | 1257 MB | 125 sec | 800 jobs/sec |
|
24
|
+
Resque 1.25.2 | - | - | 420 sec | 240 jobs/sec |
|
25
|
+
DelayedJob 4.1.1 | - | - | 465 sec | 215 jobs/sec |
|
30
26
|
|
31
|
-
|
27
|
+
This benchmark can be found in `bin/sidekiqload` and assumes a Redis network latency of 1ms.
|
32
28
|
|
33
29
|
Requirements
|
34
30
|
-----------------
|
35
31
|
|
36
|
-
|
37
|
-
|
38
|
-
All Rails releases >= 4.0 are officially supported.
|
32
|
+
- Redis: 4.0+
|
33
|
+
- Ruby: MRI 2.5+ or JRuby 9.2+.
|
39
34
|
|
40
|
-
|
41
|
-
installations with thousands of worker threads.
|
35
|
+
Sidekiq 6.0 supports Rails 5.0+ but does not require it.
|
42
36
|
|
43
37
|
|
44
38
|
Installation
|
@@ -63,7 +57,7 @@ Want to Upgrade?
|
|
63
57
|
I also sell Sidekiq Pro and Sidekiq Enterprise, extensions to Sidekiq which provide more
|
64
58
|
features, a commercial-friendly license and allow you to support high
|
65
59
|
quality open source development all at the same time. Please see the
|
66
|
-
[Sidekiq](
|
60
|
+
[Sidekiq](https://sidekiq.org/) homepage for more detail.
|
67
61
|
|
68
62
|
Subscribe to the **[quarterly newsletter](https://tinyletter.com/sidekiq)** to stay informed about the latest
|
69
63
|
features and changes to Sidekiq and its bigger siblings.
|
@@ -77,24 +71,16 @@ Problems?
|
|
77
71
|
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
72
|
Searching the [issues](https://github.com/mperham/sidekiq/issues) for your problem is also a good idea.
|
79
73
|
|
80
|
-
Sidekiq Pro and Sidekiq Enterprise customers get private email support. You can purchase at
|
74
|
+
Sidekiq Pro and Sidekiq Enterprise customers get private email support. You can purchase at https://sidekiq.org; email support@contribsys.com for help.
|
81
75
|
|
82
76
|
Useful resources:
|
83
77
|
|
84
78
|
* Product documentation is in the [wiki](https://github.com/mperham/sidekiq/wiki).
|
85
|
-
*
|
79
|
+
* Occasional announcements are made to the [@sidekiq](https://twitter.com/sidekiq) Twitter account.
|
86
80
|
* The [Sidekiq tag](https://stackoverflow.com/questions/tagged/sidekiq) on Stack Overflow has lots of useful Q & A.
|
87
81
|
|
88
|
-
**No support via Twitter**
|
89
|
-
|
90
82
|
Every Friday morning is Sidekiq happy hour: I video chat and answer questions.
|
91
|
-
See the [Sidekiq support page](
|
92
|
-
|
93
|
-
Thanks
|
94
|
-
-----------------
|
95
|
-
|
96
|
-
Sidekiq stays fast by using the [JProfiler java profiler](http://www.ej-technologies.com/products/jprofiler/overview.html) to find and fix
|
97
|
-
performance problems on JRuby. Unfortunately MRI does not have good multithreaded profiling tools.
|
83
|
+
See the [Sidekiq support page](https://sidekiq.org/support.html) for details.
|
98
84
|
|
99
85
|
|
100
86
|
License
|
@@ -106,4 +92,4 @@ Please see [LICENSE](https://github.com/mperham/sidekiq/blob/master/LICENSE) for
|
|
106
92
|
Author
|
107
93
|
-----------------
|
108
94
|
|
109
|
-
Mike Perham, [@mperham](https://
|
95
|
+
Mike Perham, [@mperham@mastodon.xyz](https://mastodon.xyz/@mperham) / [@sidekiq](https://twitter.com/sidekiq), [https://www.mikeperham.com](https://www.mikeperham.com) / [https://www.contribsys.com](https://www.contribsys.com)
|
data/Rakefile
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
3
|
+
require "standard/rake"
|
4
|
+
|
3
5
|
Rake::TestTask.new(:test) do |test|
|
4
6
|
test.warning = true
|
5
|
-
test.pattern =
|
7
|
+
test.pattern = "test/**/test_*.rb"
|
6
8
|
end
|
7
9
|
|
8
|
-
task :
|
10
|
+
task default: [:standard, :test]
|
data/bin/sidekiqload
CHANGED
@@ -13,8 +13,8 @@ require_relative '../lib/sidekiq/launcher'
|
|
13
13
|
include Sidekiq::Util
|
14
14
|
|
15
15
|
Sidekiq.configure_server do |config|
|
16
|
-
|
17
|
-
config.redis = { db: 13 }
|
16
|
+
config.options[:concurrency] = 10
|
17
|
+
config.redis = { db: 13, port: 6380, driver: :hiredis }
|
18
18
|
config.options[:queues] << 'default'
|
19
19
|
config.logger.level = Logger::ERROR
|
20
20
|
config.average_scheduled_poll_interval = 2
|
@@ -28,7 +28,8 @@ class LoadWorker
|
|
28
28
|
1
|
29
29
|
end
|
30
30
|
|
31
|
-
def perform(idx)
|
31
|
+
def perform(idx, ts=nil)
|
32
|
+
puts(Time.now.to_f - ts) if ts != nil
|
32
33
|
#raise idx.to_s if idx % 100 == 1
|
33
34
|
end
|
34
35
|
end
|
@@ -36,14 +37,15 @@ end
|
|
36
37
|
# brew tap shopify/shopify
|
37
38
|
# brew install toxiproxy
|
38
39
|
# gem install toxiproxy
|
39
|
-
#
|
40
|
+
# run `toxiproxy-server` in a separate terminal window.
|
41
|
+
require 'toxiproxy'
|
40
42
|
# simulate a non-localhost network for realer-world conditions.
|
41
43
|
# adding 1ms of network latency has an ENORMOUS impact on benchmarks
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
Toxiproxy.populate([{
|
45
|
+
"name": "redis",
|
46
|
+
"listen": "127.0.0.1:6380",
|
47
|
+
"upstream": "127.0.0.1:6379"
|
48
|
+
}])
|
47
49
|
|
48
50
|
self_read, self_write = IO.pipe
|
49
51
|
%w(INT TERM TSTP TTIN).each do |sig|
|
@@ -65,7 +67,7 @@ def handle_signal(launcher, sig)
|
|
65
67
|
# http://jira.codehaus.org/browse/JRUBY-4637
|
66
68
|
raise Interrupt
|
67
69
|
when 'TERM'
|
68
|
-
# Heroku sends TERM and then waits
|
70
|
+
# Heroku sends TERM and then waits 30 seconds for process to exit.
|
69
71
|
raise Interrupt
|
70
72
|
when 'TSTP'
|
71
73
|
Sidekiq.logger.info "Received TSTP, no longer accepting new work"
|
@@ -103,18 +105,20 @@ Sidekiq.logger.error "Created #{count*iter} jobs"
|
|
103
105
|
Monitoring = Thread.new do
|
104
106
|
watchdog("monitor thread") do
|
105
107
|
while true
|
106
|
-
sleep
|
107
|
-
qsize
|
108
|
-
conn.
|
109
|
-
|
110
|
-
|
111
|
-
end
|
112
|
-
end.map(&:to_i)
|
113
|
-
total = qsize + retries
|
114
|
-
#GC.start
|
108
|
+
sleep 0.5
|
109
|
+
qsize = Sidekiq.redis do |conn|
|
110
|
+
conn.llen "queue:default"
|
111
|
+
end
|
112
|
+
total = qsize
|
115
113
|
Sidekiq.logger.error("RSS: #{Process.rss} Pending: #{total}")
|
116
114
|
if total == 0
|
117
|
-
Sidekiq.logger.error("Done")
|
115
|
+
Sidekiq.logger.error("Done, now here's the latency for three jobs")
|
116
|
+
|
117
|
+
LoadWorker.perform_async(1, Time.now.to_f)
|
118
|
+
LoadWorker.perform_async(2, Time.now.to_f)
|
119
|
+
LoadWorker.perform_async(3, Time.now.to_f)
|
120
|
+
|
121
|
+
sleep 0.2
|
118
122
|
exit(0)
|
119
123
|
end
|
120
124
|
end
|
@@ -125,8 +129,8 @@ begin
|
|
125
129
|
#RubyProf::exclude_threads = [ Monitoring ]
|
126
130
|
#RubyProf.start
|
127
131
|
fire_event(:startup)
|
128
|
-
|
129
|
-
|
132
|
+
Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
|
133
|
+
Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
|
130
134
|
launcher = Sidekiq::Launcher.new(Sidekiq.options)
|
131
135
|
launcher.run
|
132
136
|
|
@@ -134,7 +138,7 @@ begin
|
|
134
138
|
signal = readable_io.first[0].gets.strip
|
135
139
|
handle_signal(launcher, signal)
|
136
140
|
end
|
137
|
-
|
141
|
+
end
|
138
142
|
rescue SystemExit => e
|
139
143
|
#Sidekiq.logger.error("Profiling...")
|
140
144
|
#result = RubyProf.stop
|
data/bin/sidekiqmon
ADDED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
<% module_namespacing do -%>
|
3
|
-
class <%= class_name %>WorkerTest <
|
3
|
+
class <%= class_name %>WorkerTest < Minitest::Test
|
4
4
|
def test_example
|
5
5
|
skip "add some examples to (or delete) #{__FILE__}"
|
6
6
|
end
|
@@ -1,18 +1,18 @@
|
|
1
|
-
require
|
1
|
+
require "rails/generators/named_base"
|
2
2
|
|
3
3
|
module Sidekiq
|
4
4
|
module Generators # :nodoc:
|
5
5
|
class WorkerGenerator < ::Rails::Generators::NamedBase # :nodoc:
|
6
|
-
desc
|
6
|
+
desc "This generator creates a Sidekiq Worker in app/workers and a corresponding test"
|
7
7
|
|
8
|
-
check_class_collision suffix:
|
8
|
+
check_class_collision suffix: "Worker"
|
9
9
|
|
10
10
|
def self.default_generator_root
|
11
11
|
File.dirname(__FILE__)
|
12
12
|
end
|
13
13
|
|
14
14
|
def create_worker_file
|
15
|
-
template
|
15
|
+
template "worker.rb.erb", File.join("app/workers", class_path, "#{file_name}_worker.rb")
|
16
16
|
end
|
17
17
|
|
18
18
|
def create_test_file
|
@@ -27,23 +27,21 @@ module Sidekiq
|
|
27
27
|
|
28
28
|
def create_worker_spec
|
29
29
|
template_file = File.join(
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
"spec/workers",
|
31
|
+
class_path,
|
32
|
+
"#{file_name}_worker_spec.rb"
|
33
33
|
)
|
34
|
-
template
|
34
|
+
template "worker_spec.rb.erb", template_file
|
35
35
|
end
|
36
36
|
|
37
37
|
def create_worker_test
|
38
38
|
template_file = File.join(
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
"test/workers",
|
40
|
+
class_path,
|
41
|
+
"#{file_name}_worker_test.rb"
|
42
42
|
)
|
43
|
-
template
|
43
|
+
template "worker_test.rb.erb", template_file
|
44
44
|
end
|
45
|
-
|
46
|
-
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
data/lib/sidekiq.rb
CHANGED
@@ -1,26 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'sidekiq/version'
|
3
|
-
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.2.2." if RUBY_PLATFORM != 'java' && Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2.2')
|
4
2
|
|
5
|
-
require
|
6
|
-
|
7
|
-
require 'sidekiq/worker'
|
8
|
-
require 'sidekiq/redis_connection'
|
9
|
-
require 'sidekiq/delay'
|
3
|
+
require "sidekiq/version"
|
4
|
+
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.5.0." if RUBY_PLATFORM != "java" && Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.5.0")
|
10
5
|
|
11
|
-
require
|
6
|
+
require "sidekiq/logger"
|
7
|
+
require "sidekiq/client"
|
8
|
+
require "sidekiq/worker"
|
9
|
+
require "sidekiq/redis_connection"
|
10
|
+
require "sidekiq/delay"
|
11
|
+
|
12
|
+
require "json"
|
12
13
|
|
13
14
|
module Sidekiq
|
14
|
-
NAME =
|
15
|
-
LICENSE =
|
15
|
+
NAME = "Sidekiq"
|
16
|
+
LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
|
16
17
|
|
17
18
|
DEFAULTS = {
|
18
19
|
queues: [],
|
19
20
|
labels: [],
|
20
21
|
concurrency: 10,
|
21
|
-
require:
|
22
|
+
require: ".",
|
22
23
|
environment: nil,
|
23
|
-
timeout:
|
24
|
+
timeout: 25,
|
24
25
|
poll_interval_average: nil,
|
25
26
|
average_scheduled_poll_interval: 5,
|
26
27
|
error_handlers: [],
|
@@ -37,8 +38,8 @@ module Sidekiq
|
|
37
38
|
}
|
38
39
|
|
39
40
|
DEFAULT_WORKER_OPTIONS = {
|
40
|
-
|
41
|
-
|
41
|
+
"retry" => true,
|
42
|
+
"queue" => "default",
|
42
43
|
}
|
43
44
|
|
44
45
|
FAKE_INFO = {
|
@@ -46,7 +47,7 @@ module Sidekiq
|
|
46
47
|
"uptime_in_days" => "9999",
|
47
48
|
"connected_clients" => "9999",
|
48
49
|
"used_memory_human" => "9P",
|
49
|
-
"used_memory_peak_human" => "9P"
|
50
|
+
"used_memory_peak_human" => "9P",
|
50
51
|
}
|
51
52
|
|
52
53
|
def self.❨╯°□°❩╯︵┻━┻
|
@@ -56,6 +57,7 @@ module Sidekiq
|
|
56
57
|
def self.options
|
57
58
|
@options ||= DEFAULTS.dup
|
58
59
|
end
|
60
|
+
|
59
61
|
def self.options=(opts)
|
60
62
|
@options = opts
|
61
63
|
end
|
@@ -94,9 +96,13 @@ module Sidekiq
|
|
94
96
|
begin
|
95
97
|
yield conn
|
96
98
|
rescue Redis::CommandError => ex
|
97
|
-
#2550 Failover can cause the server to become a
|
98
|
-
# to disconnect and reopen the socket to get back to the
|
99
|
-
|
99
|
+
# 2550 Failover can cause the server to become a replica, need
|
100
|
+
# to disconnect and reopen the socket to get back to the primary.
|
101
|
+
if retryable && ex.message =~ /READONLY/
|
102
|
+
conn.disconnect!
|
103
|
+
retryable = false
|
104
|
+
retry
|
105
|
+
end
|
100
106
|
raise
|
101
107
|
end
|
102
108
|
end
|
@@ -104,19 +110,17 @@ module Sidekiq
|
|
104
110
|
|
105
111
|
def self.redis_info
|
106
112
|
redis do |conn|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
conn.info
|
114
|
-
end
|
115
|
-
rescue Redis::CommandError => ex
|
116
|
-
#2850 return fake version when INFO command has (probably) been renamed
|
117
|
-
raise unless ex.message =~ /unknown command/
|
118
|
-
FAKE_INFO
|
113
|
+
# admin commands can't go through redis-namespace starting
|
114
|
+
# in redis-namespace 2.0
|
115
|
+
if conn.respond_to?(:namespace)
|
116
|
+
conn.redis.info
|
117
|
+
else
|
118
|
+
conn.info
|
119
119
|
end
|
120
|
+
rescue Redis::CommandError => ex
|
121
|
+
# 2850 return fake version when INFO command has (probably) been renamed
|
122
|
+
raise unless /unknown command/.match?(ex.message)
|
123
|
+
FAKE_INFO
|
120
124
|
end
|
121
125
|
end
|
122
126
|
|
@@ -150,18 +154,13 @@ module Sidekiq
|
|
150
154
|
|
151
155
|
def self.default_worker_options=(hash)
|
152
156
|
# stringify
|
153
|
-
@default_worker_options = default_worker_options.merge(Hash[hash.map{|k, v| [k.to_s, v]}])
|
157
|
+
@default_worker_options = default_worker_options.merge(Hash[hash.map { |k, v| [k.to_s, v] }])
|
154
158
|
end
|
159
|
+
|
155
160
|
def self.default_worker_options
|
156
161
|
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
157
162
|
end
|
158
163
|
|
159
|
-
def self.default_retries_exhausted=(prok)
|
160
|
-
logger.info { "default_retries_exhausted is deprecated, please use `config.death_handlers << -> {|job, ex| }`" }
|
161
|
-
return nil unless prok
|
162
|
-
death_handlers << prok
|
163
|
-
end
|
164
|
-
|
165
164
|
##
|
166
165
|
# Death handlers are called when all retries for a job have been exhausted and
|
167
166
|
# the job dies. It's the notification to your application
|
@@ -178,15 +177,29 @@ module Sidekiq
|
|
178
177
|
def self.load_json(string)
|
179
178
|
JSON.parse(string)
|
180
179
|
end
|
180
|
+
|
181
181
|
def self.dump_json(object)
|
182
182
|
JSON.generate(object)
|
183
183
|
end
|
184
184
|
|
185
|
+
def self.log_formatter
|
186
|
+
@log_formatter ||= if ENV["DYNO"]
|
187
|
+
Sidekiq::Logger::Formatters::WithoutTimestamp.new
|
188
|
+
else
|
189
|
+
Sidekiq::Logger::Formatters::Pretty.new
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def self.log_formatter=(log_formatter)
|
194
|
+
@log_formatter = log_formatter
|
195
|
+
end
|
196
|
+
|
185
197
|
def self.logger
|
186
|
-
Sidekiq::
|
198
|
+
@logger ||= Sidekiq::Logger.new(STDOUT, level: Logger::INFO)
|
187
199
|
end
|
188
|
-
|
189
|
-
|
200
|
+
|
201
|
+
def self.logger=(logger)
|
202
|
+
@logger = logger
|
190
203
|
end
|
191
204
|
|
192
205
|
# How frequently Redis should be checked by a random Sidekiq process for
|
@@ -195,7 +208,7 @@ module Sidekiq
|
|
195
208
|
#
|
196
209
|
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
197
210
|
def self.average_scheduled_poll_interval=(interval)
|
198
|
-
|
211
|
+
options[:average_scheduled_poll_interval] = interval
|
199
212
|
end
|
200
213
|
|
201
214
|
# Register a proc to handle any error which occurs within the Sidekiq process.
|
@@ -206,7 +219,7 @@ module Sidekiq
|
|
206
219
|
#
|
207
220
|
# The default error handler logs errors to Sidekiq.logger.
|
208
221
|
def self.error_handlers
|
209
|
-
|
222
|
+
options[:error_handlers]
|
210
223
|
end
|
211
224
|
|
212
225
|
# Register a block to run at a point in the Sidekiq lifecycle.
|
@@ -232,4 +245,4 @@ module Sidekiq
|
|
232
245
|
class Shutdown < Interrupt; end
|
233
246
|
end
|
234
247
|
|
235
|
-
require
|
248
|
+
require "sidekiq/rails" if defined?(::Rails::Engine)
|