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.

Files changed (143) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +523 -0
  3. data/LICENSE +3 -3
  4. data/README.md +23 -36
  5. data/bin/sidekiq +26 -2
  6. data/bin/sidekiqload +28 -38
  7. data/bin/sidekiqmon +8 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  10. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  11. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  12. data/lib/sidekiq/api.rb +403 -243
  13. data/lib/sidekiq/cli.rb +230 -211
  14. data/lib/sidekiq/client.rb +53 -64
  15. data/lib/sidekiq/delay.rb +43 -0
  16. data/lib/sidekiq/exception_handler.rb +12 -16
  17. data/lib/sidekiq/extensions/action_mailer.rb +15 -24
  18. data/lib/sidekiq/extensions/active_record.rb +15 -12
  19. data/lib/sidekiq/extensions/class_methods.rb +16 -13
  20. data/lib/sidekiq/extensions/generic_proxy.rb +14 -6
  21. data/lib/sidekiq/fetch.rb +39 -31
  22. data/lib/sidekiq/job.rb +13 -0
  23. data/lib/sidekiq/job_logger.rb +63 -0
  24. data/lib/sidekiq/job_retry.rb +261 -0
  25. data/lib/sidekiq/job_util.rb +65 -0
  26. data/lib/sidekiq/launcher.rb +170 -71
  27. data/lib/sidekiq/logger.rb +166 -0
  28. data/lib/sidekiq/manager.rb +21 -26
  29. data/lib/sidekiq/middleware/chain.rb +20 -8
  30. data/lib/sidekiq/middleware/current_attributes.rb +57 -0
  31. data/lib/sidekiq/middleware/i18n.rb +5 -7
  32. data/lib/sidekiq/monitor.rb +133 -0
  33. data/lib/sidekiq/paginator.rb +18 -14
  34. data/lib/sidekiq/processor.rb +161 -70
  35. data/lib/sidekiq/rails.rb +41 -73
  36. data/lib/sidekiq/redis_connection.rb +65 -20
  37. data/lib/sidekiq/scheduled.rb +95 -34
  38. data/lib/sidekiq/sd_notify.rb +149 -0
  39. data/lib/sidekiq/systemd.rb +24 -0
  40. data/lib/sidekiq/testing/inline.rb +2 -1
  41. data/lib/sidekiq/testing.rb +52 -26
  42. data/lib/sidekiq/util.rb +60 -14
  43. data/lib/sidekiq/version.rb +2 -1
  44. data/lib/sidekiq/web/action.rb +15 -15
  45. data/lib/sidekiq/web/application.rb +115 -89
  46. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  47. data/lib/sidekiq/web/helpers.rb +151 -83
  48. data/lib/sidekiq/web/router.rb +27 -19
  49. data/lib/sidekiq/web.rb +65 -109
  50. data/lib/sidekiq/worker.rb +284 -41
  51. data/lib/sidekiq.rb +93 -60
  52. data/sidekiq.gemspec +24 -22
  53. data/web/assets/images/apple-touch-icon.png +0 -0
  54. data/web/assets/javascripts/application.js +83 -64
  55. data/web/assets/javascripts/dashboard.js +81 -85
  56. data/web/assets/stylesheets/application-dark.css +143 -0
  57. data/web/assets/stylesheets/application-rtl.css +242 -0
  58. data/web/assets/stylesheets/application.css +319 -143
  59. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  60. data/web/assets/stylesheets/bootstrap.css +2 -2
  61. data/web/locales/ar.yml +87 -0
  62. data/web/locales/de.yml +14 -2
  63. data/web/locales/en.yml +8 -1
  64. data/web/locales/es.yml +22 -5
  65. data/web/locales/fa.yml +80 -0
  66. data/web/locales/fr.yml +10 -3
  67. data/web/locales/he.yml +79 -0
  68. data/web/locales/ja.yml +12 -4
  69. data/web/locales/lt.yml +83 -0
  70. data/web/locales/pl.yml +4 -4
  71. data/web/locales/ru.yml +4 -0
  72. data/web/locales/ur.yml +80 -0
  73. data/web/locales/vi.yml +83 -0
  74. data/web/views/_footer.erb +5 -2
  75. data/web/views/_job_info.erb +4 -3
  76. data/web/views/_nav.erb +4 -18
  77. data/web/views/_paging.erb +1 -1
  78. data/web/views/_poll_link.erb +2 -5
  79. data/web/views/_summary.erb +7 -7
  80. data/web/views/busy.erb +60 -22
  81. data/web/views/dashboard.erb +23 -15
  82. data/web/views/dead.erb +3 -3
  83. data/web/views/layout.erb +14 -3
  84. data/web/views/morgue.erb +19 -12
  85. data/web/views/queue.erb +24 -14
  86. data/web/views/queues.erb +14 -4
  87. data/web/views/retries.erb +22 -13
  88. data/web/views/retry.erb +4 -4
  89. data/web/views/scheduled.erb +7 -4
  90. metadata +49 -198
  91. data/.github/contributing.md +0 -32
  92. data/.github/issue_template.md +0 -4
  93. data/.gitignore +0 -12
  94. data/.travis.yml +0 -12
  95. data/3.0-Upgrade.md +0 -70
  96. data/4.0-Upgrade.md +0 -53
  97. data/COMM-LICENSE +0 -95
  98. data/Ent-Changes.md +0 -146
  99. data/Gemfile +0 -29
  100. data/Pro-2.0-Upgrade.md +0 -138
  101. data/Pro-3.0-Upgrade.md +0 -44
  102. data/Pro-Changes.md +0 -585
  103. data/Rakefile +0 -9
  104. data/bin/sidekiqctl +0 -99
  105. data/code_of_conduct.md +0 -50
  106. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  107. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  108. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  109. data/lib/sidekiq/core_ext.rb +0 -106
  110. data/lib/sidekiq/logging.rb +0 -106
  111. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  112. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  113. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  114. data/test/config.yml +0 -9
  115. data/test/env_based_config.yml +0 -11
  116. data/test/fake_env.rb +0 -1
  117. data/test/fixtures/en.yml +0 -2
  118. data/test/helper.rb +0 -75
  119. data/test/test_actors.rb +0 -138
  120. data/test/test_api.rb +0 -528
  121. data/test/test_cli.rb +0 -418
  122. data/test/test_client.rb +0 -266
  123. data/test/test_exception_handler.rb +0 -56
  124. data/test/test_extensions.rb +0 -127
  125. data/test/test_fetch.rb +0 -50
  126. data/test/test_launcher.rb +0 -95
  127. data/test/test_logging.rb +0 -35
  128. data/test/test_manager.rb +0 -50
  129. data/test/test_middleware.rb +0 -158
  130. data/test/test_processor.rb +0 -235
  131. data/test/test_rails.rb +0 -22
  132. data/test/test_redis_connection.rb +0 -132
  133. data/test/test_retry.rb +0 -326
  134. data/test/test_retry_exhausted.rb +0 -149
  135. data/test/test_scheduled.rb +0 -115
  136. data/test/test_scheduling.rb +0 -58
  137. data/test/test_sidekiq.rb +0 -107
  138. data/test/test_testing.rb +0 -143
  139. data/test/test_testing_fake.rb +0 -357
  140. data/test/test_testing_inline.rb +0 -94
  141. data/test/test_util.rb +0 -13
  142. data/test/test_web.rb +0 -726
  143. 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 'sidekiq/logging'
7
- require 'sidekiq/client'
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 'json'
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 = 'Sidekiq'
15
- LICENSE = 'See LICENSE and the LGPL-3.0 for licensing details.'
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: 25,
21
- require: '.',
22
+ concurrency: 10,
23
+ require: ".",
24
+ strict: true,
22
25
  environment: nil,
23
- timeout: 8,
26
+ timeout: 25,
24
27
  poll_interval_average: nil,
25
- average_scheduled_poll_interval: 15,
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
- 'retry' => true,
40
- 'queue' => 'default'
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
- }.freeze
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::CommandError => ex
96
- #2550 Failover can cause the server to become a slave, need
97
- # to disconnect and reopen the socket to get back to the master.
98
- (conn.disconnect!; retryable = false; retry) if retryable && ex.message =~ /READONLY/
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
- begin
107
- # admin commands can't go through redis-namespace starting
108
- # in redis-namespace 2.0
109
- if conn.respond_to?(:namespace)
110
- conn.redis.info
111
- else
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
- require 'sidekiq/middleware/server/retry_jobs'
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
- @default_worker_options = default_worker_options.merge(hash.stringify_keys)
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.default_retries_exhausted = -> (job, ex) do
175
+ # config.death_handlers << ->(job, ex) do
165
176
  # end
166
177
  # end
167
- def self.default_retries_exhausted=(prok)
168
- @default_retries_exhausted = prok
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::Logging.logger
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
- def self.logger=(log)
186
- Sidekiq::Logging.logger = log
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
- self.options[:average_scheduled_poll_interval] = interval
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
- self.options[:error_handlers]
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 'sidekiq/extensions/class_methods'
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
- # -*- encoding: utf-8 -*-
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 = ["Mike Perham"]
6
- gem.email = ["mperham@gmail.com"]
7
- gem.summary = "Simple, efficient background processing for Ruby"
8
- gem.description = "Simple, efficient background processing for Ruby."
9
- gem.homepage = "http://sidekiq.org"
10
- gem.license = "LGPL-3.0"
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 = ['sidekiq', 'sidekiqctl']
13
- gem.files = `git ls-files | grep -Ev '^(myapp|examples)'`.split("\n")
14
- gem.test_files = `git ls-files -- test/*`.split("\n")
15
- gem.name = "sidekiq"
16
- gem.require_paths = ["lib"]
17
- gem.version = Sidekiq::VERSION
18
- gem.add_dependency 'redis', '~> 3.2', '>= 3.2.1'
19
- gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.0'
20
- gem.add_dependency 'concurrent-ruby', '~> 1.0'
21
- gem.add_dependency 'rack-protection', '>= 1.5.0'
22
- gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
23
- gem.add_development_dependency 'minitest', '~> 5.7', '>= 5.7.0'
24
- gem.add_development_dependency 'rake', '~> 10.0'
25
- gem.add_development_dependency 'rails', '>= 3.2.0'
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