sidekiq 5.2.1 → 6.4.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/Changes.md +368 -1
- data/LICENSE +3 -3
- data/README.md +21 -37
- data/bin/sidekiq +26 -2
- data/bin/sidekiqload +33 -25
- data/bin/sidekiqmon +8 -0
- data/lib/generators/sidekiq/job_generator.rb +57 -0
- data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
- data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
- data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
- data/lib/sidekiq/api.rb +316 -246
- data/lib/sidekiq/cli.rb +195 -221
- data/lib/sidekiq/client.rb +42 -60
- data/lib/sidekiq/delay.rb +7 -6
- data/lib/sidekiq/exception_handler.rb +10 -12
- data/lib/sidekiq/extensions/action_mailer.rb +15 -24
- data/lib/sidekiq/extensions/active_record.rb +15 -12
- data/lib/sidekiq/extensions/class_methods.rb +16 -13
- data/lib/sidekiq/extensions/generic_proxy.rb +8 -6
- data/lib/sidekiq/fetch.rb +39 -31
- data/lib/sidekiq/job.rb +13 -0
- data/lib/sidekiq/job_logger.rb +47 -9
- data/lib/sidekiq/job_retry.rb +88 -68
- data/lib/sidekiq/job_util.rb +65 -0
- data/lib/sidekiq/launcher.rb +151 -61
- data/lib/sidekiq/logger.rb +166 -0
- data/lib/sidekiq/manager.rb +18 -22
- data/lib/sidekiq/middleware/chain.rb +20 -8
- data/lib/sidekiq/middleware/current_attributes.rb +57 -0
- data/lib/sidekiq/middleware/i18n.rb +5 -7
- data/lib/sidekiq/monitor.rb +133 -0
- data/lib/sidekiq/paginator.rb +18 -14
- data/lib/sidekiq/processor.rb +116 -82
- data/lib/sidekiq/rails.rb +42 -38
- data/lib/sidekiq/redis_connection.rb +49 -30
- data/lib/sidekiq/scheduled.rb +62 -28
- data/lib/sidekiq/sd_notify.rb +149 -0
- data/lib/sidekiq/systemd.rb +24 -0
- data/lib/sidekiq/testing/inline.rb +2 -1
- data/lib/sidekiq/testing.rb +36 -27
- data/lib/sidekiq/util.rb +57 -15
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web/action.rb +15 -11
- data/lib/sidekiq/web/application.rb +95 -76
- data/lib/sidekiq/web/csrf_protection.rb +180 -0
- data/lib/sidekiq/web/helpers.rb +115 -91
- data/lib/sidekiq/web/router.rb +23 -19
- data/lib/sidekiq/web.rb +61 -105
- data/lib/sidekiq/worker.rb +259 -99
- data/lib/sidekiq.rb +79 -45
- data/sidekiq.gemspec +23 -18
- data/web/assets/images/apple-touch-icon.png +0 -0
- data/web/assets/javascripts/application.js +83 -64
- data/web/assets/javascripts/dashboard.js +66 -75
- data/web/assets/stylesheets/application-dark.css +143 -0
- data/web/assets/stylesheets/application-rtl.css +0 -4
- data/web/assets/stylesheets/application.css +75 -231
- data/web/assets/stylesheets/bootstrap.css +1 -1
- data/web/locales/ar.yml +9 -2
- data/web/locales/de.yml +14 -2
- data/web/locales/en.yml +7 -1
- data/web/locales/es.yml +18 -2
- data/web/locales/fr.yml +10 -3
- data/web/locales/ja.yml +7 -1
- 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/_footer.erb +1 -1
- data/web/views/_job_info.erb +3 -2
- data/web/views/_nav.erb +3 -17
- data/web/views/_poll_link.erb +2 -5
- data/web/views/_summary.erb +7 -7
- data/web/views/busy.erb +54 -20
- data/web/views/dashboard.erb +22 -14
- data/web/views/dead.erb +3 -3
- data/web/views/layout.erb +3 -1
- data/web/views/morgue.erb +9 -6
- data/web/views/queue.erb +20 -10
- data/web/views/queues.erb +11 -3
- data/web/views/retries.erb +14 -7
- data/web/views/retry.erb +3 -3
- data/web/views/scheduled.erb +5 -2
- metadata +39 -54
- data/.github/contributing.md +0 -32
- data/.github/issue_template.md +0 -11
- data/.gitignore +0 -13
- data/.travis.yml +0 -14
- data/3.0-Upgrade.md +0 -70
- data/4.0-Upgrade.md +0 -53
- data/5.0-Upgrade.md +0 -56
- data/COMM-LICENSE +0 -95
- data/Ent-Changes.md +0 -221
- data/Gemfile +0 -14
- data/Pro-2.0-Upgrade.md +0 -138
- data/Pro-3.0-Upgrade.md +0 -44
- data/Pro-4.0-Upgrade.md +0 -35
- data/Pro-Changes.md +0 -739
- data/Rakefile +0 -8
- data/bin/sidekiqctl +0 -99
- data/code_of_conduct.md +0 -50
- data/lib/generators/sidekiq/worker_generator.rb +0 -49
- 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/lib/sidekiq.rb
CHANGED
@@ -1,44 +1,48 @@
|
|
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/job"
|
10
|
+
require "sidekiq/redis_connection"
|
11
|
+
require "sidekiq/delay"
|
12
|
+
|
13
|
+
require "json"
|
12
14
|
|
13
15
|
module Sidekiq
|
14
|
-
NAME =
|
15
|
-
LICENSE =
|
16
|
+
NAME = "Sidekiq"
|
17
|
+
LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
|
16
18
|
|
17
19
|
DEFAULTS = {
|
18
20
|
queues: [],
|
19
21
|
labels: [],
|
20
22
|
concurrency: 10,
|
21
|
-
require:
|
23
|
+
require: ".",
|
24
|
+
strict: true,
|
22
25
|
environment: nil,
|
23
|
-
timeout:
|
26
|
+
timeout: 25,
|
24
27
|
poll_interval_average: nil,
|
25
28
|
average_scheduled_poll_interval: 5,
|
29
|
+
on_complex_arguments: :warn,
|
26
30
|
error_handlers: [],
|
27
31
|
death_handlers: [],
|
28
32
|
lifecycle_events: {
|
29
33
|
startup: [],
|
30
34
|
quiet: [],
|
31
35
|
shutdown: [],
|
32
|
-
heartbeat: []
|
36
|
+
heartbeat: []
|
33
37
|
},
|
34
38
|
dead_max_jobs: 10_000,
|
35
39
|
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
|
36
|
-
reloader: proc { |&block| block.call }
|
40
|
+
reloader: proc { |&block| block.call }
|
37
41
|
}
|
38
42
|
|
39
43
|
DEFAULT_WORKER_OPTIONS = {
|
40
|
-
|
41
|
-
|
44
|
+
"retry" => true,
|
45
|
+
"queue" => "default"
|
42
46
|
}
|
43
47
|
|
44
48
|
FAKE_INFO = {
|
@@ -56,6 +60,7 @@ module Sidekiq
|
|
56
60
|
def self.options
|
57
61
|
@options ||= DEFAULTS.dup
|
58
62
|
end
|
63
|
+
|
59
64
|
def self.options=(opts)
|
60
65
|
@options = opts
|
61
66
|
end
|
@@ -93,10 +98,16 @@ module Sidekiq
|
|
93
98
|
retryable = true
|
94
99
|
begin
|
95
100
|
yield conn
|
96
|
-
rescue Redis::
|
97
|
-
#2550 Failover can cause the server to become a
|
98
|
-
# to disconnect and reopen the socket to get back to the
|
99
|
-
|
101
|
+
rescue Redis::BaseError => ex
|
102
|
+
# 2550 Failover can cause the server to become a replica, need
|
103
|
+
# to disconnect and reopen the socket to get back to the primary.
|
104
|
+
# 4495 Use the same logic if we have a "Not enough replicas" error from the primary
|
105
|
+
# 4985 Use the same logic when a blocking command is force-unblocked
|
106
|
+
if retryable && ex.message =~ /READONLY|NOREPLICAS|UNBLOCKED/
|
107
|
+
conn.disconnect!
|
108
|
+
retryable = false
|
109
|
+
retry
|
110
|
+
end
|
100
111
|
raise
|
101
112
|
end
|
102
113
|
end
|
@@ -104,19 +115,17 @@ module Sidekiq
|
|
104
115
|
|
105
116
|
def self.redis_info
|
106
117
|
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
|
118
|
+
# admin commands can't go through redis-namespace starting
|
119
|
+
# in redis-namespace 2.0
|
120
|
+
if conn.respond_to?(:namespace)
|
121
|
+
conn.redis.info
|
122
|
+
else
|
123
|
+
conn.info
|
119
124
|
end
|
125
|
+
rescue Redis::CommandError => ex
|
126
|
+
# 2850 return fake version when INFO command has (probably) been renamed
|
127
|
+
raise unless /unknown command/.match?(ex.message)
|
128
|
+
FAKE_INFO
|
120
129
|
end
|
121
130
|
end
|
122
131
|
|
@@ -150,18 +159,13 @@ module Sidekiq
|
|
150
159
|
|
151
160
|
def self.default_worker_options=(hash)
|
152
161
|
# stringify
|
153
|
-
@default_worker_options = default_worker_options.merge(
|
162
|
+
@default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
|
154
163
|
end
|
164
|
+
|
155
165
|
def self.default_worker_options
|
156
166
|
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
157
167
|
end
|
158
168
|
|
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
169
|
##
|
166
170
|
# Death handlers are called when all retries for a job have been exhausted and
|
167
171
|
# the job dies. It's the notification to your application
|
@@ -178,15 +182,41 @@ module Sidekiq
|
|
178
182
|
def self.load_json(string)
|
179
183
|
JSON.parse(string)
|
180
184
|
end
|
185
|
+
|
181
186
|
def self.dump_json(object)
|
182
187
|
JSON.generate(object)
|
183
188
|
end
|
184
189
|
|
190
|
+
def self.log_formatter
|
191
|
+
@log_formatter ||= if ENV["DYNO"]
|
192
|
+
Sidekiq::Logger::Formatters::WithoutTimestamp.new
|
193
|
+
else
|
194
|
+
Sidekiq::Logger::Formatters::Pretty.new
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.log_formatter=(log_formatter)
|
199
|
+
@log_formatter = log_formatter
|
200
|
+
logger.formatter = log_formatter
|
201
|
+
end
|
202
|
+
|
185
203
|
def self.logger
|
186
|
-
Sidekiq::
|
204
|
+
@logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
|
187
205
|
end
|
188
|
-
|
189
|
-
|
206
|
+
|
207
|
+
def self.logger=(logger)
|
208
|
+
if logger.nil?
|
209
|
+
self.logger.level = Logger::FATAL
|
210
|
+
return self.logger
|
211
|
+
end
|
212
|
+
|
213
|
+
logger.extend(Sidekiq::LoggingUtils)
|
214
|
+
|
215
|
+
@logger = logger
|
216
|
+
end
|
217
|
+
|
218
|
+
def self.pro?
|
219
|
+
defined?(Sidekiq::Pro)
|
190
220
|
end
|
191
221
|
|
192
222
|
# How frequently Redis should be checked by a random Sidekiq process for
|
@@ -195,7 +225,7 @@ module Sidekiq
|
|
195
225
|
#
|
196
226
|
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
197
227
|
def self.average_scheduled_poll_interval=(interval)
|
198
|
-
|
228
|
+
options[:average_scheduled_poll_interval] = interval
|
199
229
|
end
|
200
230
|
|
201
231
|
# Register a proc to handle any error which occurs within the Sidekiq process.
|
@@ -206,7 +236,7 @@ module Sidekiq
|
|
206
236
|
#
|
207
237
|
# The default error handler logs errors to Sidekiq.logger.
|
208
238
|
def self.error_handlers
|
209
|
-
|
239
|
+
options[:error_handlers]
|
210
240
|
end
|
211
241
|
|
212
242
|
# Register a block to run at a point in the Sidekiq lifecycle.
|
@@ -223,6 +253,10 @@ module Sidekiq
|
|
223
253
|
options[:lifecycle_events][event] << block
|
224
254
|
end
|
225
255
|
|
256
|
+
def self.strict_args!(mode = :raise)
|
257
|
+
options[:on_complex_arguments] = mode
|
258
|
+
end
|
259
|
+
|
226
260
|
# We are shutting down Sidekiq but what about workers that
|
227
261
|
# are working on some long job? This error is
|
228
262
|
# raised in workers that have not finished within the hard
|
@@ -232,4 +266,4 @@ module Sidekiq
|
|
232
266
|
class Shutdown < Interrupt; end
|
233
267
|
end
|
234
268
|
|
235
|
-
require
|
269
|
+
require "sidekiq/rails" if defined?(::Rails::Engine)
|
data/sidekiq.gemspec
CHANGED
@@ -1,23 +1,28 @@
|
|
1
|
-
|
2
|
-
require File.expand_path('../lib/sidekiq/version', __FILE__)
|
1
|
+
require_relative "lib/sidekiq/version"
|
3
2
|
|
4
3
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors
|
6
|
-
gem.email
|
7
|
-
gem.summary
|
8
|
-
gem.description
|
9
|
-
gem.homepage
|
10
|
-
gem.license
|
4
|
+
gem.authors = ["Mike Perham"]
|
5
|
+
gem.email = ["mperham@gmail.com"]
|
6
|
+
gem.summary = "Simple, efficient background processing for Ruby"
|
7
|
+
gem.description = "Simple, efficient background processing for Ruby."
|
8
|
+
gem.homepage = "https://sidekiq.org"
|
9
|
+
gem.license = "LGPL-3.0"
|
11
10
|
|
12
|
-
gem.executables
|
13
|
-
gem.files
|
14
|
-
gem.
|
15
|
-
gem.
|
16
|
-
gem.
|
17
|
-
gem.version = Sidekiq::VERSION
|
18
|
-
gem.required_ruby_version = ">= 2.2.2"
|
11
|
+
gem.executables = ["sidekiq", "sidekiqmon"]
|
12
|
+
gem.files = ["sidekiq.gemspec", "README.md", "Changes.md", "LICENSE"] + `git ls-files | grep -E '^(bin|lib|web)'`.split("\n")
|
13
|
+
gem.name = "sidekiq"
|
14
|
+
gem.version = Sidekiq::VERSION
|
15
|
+
gem.required_ruby_version = ">= 2.5.0"
|
19
16
|
|
20
|
-
gem.
|
21
|
-
|
22
|
-
|
17
|
+
gem.metadata = {
|
18
|
+
"homepage_uri" => "https://sidekiq.org",
|
19
|
+
"bug_tracker_uri" => "https://github.com/mperham/sidekiq/issues",
|
20
|
+
"documentation_uri" => "https://github.com/mperham/sidekiq/wiki",
|
21
|
+
"changelog_uri" => "https://github.com/mperham/sidekiq/blob/main/Changes.md",
|
22
|
+
"source_code_uri" => "https://github.com/mperham/sidekiq"
|
23
|
+
}
|
24
|
+
|
25
|
+
gem.add_dependency "redis", ">= 4.2.0"
|
26
|
+
gem.add_dependency "connection_pool", ">= 2.2.2"
|
27
|
+
gem.add_dependency "rack", "~> 2.0"
|
23
28
|
end
|
Binary file
|