sidekiq 4.2.2 → 6.3.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 +516 -0
- data/LICENSE +2 -2
- data/README.md +23 -36
- data/bin/sidekiq +26 -2
- data/bin/sidekiqload +28 -38
- data/bin/sidekiqmon +8 -0
- data/lib/generators/sidekiq/templates/worker_spec.rb.erb +1 -1
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +2 -2
- data/lib/generators/sidekiq/worker_generator.rb +21 -13
- data/lib/sidekiq/api.rb +401 -243
- data/lib/sidekiq/cli.rb +228 -212
- data/lib/sidekiq/client.rb +76 -53
- data/lib/sidekiq/delay.rb +41 -0
- data/lib/sidekiq/exception_handler.rb +12 -16
- 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 +12 -4
- 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 +259 -0
- data/lib/sidekiq/launcher.rb +170 -71
- data/lib/sidekiq/logger.rb +166 -0
- data/lib/sidekiq/manager.rb +17 -20
- data/lib/sidekiq/middleware/chain.rb +20 -8
- data/lib/sidekiq/middleware/current_attributes.rb +52 -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 +169 -78
- data/lib/sidekiq/rails.rb +41 -36
- data/lib/sidekiq/redis_connection.rb +65 -20
- data/lib/sidekiq/scheduled.rb +85 -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 +48 -15
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web/action.rb +15 -17
- data/lib/sidekiq/web/application.rb +114 -92
- 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 +85 -76
- data/lib/sidekiq/worker.rb +233 -43
- data/lib/sidekiq.rb +88 -64
- data/sidekiq.gemspec +24 -22
- data/web/assets/images/apple-touch-icon.png +0 -0
- data/web/assets/javascripts/application.js +86 -59
- data/web/assets/javascripts/dashboard.js +81 -85
- data/web/assets/stylesheets/application-dark.css +147 -0
- data/web/assets/stylesheets/application-rtl.css +242 -0
- data/web/assets/stylesheets/application.css +319 -141
- 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 +44 -194
- 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 -570
- data/Rakefile +0 -9
- data/bin/sidekiqctl +0 -99
- data/code_of_conduct.md +0 -50
- 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 -201
- 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 -50
- 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 -666
- data/test/test_web_helpers.rb +0 -54
data/lib/sidekiq.rb
CHANGED
@@ -1,43 +1,47 @@
|
|
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,
|
26
29
|
error_handlers: [],
|
30
|
+
death_handlers: [],
|
27
31
|
lifecycle_events: {
|
28
32
|
startup: [],
|
29
33
|
quiet: [],
|
30
34
|
shutdown: [],
|
31
|
-
heartbeat: []
|
35
|
+
heartbeat: []
|
32
36
|
},
|
33
37
|
dead_max_jobs: 10_000,
|
34
38
|
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
|
35
|
-
reloader: proc { |&block| block.call }
|
39
|
+
reloader: proc { |&block| block.call }
|
36
40
|
}
|
37
41
|
|
38
42
|
DEFAULT_WORKER_OPTIONS = {
|
39
|
-
|
40
|
-
|
43
|
+
"retry" => true,
|
44
|
+
"queue" => "default"
|
41
45
|
}
|
42
46
|
|
43
47
|
FAKE_INFO = {
|
@@ -46,7 +50,7 @@ module Sidekiq
|
|
46
50
|
"connected_clients" => "9999",
|
47
51
|
"used_memory_human" => "9P",
|
48
52
|
"used_memory_peak_human" => "9P"
|
49
|
-
}
|
53
|
+
}
|
50
54
|
|
51
55
|
def self.❨╯°□°❩╯︵┻━┻
|
52
56
|
puts "Calm down, yo."
|
@@ -55,6 +59,7 @@ module Sidekiq
|
|
55
59
|
def self.options
|
56
60
|
@options ||= DEFAULTS.dup
|
57
61
|
end
|
62
|
+
|
58
63
|
def self.options=(opts)
|
59
64
|
@options = opts
|
60
65
|
end
|
@@ -92,10 +97,16 @@ module Sidekiq
|
|
92
97
|
retryable = true
|
93
98
|
begin
|
94
99
|
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
|
-
|
100
|
+
rescue Redis::BaseError => ex
|
101
|
+
# 2550 Failover can cause the server to become a replica, need
|
102
|
+
# to disconnect and reopen the socket to get back to the primary.
|
103
|
+
# 4495 Use the same logic if we have a "Not enough replicas" error from the primary
|
104
|
+
# 4985 Use the same logic when a blocking command is force-unblocked
|
105
|
+
if retryable && ex.message =~ /READONLY|NOREPLICAS|UNBLOCKED/
|
106
|
+
conn.disconnect!
|
107
|
+
retryable = false
|
108
|
+
retry
|
109
|
+
end
|
99
110
|
raise
|
100
111
|
end
|
101
112
|
end
|
@@ -103,19 +114,17 @@ module Sidekiq
|
|
103
114
|
|
104
115
|
def self.redis_info
|
105
116
|
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
|
117
|
+
# admin commands can't go through redis-namespace starting
|
118
|
+
# in redis-namespace 2.0
|
119
|
+
if conn.respond_to?(:namespace)
|
120
|
+
conn.redis.info
|
121
|
+
else
|
122
|
+
conn.info
|
118
123
|
end
|
124
|
+
rescue Redis::CommandError => ex
|
125
|
+
# 2850 return fake version when INFO command has (probably) been renamed
|
126
|
+
raise unless /unknown command/.match?(ex.message)
|
127
|
+
FAKE_INFO
|
119
128
|
end
|
120
129
|
end
|
121
130
|
|
@@ -144,50 +153,69 @@ module Sidekiq
|
|
144
153
|
end
|
145
154
|
|
146
155
|
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
|
-
if defined?(::ActiveRecord::Base)
|
154
|
-
require 'sidekiq/middleware/server/active_record'
|
155
|
-
m.add Sidekiq::Middleware::Server::ActiveRecord
|
156
|
-
end
|
157
|
-
end
|
156
|
+
Middleware::Chain.new
|
158
157
|
end
|
159
158
|
|
160
159
|
def self.default_worker_options=(hash)
|
161
|
-
|
160
|
+
# stringify
|
161
|
+
@default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
|
162
162
|
end
|
163
|
+
|
163
164
|
def self.default_worker_options
|
164
165
|
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
165
166
|
end
|
166
167
|
|
168
|
+
##
|
169
|
+
# Death handlers are called when all retries for a job have been exhausted and
|
170
|
+
# the job dies. It's the notification to your application
|
171
|
+
# that this job will not succeed without manual intervention.
|
172
|
+
#
|
167
173
|
# Sidekiq.configure_server do |config|
|
168
|
-
# config.
|
174
|
+
# config.death_handlers << ->(job, ex) do
|
169
175
|
# end
|
170
176
|
# end
|
171
|
-
def self.
|
172
|
-
|
173
|
-
end
|
174
|
-
@default_retries_exhausted = ->(job, ex) { }
|
175
|
-
def self.default_retries_exhausted
|
176
|
-
@default_retries_exhausted
|
177
|
+
def self.death_handlers
|
178
|
+
options[:death_handlers]
|
177
179
|
end
|
178
180
|
|
179
181
|
def self.load_json(string)
|
180
182
|
JSON.parse(string)
|
181
183
|
end
|
184
|
+
|
182
185
|
def self.dump_json(object)
|
183
186
|
JSON.generate(object)
|
184
187
|
end
|
185
188
|
|
189
|
+
def self.log_formatter
|
190
|
+
@log_formatter ||= if ENV["DYNO"]
|
191
|
+
Sidekiq::Logger::Formatters::WithoutTimestamp.new
|
192
|
+
else
|
193
|
+
Sidekiq::Logger::Formatters::Pretty.new
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def self.log_formatter=(log_formatter)
|
198
|
+
@log_formatter = log_formatter
|
199
|
+
logger.formatter = log_formatter
|
200
|
+
end
|
201
|
+
|
186
202
|
def self.logger
|
187
|
-
Sidekiq::
|
203
|
+
@logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
|
188
204
|
end
|
189
|
-
|
190
|
-
|
205
|
+
|
206
|
+
def self.logger=(logger)
|
207
|
+
if logger.nil?
|
208
|
+
self.logger.level = Logger::FATAL
|
209
|
+
return self.logger
|
210
|
+
end
|
211
|
+
|
212
|
+
logger.extend(Sidekiq::LoggingUtils)
|
213
|
+
|
214
|
+
@logger = logger
|
215
|
+
end
|
216
|
+
|
217
|
+
def self.pro?
|
218
|
+
defined?(Sidekiq::Pro)
|
191
219
|
end
|
192
220
|
|
193
221
|
# How frequently Redis should be checked by a random Sidekiq process for
|
@@ -196,7 +224,7 @@ module Sidekiq
|
|
196
224
|
#
|
197
225
|
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
198
226
|
def self.average_scheduled_poll_interval=(interval)
|
199
|
-
|
227
|
+
options[:average_scheduled_poll_interval] = interval
|
200
228
|
end
|
201
229
|
|
202
230
|
# Register a proc to handle any error which occurs within the Sidekiq process.
|
@@ -207,7 +235,7 @@ module Sidekiq
|
|
207
235
|
#
|
208
236
|
# The default error handler logs errors to Sidekiq.logger.
|
209
237
|
def self.error_handlers
|
210
|
-
|
238
|
+
options[:error_handlers]
|
211
239
|
end
|
212
240
|
|
213
241
|
# Register a block to run at a point in the Sidekiq lifecycle.
|
@@ -231,10 +259,6 @@ module Sidekiq
|
|
231
259
|
# otherwise Ruby's Thread#kill will commit. See #377.
|
232
260
|
# DO NOT RESCUE THIS ERROR IN YOUR WORKERS
|
233
261
|
class Shutdown < Interrupt; end
|
234
|
-
|
235
262
|
end
|
236
263
|
|
237
|
-
require
|
238
|
-
require 'sidekiq/extensions/action_mailer'
|
239
|
-
require 'sidekiq/extensions/active_record'
|
240
|
-
require 'sidekiq/rails' if defined?(::Rails::Engine)
|
264
|
+
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
|