sidekiq 4.2.4 → 6.2.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 (134) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +445 -0
  3. data/LICENSE +1 -1
  4. data/README.md +21 -34
  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 +347 -213
  12. data/lib/sidekiq/cli.rb +221 -212
  13. data/lib/sidekiq/client.rb +75 -52
  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 +10 -4
  20. data/lib/sidekiq/fetch.rb +38 -31
  21. data/lib/sidekiq/job_logger.rb +63 -0
  22. data/lib/sidekiq/job_retry.rb +263 -0
  23. data/lib/sidekiq/launcher.rb +169 -70
  24. data/lib/sidekiq/logger.rb +166 -0
  25. data/lib/sidekiq/manager.rb +17 -20
  26. data/lib/sidekiq/middleware/chain.rb +15 -5
  27. data/lib/sidekiq/middleware/i18n.rb +5 -7
  28. data/lib/sidekiq/monitor.rb +133 -0
  29. data/lib/sidekiq/paginator.rb +18 -14
  30. data/lib/sidekiq/processor.rb +161 -70
  31. data/lib/sidekiq/rails.rb +30 -73
  32. data/lib/sidekiq/redis_connection.rb +67 -20
  33. data/lib/sidekiq/scheduled.rb +61 -35
  34. data/lib/sidekiq/sd_notify.rb +149 -0
  35. data/lib/sidekiq/systemd.rb +24 -0
  36. data/lib/sidekiq/testing/inline.rb +2 -1
  37. data/lib/sidekiq/testing.rb +54 -26
  38. data/lib/sidekiq/util.rb +48 -15
  39. data/lib/sidekiq/version.rb +2 -1
  40. data/lib/sidekiq/web/action.rb +15 -15
  41. data/lib/sidekiq/web/application.rb +112 -89
  42. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  43. data/lib/sidekiq/web/helpers.rb +153 -73
  44. data/lib/sidekiq/web/router.rb +27 -19
  45. data/lib/sidekiq/web.rb +64 -109
  46. data/lib/sidekiq/worker.rb +164 -41
  47. data/lib/sidekiq.rb +86 -60
  48. data/sidekiq.gemspec +24 -22
  49. data/web/assets/images/apple-touch-icon.png +0 -0
  50. data/web/assets/javascripts/application.js +25 -27
  51. data/web/assets/javascripts/dashboard.js +34 -38
  52. data/web/assets/stylesheets/application-dark.css +160 -0
  53. data/web/assets/stylesheets/application-rtl.css +246 -0
  54. data/web/assets/stylesheets/application.css +402 -12
  55. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  56. data/web/assets/stylesheets/bootstrap.css +2 -2
  57. data/web/locales/ar.yml +81 -0
  58. data/web/locales/de.yml +14 -2
  59. data/web/locales/en.yml +4 -0
  60. data/web/locales/es.yml +4 -3
  61. data/web/locales/fa.yml +80 -0
  62. data/web/locales/fr.yml +3 -3
  63. data/web/locales/he.yml +79 -0
  64. data/web/locales/ja.yml +9 -4
  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/ur.yml +80 -0
  69. data/web/locales/vi.yml +83 -0
  70. data/web/views/_footer.erb +5 -2
  71. data/web/views/_job_info.erb +3 -2
  72. data/web/views/_nav.erb +4 -18
  73. data/web/views/_paging.erb +1 -1
  74. data/web/views/busy.erb +57 -19
  75. data/web/views/dashboard.erb +3 -3
  76. data/web/views/dead.erb +2 -2
  77. data/web/views/layout.erb +13 -2
  78. data/web/views/morgue.erb +19 -12
  79. data/web/views/queue.erb +22 -12
  80. data/web/views/queues.erb +13 -3
  81. data/web/views/retries.erb +22 -13
  82. data/web/views/retry.erb +3 -3
  83. data/web/views/scheduled.erb +7 -4
  84. metadata +42 -194
  85. data/.github/contributing.md +0 -32
  86. data/.github/issue_template.md +0 -4
  87. data/.gitignore +0 -12
  88. data/.travis.yml +0 -12
  89. data/3.0-Upgrade.md +0 -70
  90. data/4.0-Upgrade.md +0 -53
  91. data/COMM-LICENSE +0 -95
  92. data/Ent-Changes.md +0 -146
  93. data/Gemfile +0 -29
  94. data/Pro-2.0-Upgrade.md +0 -138
  95. data/Pro-3.0-Upgrade.md +0 -44
  96. data/Pro-Changes.md +0 -585
  97. data/Rakefile +0 -9
  98. data/bin/sidekiqctl +0 -99
  99. data/code_of_conduct.md +0 -50
  100. data/lib/sidekiq/core_ext.rb +0 -106
  101. data/lib/sidekiq/logging.rb +0 -106
  102. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  103. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  104. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  105. data/test/config.yml +0 -9
  106. data/test/env_based_config.yml +0 -11
  107. data/test/fake_env.rb +0 -1
  108. data/test/fixtures/en.yml +0 -2
  109. data/test/helper.rb +0 -75
  110. data/test/test_actors.rb +0 -138
  111. data/test/test_api.rb +0 -528
  112. data/test/test_cli.rb +0 -418
  113. data/test/test_client.rb +0 -266
  114. data/test/test_exception_handler.rb +0 -56
  115. data/test/test_extensions.rb +0 -127
  116. data/test/test_fetch.rb +0 -50
  117. data/test/test_launcher.rb +0 -95
  118. data/test/test_logging.rb +0 -35
  119. data/test/test_manager.rb +0 -50
  120. data/test/test_middleware.rb +0 -158
  121. data/test/test_processor.rb +0 -235
  122. data/test/test_rails.rb +0 -22
  123. data/test/test_redis_connection.rb +0 -132
  124. data/test/test_retry.rb +0 -326
  125. data/test/test_retry_exhausted.rb +0 -149
  126. data/test/test_scheduled.rb +0 -115
  127. data/test/test_scheduling.rb +0 -58
  128. data/test/test_sidekiq.rb +0 -107
  129. data/test/test_testing.rb +0 -143
  130. data/test/test_testing_fake.rb +0 -357
  131. data/test/test_testing_inline.rb +0 -94
  132. data/test/test_util.rb +0 -13
  133. data/test/test_web.rb +0 -726
  134. data/test/test_web_helpers.rb +0 -54
data/lib/sidekiq.rb CHANGED
@@ -1,43 +1,46 @@
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/redis_connection"
10
+ require "sidekiq/delay"
11
+
12
+ require "json"
12
13
 
13
14
  module Sidekiq
14
- NAME = 'Sidekiq'
15
- LICENSE = 'See LICENSE and the LGPL-3.0 for licensing details.'
15
+ NAME = "Sidekiq"
16
+ LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
16
17
 
17
18
  DEFAULTS = {
18
19
  queues: [],
19
20
  labels: [],
20
- concurrency: 25,
21
- require: '.',
21
+ concurrency: 10,
22
+ require: ".",
23
+ strict: true,
22
24
  environment: nil,
23
- timeout: 8,
25
+ timeout: 25,
24
26
  poll_interval_average: nil,
25
- average_scheduled_poll_interval: 15,
27
+ average_scheduled_poll_interval: 5,
26
28
  error_handlers: [],
29
+ death_handlers: [],
27
30
  lifecycle_events: {
28
31
  startup: [],
29
32
  quiet: [],
30
33
  shutdown: [],
31
- heartbeat: [],
34
+ heartbeat: []
32
35
  },
33
36
  dead_max_jobs: 10_000,
34
37
  dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
35
- reloader: proc { |&block| block.call },
38
+ reloader: proc { |&block| block.call }
36
39
  }
37
40
 
38
41
  DEFAULT_WORKER_OPTIONS = {
39
- 'retry' => true,
40
- 'queue' => 'default'
42
+ "retry" => true,
43
+ "queue" => "default"
41
44
  }
42
45
 
43
46
  FAKE_INFO = {
@@ -46,7 +49,7 @@ module Sidekiq
46
49
  "connected_clients" => "9999",
47
50
  "used_memory_human" => "9P",
48
51
  "used_memory_peak_human" => "9P"
49
- }.freeze
52
+ }
50
53
 
51
54
  def self.❨╯°□°❩╯︵┻━┻
52
55
  puts "Calm down, yo."
@@ -55,6 +58,7 @@ module Sidekiq
55
58
  def self.options
56
59
  @options ||= DEFAULTS.dup
57
60
  end
61
+
58
62
  def self.options=(opts)
59
63
  @options = opts
60
64
  end
@@ -92,10 +96,15 @@ module Sidekiq
92
96
  retryable = true
93
97
  begin
94
98
  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/
99
+ rescue Redis::BaseError => ex
100
+ # 2550 Failover can cause the server to become a replica, need
101
+ # to disconnect and reopen the socket to get back to the primary.
102
+ # 4495 Use the same logic if we have a "Not enough replicas" error from the primary
103
+ if retryable && ex.message =~ /READONLY|NOREPLICAS/
104
+ conn.disconnect!
105
+ retryable = false
106
+ retry
107
+ end
99
108
  raise
100
109
  end
101
110
  end
@@ -103,19 +112,17 @@ module Sidekiq
103
112
 
104
113
  def self.redis_info
105
114
  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
115
+ # admin commands can't go through redis-namespace starting
116
+ # in redis-namespace 2.0
117
+ if conn.respond_to?(:namespace)
118
+ conn.redis.info
119
+ else
120
+ conn.info
118
121
  end
122
+ rescue Redis::CommandError => ex
123
+ # 2850 return fake version when INFO command has (probably) been renamed
124
+ raise unless /unknown command/.match?(ex.message)
125
+ FAKE_INFO
119
126
  end
120
127
  end
121
128
 
@@ -144,46 +151,69 @@ module Sidekiq
144
151
  end
145
152
 
146
153
  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
154
+ Middleware::Chain.new
154
155
  end
155
156
 
156
157
  def self.default_worker_options=(hash)
157
- @default_worker_options = default_worker_options.merge(hash.stringify_keys)
158
+ # stringify
159
+ @default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
158
160
  end
161
+
159
162
  def self.default_worker_options
160
163
  defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
161
164
  end
162
165
 
166
+ ##
167
+ # Death handlers are called when all retries for a job have been exhausted and
168
+ # the job dies. It's the notification to your application
169
+ # that this job will not succeed without manual intervention.
170
+ #
163
171
  # Sidekiq.configure_server do |config|
164
- # config.default_retries_exhausted = -> (job, ex) do
172
+ # config.death_handlers << ->(job, ex) do
165
173
  # end
166
174
  # 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
175
+ def self.death_handlers
176
+ options[:death_handlers]
173
177
  end
174
178
 
175
179
  def self.load_json(string)
176
180
  JSON.parse(string)
177
181
  end
182
+
178
183
  def self.dump_json(object)
179
184
  JSON.generate(object)
180
185
  end
181
186
 
187
+ def self.log_formatter
188
+ @log_formatter ||= if ENV["DYNO"]
189
+ Sidekiq::Logger::Formatters::WithoutTimestamp.new
190
+ else
191
+ Sidekiq::Logger::Formatters::Pretty.new
192
+ end
193
+ end
194
+
195
+ def self.log_formatter=(log_formatter)
196
+ @log_formatter = log_formatter
197
+ logger.formatter = log_formatter
198
+ end
199
+
182
200
  def self.logger
183
- Sidekiq::Logging.logger
201
+ @logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
184
202
  end
185
- def self.logger=(log)
186
- Sidekiq::Logging.logger = log
203
+
204
+ def self.logger=(logger)
205
+ if logger.nil?
206
+ self.logger.level = Logger::FATAL
207
+ return self.logger
208
+ end
209
+
210
+ logger.extend(Sidekiq::LoggingUtils)
211
+
212
+ @logger = logger
213
+ end
214
+
215
+ def self.pro?
216
+ defined?(Sidekiq::Pro)
187
217
  end
188
218
 
189
219
  # How frequently Redis should be checked by a random Sidekiq process for
@@ -192,7 +222,7 @@ module Sidekiq
192
222
  #
193
223
  # See sidekiq/scheduled.rb for an in-depth explanation of this value
194
224
  def self.average_scheduled_poll_interval=(interval)
195
- self.options[:average_scheduled_poll_interval] = interval
225
+ options[:average_scheduled_poll_interval] = interval
196
226
  end
197
227
 
198
228
  # Register a proc to handle any error which occurs within the Sidekiq process.
@@ -203,7 +233,7 @@ module Sidekiq
203
233
  #
204
234
  # The default error handler logs errors to Sidekiq.logger.
205
235
  def self.error_handlers
206
- self.options[:error_handlers]
236
+ options[:error_handlers]
207
237
  end
208
238
 
209
239
  # Register a block to run at a point in the Sidekiq lifecycle.
@@ -227,10 +257,6 @@ module Sidekiq
227
257
  # otherwise Ruby's Thread#kill will commit. See #377.
228
258
  # DO NOT RESCUE THIS ERROR IN YOUR WORKERS
229
259
  class Shutdown < Interrupt; end
230
-
231
260
  end
232
261
 
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)
262
+ 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/master/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