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.

Files changed (138) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +516 -0
  3. data/LICENSE +2 -2
  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/templates/worker_spec.rb.erb +1 -1
  9. data/lib/generators/sidekiq/templates/worker_test.rb.erb +2 -2
  10. data/lib/generators/sidekiq/worker_generator.rb +21 -13
  11. data/lib/sidekiq/api.rb +401 -243
  12. data/lib/sidekiq/cli.rb +228 -212
  13. data/lib/sidekiq/client.rb +76 -53
  14. data/lib/sidekiq/delay.rb +41 -0
  15. data/lib/sidekiq/exception_handler.rb +12 -16
  16. data/lib/sidekiq/extensions/action_mailer.rb +13 -22
  17. data/lib/sidekiq/extensions/active_record.rb +13 -10
  18. data/lib/sidekiq/extensions/class_methods.rb +14 -11
  19. data/lib/sidekiq/extensions/generic_proxy.rb +12 -4
  20. data/lib/sidekiq/fetch.rb +39 -31
  21. data/lib/sidekiq/job.rb +13 -0
  22. data/lib/sidekiq/job_logger.rb +63 -0
  23. data/lib/sidekiq/job_retry.rb +259 -0
  24. data/lib/sidekiq/launcher.rb +170 -71
  25. data/lib/sidekiq/logger.rb +166 -0
  26. data/lib/sidekiq/manager.rb +17 -20
  27. data/lib/sidekiq/middleware/chain.rb +20 -8
  28. data/lib/sidekiq/middleware/current_attributes.rb +52 -0
  29. data/lib/sidekiq/middleware/i18n.rb +5 -7
  30. data/lib/sidekiq/monitor.rb +133 -0
  31. data/lib/sidekiq/paginator.rb +18 -14
  32. data/lib/sidekiq/processor.rb +169 -78
  33. data/lib/sidekiq/rails.rb +41 -36
  34. data/lib/sidekiq/redis_connection.rb +65 -20
  35. data/lib/sidekiq/scheduled.rb +85 -34
  36. data/lib/sidekiq/sd_notify.rb +149 -0
  37. data/lib/sidekiq/systemd.rb +24 -0
  38. data/lib/sidekiq/testing/inline.rb +2 -1
  39. data/lib/sidekiq/testing.rb +52 -26
  40. data/lib/sidekiq/util.rb +48 -15
  41. data/lib/sidekiq/version.rb +2 -1
  42. data/lib/sidekiq/web/action.rb +15 -17
  43. data/lib/sidekiq/web/application.rb +114 -92
  44. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  45. data/lib/sidekiq/web/helpers.rb +151 -83
  46. data/lib/sidekiq/web/router.rb +27 -19
  47. data/lib/sidekiq/web.rb +85 -76
  48. data/lib/sidekiq/worker.rb +233 -43
  49. data/lib/sidekiq.rb +88 -64
  50. data/sidekiq.gemspec +24 -22
  51. data/web/assets/images/apple-touch-icon.png +0 -0
  52. data/web/assets/javascripts/application.js +86 -59
  53. data/web/assets/javascripts/dashboard.js +81 -85
  54. data/web/assets/stylesheets/application-dark.css +147 -0
  55. data/web/assets/stylesheets/application-rtl.css +242 -0
  56. data/web/assets/stylesheets/application.css +319 -141
  57. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  58. data/web/assets/stylesheets/bootstrap.css +2 -2
  59. data/web/locales/ar.yml +87 -0
  60. data/web/locales/de.yml +14 -2
  61. data/web/locales/en.yml +8 -1
  62. data/web/locales/es.yml +22 -5
  63. data/web/locales/fa.yml +80 -0
  64. data/web/locales/fr.yml +10 -3
  65. data/web/locales/he.yml +79 -0
  66. data/web/locales/ja.yml +12 -4
  67. data/web/locales/lt.yml +83 -0
  68. data/web/locales/pl.yml +4 -4
  69. data/web/locales/ru.yml +4 -0
  70. data/web/locales/ur.yml +80 -0
  71. data/web/locales/vi.yml +83 -0
  72. data/web/views/_footer.erb +5 -2
  73. data/web/views/_job_info.erb +4 -3
  74. data/web/views/_nav.erb +4 -18
  75. data/web/views/_paging.erb +1 -1
  76. data/web/views/_poll_link.erb +2 -5
  77. data/web/views/_summary.erb +7 -7
  78. data/web/views/busy.erb +60 -22
  79. data/web/views/dashboard.erb +23 -15
  80. data/web/views/dead.erb +3 -3
  81. data/web/views/layout.erb +14 -3
  82. data/web/views/morgue.erb +19 -12
  83. data/web/views/queue.erb +24 -14
  84. data/web/views/queues.erb +14 -4
  85. data/web/views/retries.erb +22 -13
  86. data/web/views/retry.erb +4 -4
  87. data/web/views/scheduled.erb +7 -4
  88. metadata +44 -194
  89. data/.github/contributing.md +0 -32
  90. data/.github/issue_template.md +0 -4
  91. data/.gitignore +0 -12
  92. data/.travis.yml +0 -12
  93. data/3.0-Upgrade.md +0 -70
  94. data/4.0-Upgrade.md +0 -53
  95. data/COMM-LICENSE +0 -95
  96. data/Ent-Changes.md +0 -146
  97. data/Gemfile +0 -29
  98. data/Pro-2.0-Upgrade.md +0 -138
  99. data/Pro-3.0-Upgrade.md +0 -44
  100. data/Pro-Changes.md +0 -570
  101. data/Rakefile +0 -9
  102. data/bin/sidekiqctl +0 -99
  103. data/code_of_conduct.md +0 -50
  104. data/lib/sidekiq/core_ext.rb +0 -106
  105. data/lib/sidekiq/logging.rb +0 -106
  106. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  107. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  108. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  109. data/test/config.yml +0 -9
  110. data/test/env_based_config.yml +0 -11
  111. data/test/fake_env.rb +0 -1
  112. data/test/fixtures/en.yml +0 -2
  113. data/test/helper.rb +0 -75
  114. data/test/test_actors.rb +0 -138
  115. data/test/test_api.rb +0 -528
  116. data/test/test_cli.rb +0 -418
  117. data/test/test_client.rb +0 -266
  118. data/test/test_exception_handler.rb +0 -56
  119. data/test/test_extensions.rb +0 -127
  120. data/test/test_fetch.rb +0 -50
  121. data/test/test_launcher.rb +0 -95
  122. data/test/test_logging.rb +0 -35
  123. data/test/test_manager.rb +0 -50
  124. data/test/test_middleware.rb +0 -158
  125. data/test/test_processor.rb +0 -201
  126. data/test/test_rails.rb +0 -22
  127. data/test/test_redis_connection.rb +0 -132
  128. data/test/test_retry.rb +0 -326
  129. data/test/test_retry_exhausted.rb +0 -149
  130. data/test/test_scheduled.rb +0 -115
  131. data/test/test_scheduling.rb +0 -50
  132. data/test/test_sidekiq.rb +0 -107
  133. data/test/test_testing.rb +0 -143
  134. data/test/test_testing_fake.rb +0 -357
  135. data/test/test_testing_inline.rb +0 -94
  136. data/test/test_util.rb +0 -13
  137. data/test/test_web.rb +0 -666
  138. 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 '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,
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
- 'retry' => true,
40
- 'queue' => 'default'
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
- }.freeze
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::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/
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
- 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
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
- 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
- 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
- @default_worker_options = default_worker_options.merge(hash.stringify_keys)
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.default_retries_exhausted = -> (job, ex) do
174
+ # config.death_handlers << ->(job, ex) do
169
175
  # end
170
176
  # end
171
- def self.default_retries_exhausted=(prok)
172
- @default_retries_exhausted = prok
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::Logging.logger
203
+ @logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
188
204
  end
189
- def self.logger=(log)
190
- Sidekiq::Logging.logger = log
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
- self.options[:average_scheduled_poll_interval] = interval
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
- self.options[:error_handlers]
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 'sidekiq/extensions/class_methods'
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
- # -*- 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'
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