sidekiq 4.2.4 → 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 +523 -0
- data/LICENSE +3 -3
- data/README.md +23 -36
- data/bin/sidekiq +26 -2
- data/bin/sidekiqload +28 -38
- 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/job_spec.rb.erb +6 -0
- data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
- data/lib/sidekiq/api.rb +403 -243
- data/lib/sidekiq/cli.rb +230 -211
- data/lib/sidekiq/client.rb +53 -64
- data/lib/sidekiq/delay.rb +43 -0
- data/lib/sidekiq/exception_handler.rb +12 -16
- 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 +14 -6
- data/lib/sidekiq/fetch.rb +39 -31
- data/lib/sidekiq/job.rb +13 -0
- data/lib/sidekiq/job_logger.rb +63 -0
- data/lib/sidekiq/job_retry.rb +261 -0
- data/lib/sidekiq/job_util.rb +65 -0
- data/lib/sidekiq/launcher.rb +170 -71
- data/lib/sidekiq/logger.rb +166 -0
- data/lib/sidekiq/manager.rb +21 -26
- 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 +161 -70
- data/lib/sidekiq/rails.rb +41 -73
- data/lib/sidekiq/redis_connection.rb +65 -20
- data/lib/sidekiq/scheduled.rb +95 -34
- 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 +52 -26
- data/lib/sidekiq/util.rb +60 -14
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web/action.rb +15 -15
- data/lib/sidekiq/web/application.rb +115 -89
- data/lib/sidekiq/web/csrf_protection.rb +180 -0
- data/lib/sidekiq/web/helpers.rb +151 -83
- data/lib/sidekiq/web/router.rb +27 -19
- data/lib/sidekiq/web.rb +65 -109
- data/lib/sidekiq/worker.rb +284 -41
- data/lib/sidekiq.rb +93 -60
- data/sidekiq.gemspec +24 -22
- data/web/assets/images/apple-touch-icon.png +0 -0
- data/web/assets/javascripts/application.js +83 -64
- data/web/assets/javascripts/dashboard.js +81 -85
- data/web/assets/stylesheets/application-dark.css +143 -0
- data/web/assets/stylesheets/application-rtl.css +242 -0
- data/web/assets/stylesheets/application.css +319 -143
- data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
- data/web/assets/stylesheets/bootstrap.css +2 -2
- data/web/locales/ar.yml +87 -0
- data/web/locales/de.yml +14 -2
- data/web/locales/en.yml +8 -1
- data/web/locales/es.yml +22 -5
- data/web/locales/fa.yml +80 -0
- data/web/locales/fr.yml +10 -3
- data/web/locales/he.yml +79 -0
- data/web/locales/ja.yml +12 -4
- data/web/locales/lt.yml +83 -0
- data/web/locales/pl.yml +4 -4
- data/web/locales/ru.yml +4 -0
- data/web/locales/ur.yml +80 -0
- data/web/locales/vi.yml +83 -0
- data/web/views/_footer.erb +5 -2
- data/web/views/_job_info.erb +4 -3
- data/web/views/_nav.erb +4 -18
- data/web/views/_paging.erb +1 -1
- data/web/views/_poll_link.erb +2 -5
- data/web/views/_summary.erb +7 -7
- data/web/views/busy.erb +60 -22
- data/web/views/dashboard.erb +23 -15
- data/web/views/dead.erb +3 -3
- data/web/views/layout.erb +14 -3
- data/web/views/morgue.erb +19 -12
- data/web/views/queue.erb +24 -14
- data/web/views/queues.erb +14 -4
- data/web/views/retries.erb +22 -13
- data/web/views/retry.erb +4 -4
- data/web/views/scheduled.erb +7 -4
- metadata +49 -198
- data/.github/contributing.md +0 -32
- data/.github/issue_template.md +0 -4
- data/.gitignore +0 -12
- data/.travis.yml +0 -12
- data/3.0-Upgrade.md +0 -70
- data/4.0-Upgrade.md +0 -53
- data/COMM-LICENSE +0 -95
- data/Ent-Changes.md +0 -146
- data/Gemfile +0 -29
- data/Pro-2.0-Upgrade.md +0 -138
- data/Pro-3.0-Upgrade.md +0 -44
- data/Pro-Changes.md +0 -585
- data/Rakefile +0 -9
- data/bin/sidekiqctl +0 -99
- data/code_of_conduct.md +0 -50
- data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
- data/lib/generators/sidekiq/worker_generator.rb +0 -49
- data/lib/sidekiq/core_ext.rb +0 -106
- data/lib/sidekiq/logging.rb +0 -106
- data/lib/sidekiq/middleware/server/active_record.rb +0 -13
- data/lib/sidekiq/middleware/server/logging.rb +0 -40
- data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
- data/test/config.yml +0 -9
- data/test/env_based_config.yml +0 -11
- data/test/fake_env.rb +0 -1
- data/test/fixtures/en.yml +0 -2
- data/test/helper.rb +0 -75
- data/test/test_actors.rb +0 -138
- data/test/test_api.rb +0 -528
- data/test/test_cli.rb +0 -418
- data/test/test_client.rb +0 -266
- data/test/test_exception_handler.rb +0 -56
- data/test/test_extensions.rb +0 -127
- data/test/test_fetch.rb +0 -50
- data/test/test_launcher.rb +0 -95
- data/test/test_logging.rb +0 -35
- data/test/test_manager.rb +0 -50
- data/test/test_middleware.rb +0 -158
- data/test/test_processor.rb +0 -235
- data/test/test_rails.rb +0 -22
- data/test/test_redis_connection.rb +0 -132
- data/test/test_retry.rb +0 -326
- data/test/test_retry_exhausted.rb +0 -149
- data/test/test_scheduled.rb +0 -115
- data/test/test_scheduling.rb +0 -58
- data/test/test_sidekiq.rb +0 -107
- data/test/test_testing.rb +0 -143
- data/test/test_testing_fake.rb +0 -357
- data/test/test_testing_inline.rb +0 -94
- data/test/test_util.rb +0 -13
- data/test/test_web.rb +0 -726
- data/test/test_web_helpers.rb +0 -54
data/lib/sidekiq.rb
CHANGED
@@ -1,43 +1,48 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
# encoding: utf-8
|
3
|
-
require 'sidekiq/version'
|
4
|
-
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.0.0." if RUBY_PLATFORM != 'java' && RUBY_VERSION < '2.0.0'
|
5
2
|
|
6
|
-
require
|
7
|
-
|
8
|
-
require 'sidekiq/worker'
|
9
|
-
require 'sidekiq/redis_connection'
|
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
|
-
average_scheduled_poll_interval:
|
28
|
+
average_scheduled_poll_interval: 5,
|
29
|
+
on_complex_arguments: :warn,
|
26
30
|
error_handlers: [],
|
31
|
+
death_handlers: [],
|
27
32
|
lifecycle_events: {
|
28
33
|
startup: [],
|
29
34
|
quiet: [],
|
30
35
|
shutdown: [],
|
31
|
-
heartbeat: []
|
36
|
+
heartbeat: []
|
32
37
|
},
|
33
38
|
dead_max_jobs: 10_000,
|
34
39
|
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
|
35
|
-
reloader: proc { |&block| block.call }
|
40
|
+
reloader: proc { |&block| block.call }
|
36
41
|
}
|
37
42
|
|
38
43
|
DEFAULT_WORKER_OPTIONS = {
|
39
|
-
|
40
|
-
|
44
|
+
"retry" => true,
|
45
|
+
"queue" => "default"
|
41
46
|
}
|
42
47
|
|
43
48
|
FAKE_INFO = {
|
@@ -46,7 +51,7 @@ module Sidekiq
|
|
46
51
|
"connected_clients" => "9999",
|
47
52
|
"used_memory_human" => "9P",
|
48
53
|
"used_memory_peak_human" => "9P"
|
49
|
-
}
|
54
|
+
}
|
50
55
|
|
51
56
|
def self.❨╯°□°❩╯︵┻━┻
|
52
57
|
puts "Calm down, yo."
|
@@ -55,6 +60,7 @@ module Sidekiq
|
|
55
60
|
def self.options
|
56
61
|
@options ||= DEFAULTS.dup
|
57
62
|
end
|
63
|
+
|
58
64
|
def self.options=(opts)
|
59
65
|
@options = opts
|
60
66
|
end
|
@@ -92,10 +98,16 @@ module Sidekiq
|
|
92
98
|
retryable = true
|
93
99
|
begin
|
94
100
|
yield conn
|
95
|
-
rescue Redis::
|
96
|
-
#2550 Failover can cause the server to become a
|
97
|
-
# to disconnect and reopen the socket to get back to the
|
98
|
-
|
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
|
99
111
|
raise
|
100
112
|
end
|
101
113
|
end
|
@@ -103,19 +115,17 @@ module Sidekiq
|
|
103
115
|
|
104
116
|
def self.redis_info
|
105
117
|
redis do |conn|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
conn.info
|
113
|
-
end
|
114
|
-
rescue Redis::CommandError => ex
|
115
|
-
#2850 return fake version when INFO command has (probably) been renamed
|
116
|
-
raise unless ex.message =~ /unknown command/
|
117
|
-
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
|
118
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
|
119
129
|
end
|
120
130
|
end
|
121
131
|
|
@@ -144,46 +154,69 @@ module Sidekiq
|
|
144
154
|
end
|
145
155
|
|
146
156
|
def self.default_server_middleware
|
147
|
-
|
148
|
-
require 'sidekiq/middleware/server/logging'
|
149
|
-
|
150
|
-
Middleware::Chain.new do |m|
|
151
|
-
m.add Middleware::Server::Logging
|
152
|
-
m.add Middleware::Server::RetryJobs
|
153
|
-
end
|
157
|
+
Middleware::Chain.new
|
154
158
|
end
|
155
159
|
|
156
160
|
def self.default_worker_options=(hash)
|
157
|
-
|
161
|
+
# stringify
|
162
|
+
@default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
|
158
163
|
end
|
164
|
+
|
159
165
|
def self.default_worker_options
|
160
166
|
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
161
167
|
end
|
162
168
|
|
169
|
+
##
|
170
|
+
# Death handlers are called when all retries for a job have been exhausted and
|
171
|
+
# the job dies. It's the notification to your application
|
172
|
+
# that this job will not succeed without manual intervention.
|
173
|
+
#
|
163
174
|
# Sidekiq.configure_server do |config|
|
164
|
-
# config.
|
175
|
+
# config.death_handlers << ->(job, ex) do
|
165
176
|
# end
|
166
177
|
# end
|
167
|
-
def self.
|
168
|
-
|
169
|
-
end
|
170
|
-
@default_retries_exhausted = ->(job, ex) { }
|
171
|
-
def self.default_retries_exhausted
|
172
|
-
@default_retries_exhausted
|
178
|
+
def self.death_handlers
|
179
|
+
options[:death_handlers]
|
173
180
|
end
|
174
181
|
|
175
182
|
def self.load_json(string)
|
176
183
|
JSON.parse(string)
|
177
184
|
end
|
185
|
+
|
178
186
|
def self.dump_json(object)
|
179
187
|
JSON.generate(object)
|
180
188
|
end
|
181
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
|
+
|
182
203
|
def self.logger
|
183
|
-
Sidekiq::
|
204
|
+
@logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
|
205
|
+
end
|
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
|
184
216
|
end
|
185
|
-
|
186
|
-
|
217
|
+
|
218
|
+
def self.pro?
|
219
|
+
defined?(Sidekiq::Pro)
|
187
220
|
end
|
188
221
|
|
189
222
|
# How frequently Redis should be checked by a random Sidekiq process for
|
@@ -192,7 +225,7 @@ module Sidekiq
|
|
192
225
|
#
|
193
226
|
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
194
227
|
def self.average_scheduled_poll_interval=(interval)
|
195
|
-
|
228
|
+
options[:average_scheduled_poll_interval] = interval
|
196
229
|
end
|
197
230
|
|
198
231
|
# Register a proc to handle any error which occurs within the Sidekiq process.
|
@@ -203,7 +236,7 @@ module Sidekiq
|
|
203
236
|
#
|
204
237
|
# The default error handler logs errors to Sidekiq.logger.
|
205
238
|
def self.error_handlers
|
206
|
-
|
239
|
+
options[:error_handlers]
|
207
240
|
end
|
208
241
|
|
209
242
|
# Register a block to run at a point in the Sidekiq lifecycle.
|
@@ -220,6 +253,10 @@ module Sidekiq
|
|
220
253
|
options[:lifecycle_events][event] << block
|
221
254
|
end
|
222
255
|
|
256
|
+
def self.strict_args!(mode = :raise)
|
257
|
+
options[:on_complex_arguments] = mode
|
258
|
+
end
|
259
|
+
|
223
260
|
# We are shutting down Sidekiq but what about workers that
|
224
261
|
# are working on some long job? This error is
|
225
262
|
# raised in workers that have not finished within the hard
|
@@ -227,10 +264,6 @@ module Sidekiq
|
|
227
264
|
# otherwise Ruby's Thread#kill will commit. See #377.
|
228
265
|
# DO NOT RESCUE THIS ERROR IN YOUR WORKERS
|
229
266
|
class Shutdown < Interrupt; end
|
230
|
-
|
231
267
|
end
|
232
268
|
|
233
|
-
require
|
234
|
-
require 'sidekiq/extensions/action_mailer'
|
235
|
-
require 'sidekiq/extensions/active_record'
|
236
|
-
require 'sidekiq/rails' if defined?(::Rails::Engine)
|
269
|
+
require "sidekiq/rails" if defined?(::Rails::Engine)
|
data/sidekiq.gemspec
CHANGED
@@ -1,26 +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
|
-
|
18
|
-
gem.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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"
|
16
|
+
|
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"
|
26
28
|
end
|
Binary file
|