sidekiq 5.1.3 → 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 +5 -5
  2. data/Changes.md +391 -1
  3. data/LICENSE +3 -3
  4. data/README.md +23 -34
  5. data/bin/sidekiq +27 -3
  6. data/bin/sidekiqload +68 -62
  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 +344 -243
  13. data/lib/sidekiq/cli.rb +209 -221
  14. data/lib/sidekiq/client.rb +62 -64
  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 +35 -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 +170 -73
  27. data/lib/sidekiq/logger.rb +170 -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 +20 -16
  34. data/lib/sidekiq/processor.rb +135 -83
  35. data/lib/sidekiq/rails.rb +42 -38
  36. data/lib/sidekiq/redis_connection.rb +49 -30
  37. data/lib/sidekiq/scheduled.rb +94 -31
  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 +40 -31
  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 +109 -74
  46. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  47. data/lib/sidekiq/web/helpers.rb +117 -93
  48. data/lib/sidekiq/web/router.rb +23 -19
  49. data/lib/sidekiq/web.rb +61 -105
  50. data/lib/sidekiq/worker.rb +257 -99
  51. data/lib/sidekiq.rb +81 -46
  52. data/sidekiq.gemspec +23 -23
  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 +77 -231
  59. data/web/assets/stylesheets/bootstrap.css +2 -2
  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 +21 -5
  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 +4 -2
  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 -136
  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 -216
  95. data/Gemfile +0 -8
  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 -729
  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
- 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
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,17 @@ 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
+ # 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
100
112
  raise
101
113
  end
102
114
  end
@@ -104,19 +116,17 @@ module Sidekiq
104
116
 
105
117
  def self.redis_info
106
118
  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
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
119
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
120
130
  end
121
131
  end
122
132
 
@@ -150,18 +160,13 @@ module Sidekiq
150
160
 
151
161
  def self.default_worker_options=(hash)
152
162
  # stringify
153
- @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))
154
164
  end
165
+
155
166
  def self.default_worker_options
156
167
  defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
157
168
  end
158
169
 
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
170
  ##
166
171
  # Death handlers are called when all retries for a job have been exhausted and
167
172
  # the job dies. It's the notification to your application
@@ -178,15 +183,41 @@ module Sidekiq
178
183
  def self.load_json(string)
179
184
  JSON.parse(string)
180
185
  end
186
+
181
187
  def self.dump_json(object)
182
188
  JSON.generate(object)
183
189
  end
184
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
+
185
204
  def self.logger
186
- Sidekiq::Logging.logger
205
+ @logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
187
206
  end
188
- def self.logger=(log)
189
- Sidekiq::Logging.logger = log
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
217
+ end
218
+
219
+ def self.pro?
220
+ defined?(Sidekiq::Pro)
190
221
  end
191
222
 
192
223
  # How frequently Redis should be checked by a random Sidekiq process for
@@ -195,7 +226,7 @@ module Sidekiq
195
226
  #
196
227
  # See sidekiq/scheduled.rb for an in-depth explanation of this value
197
228
  def self.average_scheduled_poll_interval=(interval)
198
- self.options[:average_scheduled_poll_interval] = interval
229
+ options[:average_scheduled_poll_interval] = interval
199
230
  end
200
231
 
201
232
  # Register a proc to handle any error which occurs within the Sidekiq process.
@@ -206,7 +237,7 @@ module Sidekiq
206
237
  #
207
238
  # The default error handler logs errors to Sidekiq.logger.
208
239
  def self.error_handlers
209
- self.options[:error_handlers]
240
+ options[:error_handlers]
210
241
  end
211
242
 
212
243
  # Register a block to run at a point in the Sidekiq lifecycle.
@@ -223,6 +254,10 @@ module Sidekiq
223
254
  options[:lifecycle_events][event] << block
224
255
  end
225
256
 
257
+ def self.strict_args!(mode = :raise)
258
+ options[:on_complex_arguments] = mode
259
+ end
260
+
226
261
  # We are shutting down Sidekiq but what about workers that
227
262
  # are working on some long job? This error is
228
263
  # raised in workers that have not finished within the hard
@@ -232,4 +267,4 @@ module Sidekiq
232
267
  class Shutdown < Interrupt; end
233
268
  end
234
269
 
235
- require 'sidekiq/rails' if defined?(::Rails::Engine)
270
+ require "sidekiq/rails" if defined?(::Rails::Engine)
data/sidekiq.gemspec CHANGED
@@ -1,28 +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.0'
22
- gem.add_dependency 'concurrent-ruby', '~> 1.0'
23
- gem.add_dependency 'rack-protection', '>= 1.5.0'
24
- gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
25
- gem.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.1'
26
- gem.add_development_dependency 'rake', '~> 10.0'
27
- gem.add_development_dependency 'rails', '>= 3.2.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"
28
28
  end