sidekiq 5.2.9 → 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.

Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +318 -1
  3. data/LICENSE +3 -3
  4. data/README.md +23 -34
  5. data/bin/sidekiq +27 -3
  6. data/bin/sidekiqload +67 -61
  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/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
  11. data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
  12. data/lib/sidekiq/api.rb +335 -267
  13. data/lib/sidekiq/cli.rb +164 -182
  14. data/lib/sidekiq/client.rb +58 -61
  15. data/lib/sidekiq/delay.rb +7 -6
  16. data/lib/sidekiq/exception_handler.rb +10 -12
  17. data/lib/sidekiq/extensions/action_mailer.rb +13 -22
  18. data/lib/sidekiq/extensions/active_record.rb +13 -10
  19. data/lib/sidekiq/extensions/class_methods.rb +14 -11
  20. data/lib/sidekiq/extensions/generic_proxy.rb +6 -4
  21. data/lib/sidekiq/fetch.rb +40 -32
  22. data/lib/sidekiq/job.rb +13 -0
  23. data/lib/sidekiq/job_logger.rb +33 -7
  24. data/lib/sidekiq/job_retry.rb +70 -71
  25. data/lib/sidekiq/job_util.rb +65 -0
  26. data/lib/sidekiq/launcher.rb +161 -71
  27. data/lib/sidekiq/logger.rb +170 -0
  28. data/lib/sidekiq/manager.rb +17 -21
  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 +20 -16
  34. data/lib/sidekiq/processor.rb +71 -70
  35. data/lib/sidekiq/rails.rb +40 -37
  36. data/lib/sidekiq/redis_connection.rb +48 -48
  37. data/lib/sidekiq/scheduled.rb +62 -28
  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 +36 -27
  42. data/lib/sidekiq/util.rb +57 -15
  43. data/lib/sidekiq/version.rb +2 -1
  44. data/lib/sidekiq/web/action.rb +15 -11
  45. data/lib/sidekiq/web/application.rb +88 -75
  46. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  47. data/lib/sidekiq/web/helpers.rb +109 -92
  48. data/lib/sidekiq/web/router.rb +23 -19
  49. data/lib/sidekiq/web.rb +61 -105
  50. data/lib/sidekiq/worker.rb +247 -105
  51. data/lib/sidekiq.rb +77 -44
  52. data/sidekiq.gemspec +23 -16
  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 +54 -73
  56. data/web/assets/stylesheets/application-dark.css +143 -0
  57. data/web/assets/stylesheets/application-rtl.css +0 -4
  58. data/web/assets/stylesheets/application.css +45 -232
  59. data/web/locales/ar.yml +8 -2
  60. data/web/locales/de.yml +14 -2
  61. data/web/locales/en.yml +6 -1
  62. data/web/locales/es.yml +18 -2
  63. data/web/locales/fr.yml +10 -3
  64. data/web/locales/ja.yml +7 -1
  65. data/web/locales/lt.yml +83 -0
  66. data/web/locales/pl.yml +4 -4
  67. data/web/locales/ru.yml +4 -0
  68. data/web/locales/vi.yml +83 -0
  69. data/web/views/_footer.erb +1 -1
  70. data/web/views/_job_info.erb +3 -2
  71. data/web/views/_poll_link.erb +2 -5
  72. data/web/views/_summary.erb +7 -7
  73. data/web/views/busy.erb +54 -20
  74. data/web/views/dashboard.erb +22 -14
  75. data/web/views/dead.erb +3 -3
  76. data/web/views/layout.erb +3 -1
  77. data/web/views/morgue.erb +9 -6
  78. data/web/views/queue.erb +19 -10
  79. data/web/views/queues.erb +10 -2
  80. data/web/views/retries.erb +11 -8
  81. data/web/views/retry.erb +3 -3
  82. data/web/views/scheduled.erb +5 -2
  83. metadata +34 -64
  84. data/.circleci/config.yml +0 -61
  85. data/.github/contributing.md +0 -32
  86. data/.github/issue_template.md +0 -11
  87. data/.gitignore +0 -15
  88. data/.travis.yml +0 -11
  89. data/3.0-Upgrade.md +0 -70
  90. data/4.0-Upgrade.md +0 -53
  91. data/5.0-Upgrade.md +0 -56
  92. data/COMM-LICENSE +0 -97
  93. data/Ent-Changes.md +0 -238
  94. data/Gemfile +0 -23
  95. data/Pro-2.0-Upgrade.md +0 -138
  96. data/Pro-3.0-Upgrade.md +0 -44
  97. data/Pro-4.0-Upgrade.md +0 -35
  98. data/Pro-Changes.md +0 -759
  99. data/Rakefile +0 -9
  100. data/bin/sidekiqctl +0 -20
  101. data/code_of_conduct.md +0 -50
  102. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  103. data/lib/sidekiq/core_ext.rb +0 -1
  104. data/lib/sidekiq/ctl.rb +0 -221
  105. data/lib/sidekiq/logging.rb +0 -122
  106. data/lib/sidekiq/middleware/server/active_record.rb +0 -23
data/lib/sidekiq.rb CHANGED
@@ -1,45 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'sidekiq/version'
4
- 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')
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")
5
5
 
6
- require 'sidekiq/logging'
7
- require 'sidekiq/client'
8
- require 'sidekiq/worker'
9
- require 'sidekiq/redis_connection'
10
- require 'sidekiq/delay'
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"
11
12
 
12
- require 'json'
13
+ require "json"
13
14
 
14
15
  module Sidekiq
15
- NAME = 'Sidekiq'
16
- 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."
17
18
 
18
19
  DEFAULTS = {
19
20
  queues: [],
20
21
  labels: [],
21
22
  concurrency: 10,
22
- require: '.',
23
+ require: ".",
24
+ strict: true,
23
25
  environment: nil,
24
- timeout: 8,
26
+ timeout: 25,
25
27
  poll_interval_average: nil,
26
28
  average_scheduled_poll_interval: 5,
29
+ on_complex_arguments: :warn,
27
30
  error_handlers: [],
28
31
  death_handlers: [],
29
32
  lifecycle_events: {
30
33
  startup: [],
31
34
  quiet: [],
32
35
  shutdown: [],
33
- heartbeat: [],
36
+ heartbeat: []
34
37
  },
35
38
  dead_max_jobs: 10_000,
36
39
  dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
37
- reloader: proc { |&block| block.call },
40
+ reloader: proc { |&block| block.call }
38
41
  }
39
42
 
40
43
  DEFAULT_WORKER_OPTIONS = {
41
- 'retry' => true,
42
- 'queue' => 'default'
44
+ "retry" => true,
45
+ "queue" => "default"
43
46
  }
44
47
 
45
48
  FAKE_INFO = {
@@ -95,10 +98,17 @@ module Sidekiq
95
98
  retryable = true
96
99
  begin
97
100
  yield conn
98
- rescue Redis::CommandError => ex
99
- #2550 Failover can cause the server to become a replica, need
101
+ rescue Redis::BaseError => ex
102
+ # 2550 Failover can cause the server to become a replica, need
100
103
  # to disconnect and reopen the socket to get back to the primary.
101
- (conn.disconnect!; retryable = false; retry) if retryable && ex.message =~ /READONLY/
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
102
112
  raise
103
113
  end
104
114
  end
@@ -106,19 +116,17 @@ module Sidekiq
106
116
 
107
117
  def self.redis_info
108
118
  redis do |conn|
109
- begin
110
- # admin commands can't go through redis-namespace starting
111
- # in redis-namespace 2.0
112
- if conn.respond_to?(:namespace)
113
- conn.redis.info
114
- else
115
- conn.info
116
- end
117
- rescue Redis::CommandError => ex
118
- #2850 return fake version when INFO command has (probably) been renamed
119
- raise unless ex.message =~ /unknown command/
120
- 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
121
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
122
130
  end
123
131
  end
124
132
 
@@ -152,18 +160,13 @@ module Sidekiq
152
160
 
153
161
  def self.default_worker_options=(hash)
154
162
  # stringify
155
- @default_worker_options = default_worker_options.merge(Hash[hash.map{|k, v| [k.to_s, v]}])
163
+ @default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
156
164
  end
165
+
157
166
  def self.default_worker_options
158
167
  defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
159
168
  end
160
169
 
161
- def self.default_retries_exhausted=(prok)
162
- logger.info { "default_retries_exhausted is deprecated, please use `config.death_handlers << -> {|job, ex| }`" }
163
- return nil unless prok
164
- death_handlers << prok
165
- end
166
-
167
170
  ##
168
171
  # Death handlers are called when all retries for a job have been exhausted and
169
172
  # the job dies. It's the notification to your application
@@ -180,15 +183,41 @@ module Sidekiq
180
183
  def self.load_json(string)
181
184
  JSON.parse(string)
182
185
  end
186
+
183
187
  def self.dump_json(object)
184
188
  JSON.generate(object)
185
189
  end
186
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
+
187
204
  def self.logger
188
- Sidekiq::Logging.logger
205
+ @logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
206
+ end
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
189
217
  end
190
- def self.logger=(log)
191
- Sidekiq::Logging.logger = log
218
+
219
+ def self.pro?
220
+ defined?(Sidekiq::Pro)
192
221
  end
193
222
 
194
223
  # How frequently Redis should be checked by a random Sidekiq process for
@@ -197,7 +226,7 @@ module Sidekiq
197
226
  #
198
227
  # See sidekiq/scheduled.rb for an in-depth explanation of this value
199
228
  def self.average_scheduled_poll_interval=(interval)
200
- self.options[:average_scheduled_poll_interval] = interval
229
+ options[:average_scheduled_poll_interval] = interval
201
230
  end
202
231
 
203
232
  # Register a proc to handle any error which occurs within the Sidekiq process.
@@ -208,7 +237,7 @@ module Sidekiq
208
237
  #
209
238
  # The default error handler logs errors to Sidekiq.logger.
210
239
  def self.error_handlers
211
- self.options[:error_handlers]
240
+ options[:error_handlers]
212
241
  end
213
242
 
214
243
  # Register a block to run at a point in the Sidekiq lifecycle.
@@ -225,6 +254,10 @@ module Sidekiq
225
254
  options[:lifecycle_events][event] << block
226
255
  end
227
256
 
257
+ def self.strict_args!(mode = :raise)
258
+ options[:on_complex_arguments] = mode
259
+ end
260
+
228
261
  # We are shutting down Sidekiq but what about workers that
229
262
  # are working on some long job? This error is
230
263
  # raised in workers that have not finished within the hard
@@ -234,4 +267,4 @@ module Sidekiq
234
267
  class Shutdown < Interrupt; end
235
268
  end
236
269
 
237
- require 'sidekiq/rails' if defined?(::Rails::Engine)
270
+ require "sidekiq/rails" if defined?(::Rails::Engine)
data/sidekiq.gemspec CHANGED
@@ -1,21 +1,28 @@
1
- require_relative 'lib/sidekiq/version'
1
+ require_relative "lib/sidekiq/version"
2
2
 
3
3
  Gem::Specification.new do |gem|
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 = "http://sidekiq.org"
9
- 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"
10
10
 
11
- gem.executables = ['sidekiq', 'sidekiqctl']
12
- gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
13
- gem.name = "sidekiq"
14
- gem.version = Sidekiq::VERSION
15
- 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"
16
16
 
17
- gem.add_dependency 'redis', '>= 3.3.5', '< 4.2'
18
- gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.2'
19
- gem.add_dependency 'rack', '~> 2.0'
20
- gem.add_dependency 'rack-protection', '>= 1.5.0'
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"
21
28
  end