sidekiq 5.2.1 → 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 (106) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +368 -1
  3. data/LICENSE +3 -3
  4. data/README.md +21 -37
  5. data/bin/sidekiq +26 -2
  6. data/bin/sidekiqload +33 -25
  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 +316 -246
  13. data/lib/sidekiq/cli.rb +195 -221
  14. data/lib/sidekiq/client.rb +42 -60
  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 +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 +8 -6
  21. data/lib/sidekiq/fetch.rb +39 -31
  22. data/lib/sidekiq/job.rb +13 -0
  23. data/lib/sidekiq/job_logger.rb +47 -9
  24. data/lib/sidekiq/job_retry.rb +88 -68
  25. data/lib/sidekiq/job_util.rb +65 -0
  26. data/lib/sidekiq/launcher.rb +151 -61
  27. data/lib/sidekiq/logger.rb +166 -0
  28. data/lib/sidekiq/manager.rb +18 -22
  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 +116 -82
  35. data/lib/sidekiq/rails.rb +42 -38
  36. data/lib/sidekiq/redis_connection.rb +49 -30
  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 +95 -76
  46. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  47. data/lib/sidekiq/web/helpers.rb +115 -91
  48. data/lib/sidekiq/web/router.rb +23 -19
  49. data/lib/sidekiq/web.rb +61 -105
  50. data/lib/sidekiq/worker.rb +259 -99
  51. data/lib/sidekiq.rb +79 -45
  52. data/sidekiq.gemspec +23 -18
  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 +66 -75
  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 +75 -231
  59. data/web/assets/stylesheets/bootstrap.css +1 -1
  60. data/web/locales/ar.yml +9 -2
  61. data/web/locales/de.yml +14 -2
  62. data/web/locales/en.yml +7 -1
  63. data/web/locales/es.yml +18 -2
  64. data/web/locales/fr.yml +10 -3
  65. data/web/locales/ja.yml +7 -1
  66. data/web/locales/lt.yml +83 -0
  67. data/web/locales/pl.yml +4 -4
  68. data/web/locales/ru.yml +4 -0
  69. data/web/locales/vi.yml +83 -0
  70. data/web/views/_footer.erb +1 -1
  71. data/web/views/_job_info.erb +3 -2
  72. data/web/views/_nav.erb +3 -17
  73. data/web/views/_poll_link.erb +2 -5
  74. data/web/views/_summary.erb +7 -7
  75. data/web/views/busy.erb +54 -20
  76. data/web/views/dashboard.erb +22 -14
  77. data/web/views/dead.erb +3 -3
  78. data/web/views/layout.erb +3 -1
  79. data/web/views/morgue.erb +9 -6
  80. data/web/views/queue.erb +20 -10
  81. data/web/views/queues.erb +11 -3
  82. data/web/views/retries.erb +14 -7
  83. data/web/views/retry.erb +3 -3
  84. data/web/views/scheduled.erb +5 -2
  85. metadata +39 -54
  86. data/.github/contributing.md +0 -32
  87. data/.github/issue_template.md +0 -11
  88. data/.gitignore +0 -13
  89. data/.travis.yml +0 -14
  90. data/3.0-Upgrade.md +0 -70
  91. data/4.0-Upgrade.md +0 -53
  92. data/5.0-Upgrade.md +0 -56
  93. data/COMM-LICENSE +0 -95
  94. data/Ent-Changes.md +0 -221
  95. data/Gemfile +0 -14
  96. data/Pro-2.0-Upgrade.md +0 -138
  97. data/Pro-3.0-Upgrade.md +0 -44
  98. data/Pro-4.0-Upgrade.md +0 -35
  99. data/Pro-Changes.md +0 -739
  100. data/Rakefile +0 -8
  101. data/bin/sidekiqctl +0 -99
  102. data/code_of_conduct.md +0 -50
  103. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  104. data/lib/sidekiq/core_ext.rb +0 -1
  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,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 'sidekiq/logging'
6
- require 'sidekiq/client'
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 '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
22
  concurrency: 10,
21
- require: '.',
23
+ require: ".",
24
+ strict: true,
22
25
  environment: nil,
23
- timeout: 8,
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
- 'retry' => true,
41
- 'queue' => 'default'
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,16 @@ module Sidekiq
93
98
  retryable = true
94
99
  begin
95
100
  yield conn
96
- rescue Redis::CommandError => ex
97
- #2550 Failover can cause the server to become a slave, need
98
- # to disconnect and reopen the socket to get back to the master.
99
- (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
100
111
  raise
101
112
  end
102
113
  end
@@ -104,19 +115,17 @@ module Sidekiq
104
115
 
105
116
  def self.redis_info
106
117
  redis do |conn|
107
- begin
108
- # admin commands can't go through redis-namespace starting
109
- # in redis-namespace 2.0
110
- if conn.respond_to?(:namespace)
111
- conn.redis.info
112
- else
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
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
119
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
120
129
  end
121
130
  end
122
131
 
@@ -150,18 +159,13 @@ module Sidekiq
150
159
 
151
160
  def self.default_worker_options=(hash)
152
161
  # stringify
153
- @default_worker_options = default_worker_options.merge(Hash[hash.map{|k, v| [k.to_s, v]}])
162
+ @default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
154
163
  end
164
+
155
165
  def self.default_worker_options
156
166
  defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
157
167
  end
158
168
 
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
169
  ##
166
170
  # Death handlers are called when all retries for a job have been exhausted and
167
171
  # the job dies. It's the notification to your application
@@ -178,15 +182,41 @@ module Sidekiq
178
182
  def self.load_json(string)
179
183
  JSON.parse(string)
180
184
  end
185
+
181
186
  def self.dump_json(object)
182
187
  JSON.generate(object)
183
188
  end
184
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
+
185
203
  def self.logger
186
- Sidekiq::Logging.logger
204
+ @logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
187
205
  end
188
- def self.logger=(log)
189
- Sidekiq::Logging.logger = log
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
216
+ end
217
+
218
+ def self.pro?
219
+ defined?(Sidekiq::Pro)
190
220
  end
191
221
 
192
222
  # How frequently Redis should be checked by a random Sidekiq process for
@@ -195,7 +225,7 @@ module Sidekiq
195
225
  #
196
226
  # See sidekiq/scheduled.rb for an in-depth explanation of this value
197
227
  def self.average_scheduled_poll_interval=(interval)
198
- self.options[:average_scheduled_poll_interval] = interval
228
+ options[:average_scheduled_poll_interval] = interval
199
229
  end
200
230
 
201
231
  # Register a proc to handle any error which occurs within the Sidekiq process.
@@ -206,7 +236,7 @@ module Sidekiq
206
236
  #
207
237
  # The default error handler logs errors to Sidekiq.logger.
208
238
  def self.error_handlers
209
- self.options[:error_handlers]
239
+ options[:error_handlers]
210
240
  end
211
241
 
212
242
  # Register a block to run at a point in the Sidekiq lifecycle.
@@ -223,6 +253,10 @@ module Sidekiq
223
253
  options[:lifecycle_events][event] << block
224
254
  end
225
255
 
256
+ def self.strict_args!(mode = :raise)
257
+ options[:on_complex_arguments] = mode
258
+ end
259
+
226
260
  # We are shutting down Sidekiq but what about workers that
227
261
  # are working on some long job? This error is
228
262
  # raised in workers that have not finished within the hard
@@ -232,4 +266,4 @@ module Sidekiq
232
266
  class Shutdown < Interrupt; end
233
267
  end
234
268
 
235
- require 'sidekiq/rails' if defined?(::Rails::Engine)
269
+ require "sidekiq/rails" if defined?(::Rails::Engine)
data/sidekiq.gemspec CHANGED
@@ -1,23 +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 '^(test|myapp|examples)'`.split("\n")
14
- gem.test_files = []
15
- gem.name = "sidekiq"
16
- gem.require_paths = ["lib"]
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.add_dependency 'redis', '>= 3.3.5', '< 5'
21
- gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.2'
22
- 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"
23
28
  end