sidekiq 5.1.3 → 6.4.1
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 +391 -1
- data/LICENSE +3 -3
- data/README.md +23 -34
- data/bin/sidekiq +27 -3
- data/bin/sidekiqload +68 -62
- 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 +344 -243
- data/lib/sidekiq/cli.rb +209 -221
- data/lib/sidekiq/client.rb +62 -64
- data/lib/sidekiq/delay.rb +7 -6
- data/lib/sidekiq/exception_handler.rb +10 -12
- data/lib/sidekiq/extensions/action_mailer.rb +13 -22
- data/lib/sidekiq/extensions/active_record.rb +13 -10
- data/lib/sidekiq/extensions/class_methods.rb +14 -11
- data/lib/sidekiq/extensions/generic_proxy.rb +6 -4
- data/lib/sidekiq/fetch.rb +40 -32
- data/lib/sidekiq/job.rb +13 -0
- data/lib/sidekiq/job_logger.rb +35 -9
- data/lib/sidekiq/job_retry.rb +88 -68
- data/lib/sidekiq/job_util.rb +65 -0
- data/lib/sidekiq/launcher.rb +170 -73
- data/lib/sidekiq/logger.rb +170 -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 +20 -16
- data/lib/sidekiq/processor.rb +135 -83
- data/lib/sidekiq/rails.rb +42 -38
- data/lib/sidekiq/redis_connection.rb +49 -30
- data/lib/sidekiq/scheduled.rb +94 -31
- 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 +40 -31
- 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 +109 -74
- data/lib/sidekiq/web/csrf_protection.rb +180 -0
- data/lib/sidekiq/web/helpers.rb +117 -93
- data/lib/sidekiq/web/router.rb +23 -19
- data/lib/sidekiq/web.rb +61 -105
- data/lib/sidekiq/worker.rb +257 -99
- data/lib/sidekiq.rb +81 -46
- data/sidekiq.gemspec +23 -23
- 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 +77 -231
- data/web/assets/stylesheets/bootstrap.css +2 -2
- 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 +21 -5
- 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 +4 -2
- 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 -136
- 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 -216
- data/Gemfile +0 -8
- 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 -729
- 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
|
-
concurrency:
|
21
|
-
require:
|
22
|
+
concurrency: 10,
|
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,17 @@ 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
|
+
# The same retry logic is also used in client.rb
|
107
|
+
if retryable && ex.message =~ /READONLY|NOREPLICAS|UNBLOCKED/
|
108
|
+
conn.disconnect!
|
109
|
+
retryable = false
|
110
|
+
retry
|
111
|
+
end
|
100
112
|
raise
|
101
113
|
end
|
102
114
|
end
|
@@ -104,19 +116,17 @@ module Sidekiq
|
|
104
116
|
|
105
117
|
def self.redis_info
|
106
118
|
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
|
119
|
+
# admin commands can't go through redis-namespace starting
|
120
|
+
# in redis-namespace 2.0
|
121
|
+
if conn.respond_to?(:namespace)
|
122
|
+
conn.redis.info
|
123
|
+
else
|
124
|
+
conn.info
|
119
125
|
end
|
126
|
+
rescue Redis::CommandError => ex
|
127
|
+
# 2850 return fake version when INFO command has (probably) been renamed
|
128
|
+
raise unless /unknown command/.match?(ex.message)
|
129
|
+
FAKE_INFO
|
120
130
|
end
|
121
131
|
end
|
122
132
|
|
@@ -150,18 +160,13 @@ module Sidekiq
|
|
150
160
|
|
151
161
|
def self.default_worker_options=(hash)
|
152
162
|
# stringify
|
153
|
-
@default_worker_options = default_worker_options.merge(
|
163
|
+
@default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
|
154
164
|
end
|
165
|
+
|
155
166
|
def self.default_worker_options
|
156
167
|
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
157
168
|
end
|
158
169
|
|
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
170
|
##
|
166
171
|
# Death handlers are called when all retries for a job have been exhausted and
|
167
172
|
# the job dies. It's the notification to your application
|
@@ -178,15 +183,41 @@ module Sidekiq
|
|
178
183
|
def self.load_json(string)
|
179
184
|
JSON.parse(string)
|
180
185
|
end
|
186
|
+
|
181
187
|
def self.dump_json(object)
|
182
188
|
JSON.generate(object)
|
183
189
|
end
|
184
190
|
|
191
|
+
def self.log_formatter
|
192
|
+
@log_formatter ||= if ENV["DYNO"]
|
193
|
+
Sidekiq::Logger::Formatters::WithoutTimestamp.new
|
194
|
+
else
|
195
|
+
Sidekiq::Logger::Formatters::Pretty.new
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def self.log_formatter=(log_formatter)
|
200
|
+
@log_formatter = log_formatter
|
201
|
+
logger.formatter = log_formatter
|
202
|
+
end
|
203
|
+
|
185
204
|
def self.logger
|
186
|
-
Sidekiq::
|
205
|
+
@logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
|
187
206
|
end
|
188
|
-
|
189
|
-
|
207
|
+
|
208
|
+
def self.logger=(logger)
|
209
|
+
if logger.nil?
|
210
|
+
self.logger.level = Logger::FATAL
|
211
|
+
return self.logger
|
212
|
+
end
|
213
|
+
|
214
|
+
logger.extend(Sidekiq::LoggingUtils)
|
215
|
+
|
216
|
+
@logger = logger
|
217
|
+
end
|
218
|
+
|
219
|
+
def self.pro?
|
220
|
+
defined?(Sidekiq::Pro)
|
190
221
|
end
|
191
222
|
|
192
223
|
# How frequently Redis should be checked by a random Sidekiq process for
|
@@ -195,7 +226,7 @@ module Sidekiq
|
|
195
226
|
#
|
196
227
|
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
197
228
|
def self.average_scheduled_poll_interval=(interval)
|
198
|
-
|
229
|
+
options[:average_scheduled_poll_interval] = interval
|
199
230
|
end
|
200
231
|
|
201
232
|
# Register a proc to handle any error which occurs within the Sidekiq process.
|
@@ -206,7 +237,7 @@ module Sidekiq
|
|
206
237
|
#
|
207
238
|
# The default error handler logs errors to Sidekiq.logger.
|
208
239
|
def self.error_handlers
|
209
|
-
|
240
|
+
options[:error_handlers]
|
210
241
|
end
|
211
242
|
|
212
243
|
# Register a block to run at a point in the Sidekiq lifecycle.
|
@@ -223,6 +254,10 @@ module Sidekiq
|
|
223
254
|
options[:lifecycle_events][event] << block
|
224
255
|
end
|
225
256
|
|
257
|
+
def self.strict_args!(mode = :raise)
|
258
|
+
options[:on_complex_arguments] = mode
|
259
|
+
end
|
260
|
+
|
226
261
|
# We are shutting down Sidekiq but what about workers that
|
227
262
|
# are working on some long job? This error is
|
228
263
|
# raised in workers that have not finished within the hard
|
@@ -232,4 +267,4 @@ module Sidekiq
|
|
232
267
|
class Shutdown < Interrupt; end
|
233
268
|
end
|
234
269
|
|
235
|
-
require
|
270
|
+
require "sidekiq/rails" if defined?(::Rails::Engine)
|
data/sidekiq.gemspec
CHANGED
@@ -1,28 +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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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"
|
28
28
|
end
|
Binary file
|