sidekiq 6.0.0 → 6.1.2
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/bug_report.md +20 -0
- data/.github/workflows/ci.yml +41 -0
- data/6.0-Upgrade.md +3 -1
- data/Changes.md +163 -1
- data/Ent-Changes.md +33 -2
- data/Gemfile +2 -2
- data/Gemfile.lock +109 -113
- data/Pro-Changes.md +39 -2
- data/README.md +4 -6
- data/bin/sidekiq +26 -2
- data/bin/sidekiqload +8 -4
- data/bin/sidekiqmon +4 -5
- data/lib/generators/sidekiq/worker_generator.rb +11 -1
- data/lib/sidekiq/api.rb +130 -94
- data/lib/sidekiq/cli.rb +40 -24
- data/lib/sidekiq/client.rb +33 -12
- data/lib/sidekiq/extensions/action_mailer.rb +3 -2
- data/lib/sidekiq/extensions/active_record.rb +4 -3
- data/lib/sidekiq/extensions/class_methods.rb +5 -4
- data/lib/sidekiq/fetch.rb +26 -26
- data/lib/sidekiq/job_logger.rb +12 -4
- data/lib/sidekiq/job_retry.rb +23 -10
- data/lib/sidekiq/launcher.rb +35 -10
- data/lib/sidekiq/logger.rb +108 -12
- data/lib/sidekiq/manager.rb +4 -4
- data/lib/sidekiq/middleware/chain.rb +12 -3
- data/lib/sidekiq/monitor.rb +3 -18
- data/lib/sidekiq/paginator.rb +7 -2
- data/lib/sidekiq/processor.rb +22 -24
- data/lib/sidekiq/rails.rb +16 -18
- data/lib/sidekiq/redis_connection.rb +21 -13
- data/lib/sidekiq/scheduled.rb +13 -12
- data/lib/sidekiq/sd_notify.rb +149 -0
- data/lib/sidekiq/systemd.rb +24 -0
- data/lib/sidekiq/testing.rb +13 -1
- data/lib/sidekiq/util.rb +0 -2
- data/lib/sidekiq/version.rb +1 -1
- data/lib/sidekiq/web/application.rb +23 -24
- data/lib/sidekiq/web/csrf_protection.rb +158 -0
- data/lib/sidekiq/web/helpers.rb +25 -16
- data/lib/sidekiq/web/router.rb +2 -4
- data/lib/sidekiq/web.rb +16 -8
- data/lib/sidekiq/worker.rb +8 -11
- data/lib/sidekiq.rb +22 -8
- data/sidekiq.gemspec +3 -4
- data/web/assets/javascripts/application.js +25 -27
- data/web/assets/javascripts/dashboard.js +2 -2
- data/web/assets/stylesheets/application-dark.css +143 -0
- data/web/assets/stylesheets/application.css +16 -6
- data/web/locales/de.yml +14 -2
- data/web/locales/en.yml +2 -0
- data/web/locales/fr.yml +2 -2
- data/web/locales/ja.yml +2 -0
- data/web/locales/lt.yml +83 -0
- data/web/locales/pl.yml +4 -4
- data/web/locales/ru.yml +4 -0
- data/web/locales/vi.yml +83 -0
- data/web/views/_job_info.erb +2 -1
- data/web/views/busy.erb +6 -3
- data/web/views/dead.erb +2 -2
- data/web/views/layout.erb +1 -0
- data/web/views/morgue.erb +5 -2
- data/web/views/queue.erb +10 -1
- data/web/views/queues.erb +9 -1
- data/web/views/retries.erb +5 -2
- data/web/views/retry.erb +2 -2
- data/web/views/scheduled.erb +5 -2
- metadata +21 -29
- data/.circleci/config.yml +0 -61
- data/.github/issue_template.md +0 -11
data/lib/sidekiq/worker.rb
CHANGED
@@ -48,8 +48,8 @@ module Sidekiq
|
|
48
48
|
# In practice, any option is allowed. This is the main mechanism to configure the
|
49
49
|
# options for a specific job.
|
50
50
|
def sidekiq_options(opts = {})
|
51
|
-
opts =
|
52
|
-
self.sidekiq_options_hash = get_sidekiq_options.merge(
|
51
|
+
opts = opts.transform_keys(&:to_s) # stringify
|
52
|
+
self.sidekiq_options_hash = get_sidekiq_options.merge(opts)
|
53
53
|
end
|
54
54
|
|
55
55
|
def sidekiq_retry_in(&block)
|
@@ -171,9 +171,9 @@ module Sidekiq
|
|
171
171
|
now = Time.now.to_f
|
172
172
|
ts = (int < 1_000_000_000 ? now + int : int)
|
173
173
|
|
174
|
-
payload = @opts.merge("class" => @klass, "args" => args
|
174
|
+
payload = @opts.merge("class" => @klass, "args" => args)
|
175
175
|
# Optimization to enqueue something now that is scheduled to go out now or in the past
|
176
|
-
payload
|
176
|
+
payload["at"] = ts if ts > now
|
177
177
|
@klass.client_push(payload)
|
178
178
|
end
|
179
179
|
alias_method :perform_at, :perform_in
|
@@ -207,10 +207,10 @@ module Sidekiq
|
|
207
207
|
now = Time.now.to_f
|
208
208
|
ts = (int < 1_000_000_000 ? now + int : int)
|
209
209
|
|
210
|
-
item = {"class" => self, "args" => args
|
210
|
+
item = {"class" => self, "args" => args}
|
211
211
|
|
212
212
|
# Optimization to enqueue something now that is scheduled to go out now or in the past
|
213
|
-
item
|
213
|
+
item["at"] = ts if ts > now
|
214
214
|
|
215
215
|
client_push(item)
|
216
216
|
end
|
@@ -235,12 +235,9 @@ module Sidekiq
|
|
235
235
|
|
236
236
|
def client_push(item) # :nodoc:
|
237
237
|
pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options["pool"] || Sidekiq.redis_pool
|
238
|
-
|
239
|
-
item.keys.each do |key|
|
240
|
-
item[key.to_s] = item.delete(key)
|
241
|
-
end
|
238
|
+
stringified_item = item.transform_keys(&:to_s)
|
242
239
|
|
243
|
-
Sidekiq::Client.new(pool).push(
|
240
|
+
Sidekiq::Client.new(pool).push(stringified_item)
|
244
241
|
end
|
245
242
|
end
|
246
243
|
end
|
data/lib/sidekiq.rb
CHANGED
@@ -20,6 +20,7 @@ module Sidekiq
|
|
20
20
|
labels: [],
|
21
21
|
concurrency: 10,
|
22
22
|
require: ".",
|
23
|
+
strict: true,
|
23
24
|
environment: nil,
|
24
25
|
timeout: 25,
|
25
26
|
poll_interval_average: nil,
|
@@ -30,16 +31,16 @@ module Sidekiq
|
|
30
31
|
startup: [],
|
31
32
|
quiet: [],
|
32
33
|
shutdown: [],
|
33
|
-
heartbeat: []
|
34
|
+
heartbeat: []
|
34
35
|
},
|
35
36
|
dead_max_jobs: 10_000,
|
36
37
|
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
|
37
|
-
reloader: proc { |&block| block.call }
|
38
|
+
reloader: proc { |&block| block.call }
|
38
39
|
}
|
39
40
|
|
40
41
|
DEFAULT_WORKER_OPTIONS = {
|
41
42
|
"retry" => true,
|
42
|
-
"queue" => "default"
|
43
|
+
"queue" => "default"
|
43
44
|
}
|
44
45
|
|
45
46
|
FAKE_INFO = {
|
@@ -47,7 +48,7 @@ module Sidekiq
|
|
47
48
|
"uptime_in_days" => "9999",
|
48
49
|
"connected_clients" => "9999",
|
49
50
|
"used_memory_human" => "9P",
|
50
|
-
"used_memory_peak_human" => "9P"
|
51
|
+
"used_memory_peak_human" => "9P"
|
51
52
|
}
|
52
53
|
|
53
54
|
def self.❨╯°□°❩╯︵┻━┻
|
@@ -95,10 +96,11 @@ module Sidekiq
|
|
95
96
|
retryable = true
|
96
97
|
begin
|
97
98
|
yield conn
|
98
|
-
rescue Redis::
|
99
|
+
rescue Redis::BaseError => ex
|
99
100
|
# 2550 Failover can cause the server to become a replica, need
|
100
101
|
# to disconnect and reopen the socket to get back to the primary.
|
101
|
-
if
|
102
|
+
# 4495 Use the same logic if we have a "Not enough replicas" error from the primary
|
103
|
+
if retryable && ex.message =~ /READONLY|NOREPLICAS/
|
102
104
|
conn.disconnect!
|
103
105
|
retryable = false
|
104
106
|
retry
|
@@ -154,7 +156,7 @@ module Sidekiq
|
|
154
156
|
|
155
157
|
def self.default_worker_options=(hash)
|
156
158
|
# stringify
|
157
|
-
@default_worker_options = default_worker_options.merge(
|
159
|
+
@default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
|
158
160
|
end
|
159
161
|
|
160
162
|
def self.default_worker_options
|
@@ -192,16 +194,28 @@ module Sidekiq
|
|
192
194
|
|
193
195
|
def self.log_formatter=(log_formatter)
|
194
196
|
@log_formatter = log_formatter
|
197
|
+
logger.formatter = log_formatter
|
195
198
|
end
|
196
199
|
|
197
200
|
def self.logger
|
198
|
-
@logger ||= Sidekiq::Logger.new(
|
201
|
+
@logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
|
199
202
|
end
|
200
203
|
|
201
204
|
def self.logger=(logger)
|
205
|
+
if logger.nil?
|
206
|
+
self.logger.level = Logger::FATAL
|
207
|
+
return self.logger
|
208
|
+
end
|
209
|
+
|
210
|
+
logger.extend(Sidekiq::LoggingUtils)
|
211
|
+
|
202
212
|
@logger = logger
|
203
213
|
end
|
204
214
|
|
215
|
+
def self.pro?
|
216
|
+
defined?(Sidekiq::Pro)
|
217
|
+
end
|
218
|
+
|
205
219
|
# How frequently Redis should be checked by a random Sidekiq process for
|
206
220
|
# scheduled and retriable jobs. Each individual process will take turns by
|
207
221
|
# waiting some multiple of this value.
|
data/sidekiq.gemspec
CHANGED
@@ -8,14 +8,13 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.homepage = "http://sidekiq.org"
|
9
9
|
gem.license = "LGPL-3.0"
|
10
10
|
|
11
|
-
gem.executables = ["sidekiq"]
|
11
|
+
gem.executables = ["sidekiq", "sidekiqmon"]
|
12
12
|
gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
|
13
13
|
gem.name = "sidekiq"
|
14
14
|
gem.version = Sidekiq::VERSION
|
15
15
|
gem.required_ruby_version = ">= 2.5.0"
|
16
16
|
|
17
|
-
gem.add_dependency "redis", ">= 4.
|
17
|
+
gem.add_dependency "redis", ">= 4.2.0"
|
18
18
|
gem.add_dependency "connection_pool", ">= 2.2.2"
|
19
|
-
gem.add_dependency "rack", "
|
20
|
-
gem.add_dependency "rack-protection", ">= 2.0.0"
|
19
|
+
gem.add_dependency "rack", "~> 2.0"
|
21
20
|
end
|