sidekiq 6.0.0 → 6.1.2

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
  3. data/.github/workflows/ci.yml +41 -0
  4. data/6.0-Upgrade.md +3 -1
  5. data/Changes.md +163 -1
  6. data/Ent-Changes.md +33 -2
  7. data/Gemfile +2 -2
  8. data/Gemfile.lock +109 -113
  9. data/Pro-Changes.md +39 -2
  10. data/README.md +4 -6
  11. data/bin/sidekiq +26 -2
  12. data/bin/sidekiqload +8 -4
  13. data/bin/sidekiqmon +4 -5
  14. data/lib/generators/sidekiq/worker_generator.rb +11 -1
  15. data/lib/sidekiq/api.rb +130 -94
  16. data/lib/sidekiq/cli.rb +40 -24
  17. data/lib/sidekiq/client.rb +33 -12
  18. data/lib/sidekiq/extensions/action_mailer.rb +3 -2
  19. data/lib/sidekiq/extensions/active_record.rb +4 -3
  20. data/lib/sidekiq/extensions/class_methods.rb +5 -4
  21. data/lib/sidekiq/fetch.rb +26 -26
  22. data/lib/sidekiq/job_logger.rb +12 -4
  23. data/lib/sidekiq/job_retry.rb +23 -10
  24. data/lib/sidekiq/launcher.rb +35 -10
  25. data/lib/sidekiq/logger.rb +108 -12
  26. data/lib/sidekiq/manager.rb +4 -4
  27. data/lib/sidekiq/middleware/chain.rb +12 -3
  28. data/lib/sidekiq/monitor.rb +3 -18
  29. data/lib/sidekiq/paginator.rb +7 -2
  30. data/lib/sidekiq/processor.rb +22 -24
  31. data/lib/sidekiq/rails.rb +16 -18
  32. data/lib/sidekiq/redis_connection.rb +21 -13
  33. data/lib/sidekiq/scheduled.rb +13 -12
  34. data/lib/sidekiq/sd_notify.rb +149 -0
  35. data/lib/sidekiq/systemd.rb +24 -0
  36. data/lib/sidekiq/testing.rb +13 -1
  37. data/lib/sidekiq/util.rb +0 -2
  38. data/lib/sidekiq/version.rb +1 -1
  39. data/lib/sidekiq/web/application.rb +23 -24
  40. data/lib/sidekiq/web/csrf_protection.rb +158 -0
  41. data/lib/sidekiq/web/helpers.rb +25 -16
  42. data/lib/sidekiq/web/router.rb +2 -4
  43. data/lib/sidekiq/web.rb +16 -8
  44. data/lib/sidekiq/worker.rb +8 -11
  45. data/lib/sidekiq.rb +22 -8
  46. data/sidekiq.gemspec +3 -4
  47. data/web/assets/javascripts/application.js +25 -27
  48. data/web/assets/javascripts/dashboard.js +2 -2
  49. data/web/assets/stylesheets/application-dark.css +143 -0
  50. data/web/assets/stylesheets/application.css +16 -6
  51. data/web/locales/de.yml +14 -2
  52. data/web/locales/en.yml +2 -0
  53. data/web/locales/fr.yml +2 -2
  54. data/web/locales/ja.yml +2 -0
  55. data/web/locales/lt.yml +83 -0
  56. data/web/locales/pl.yml +4 -4
  57. data/web/locales/ru.yml +4 -0
  58. data/web/locales/vi.yml +83 -0
  59. data/web/views/_job_info.erb +2 -1
  60. data/web/views/busy.erb +6 -3
  61. data/web/views/dead.erb +2 -2
  62. data/web/views/layout.erb +1 -0
  63. data/web/views/morgue.erb +5 -2
  64. data/web/views/queue.erb +10 -1
  65. data/web/views/queues.erb +9 -1
  66. data/web/views/retries.erb +5 -2
  67. data/web/views/retry.erb +2 -2
  68. data/web/views/scheduled.erb +5 -2
  69. metadata +21 -29
  70. data/.circleci/config.yml +0 -61
  71. data/.github/issue_template.md +0 -11
@@ -48,8 +48,8 @@ module Sidekiq
48
48
  # In practice, any option is allowed. This is the main mechanism to configure the
49
49
  # options for a specific job.
50
50
  def sidekiq_options(opts = {})
51
- opts = Hash[opts.map { |k, v| [k.to_s, v] }] # stringify
52
- self.sidekiq_options_hash = get_sidekiq_options.merge(Hash[opts.map { |k, v| [k.to_s, v] }])
51
+ opts = opts.transform_keys(&:to_s) # stringify
52
+ self.sidekiq_options_hash = get_sidekiq_options.merge(opts)
53
53
  end
54
54
 
55
55
  def sidekiq_retry_in(&block)
@@ -171,9 +171,9 @@ module Sidekiq
171
171
  now = Time.now.to_f
172
172
  ts = (int < 1_000_000_000 ? now + int : int)
173
173
 
174
- payload = @opts.merge("class" => @klass, "args" => args, "at" => ts)
174
+ payload = @opts.merge("class" => @klass, "args" => args)
175
175
  # Optimization to enqueue something now that is scheduled to go out now or in the past
176
- payload.delete("at") if ts <= now
176
+ payload["at"] = ts if ts > now
177
177
  @klass.client_push(payload)
178
178
  end
179
179
  alias_method :perform_at, :perform_in
@@ -207,10 +207,10 @@ module Sidekiq
207
207
  now = Time.now.to_f
208
208
  ts = (int < 1_000_000_000 ? now + int : int)
209
209
 
210
- item = {"class" => self, "args" => args, "at" => ts}
210
+ item = {"class" => self, "args" => args}
211
211
 
212
212
  # Optimization to enqueue something now that is scheduled to go out now or in the past
213
- item.delete("at") if ts <= now
213
+ item["at"] = ts if ts > now
214
214
 
215
215
  client_push(item)
216
216
  end
@@ -235,12 +235,9 @@ module Sidekiq
235
235
 
236
236
  def client_push(item) # :nodoc:
237
237
  pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options["pool"] || Sidekiq.redis_pool
238
- # stringify
239
- item.keys.each do |key|
240
- item[key.to_s] = item.delete(key)
241
- end
238
+ stringified_item = item.transform_keys(&:to_s)
242
239
 
243
- Sidekiq::Client.new(pool).push(item)
240
+ Sidekiq::Client.new(pool).push(stringified_item)
244
241
  end
245
242
  end
246
243
  end
data/lib/sidekiq.rb CHANGED
@@ -20,6 +20,7 @@ module Sidekiq
20
20
  labels: [],
21
21
  concurrency: 10,
22
22
  require: ".",
23
+ strict: true,
23
24
  environment: nil,
24
25
  timeout: 25,
25
26
  poll_interval_average: nil,
@@ -30,16 +31,16 @@ module Sidekiq
30
31
  startup: [],
31
32
  quiet: [],
32
33
  shutdown: [],
33
- heartbeat: [],
34
+ heartbeat: []
34
35
  },
35
36
  dead_max_jobs: 10_000,
36
37
  dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
37
- reloader: proc { |&block| block.call },
38
+ reloader: proc { |&block| block.call }
38
39
  }
39
40
 
40
41
  DEFAULT_WORKER_OPTIONS = {
41
42
  "retry" => true,
42
- "queue" => "default",
43
+ "queue" => "default"
43
44
  }
44
45
 
45
46
  FAKE_INFO = {
@@ -47,7 +48,7 @@ module Sidekiq
47
48
  "uptime_in_days" => "9999",
48
49
  "connected_clients" => "9999",
49
50
  "used_memory_human" => "9P",
50
- "used_memory_peak_human" => "9P",
51
+ "used_memory_peak_human" => "9P"
51
52
  }
52
53
 
53
54
  def self.❨╯°□°❩╯︵┻━┻
@@ -95,10 +96,11 @@ module Sidekiq
95
96
  retryable = true
96
97
  begin
97
98
  yield conn
98
- rescue Redis::CommandError => ex
99
+ rescue Redis::BaseError => ex
99
100
  # 2550 Failover can cause the server to become a replica, need
100
101
  # to disconnect and reopen the socket to get back to the primary.
101
- if retryable && ex.message =~ /READONLY/
102
+ # 4495 Use the same logic if we have a "Not enough replicas" error from the primary
103
+ if retryable && ex.message =~ /READONLY|NOREPLICAS/
102
104
  conn.disconnect!
103
105
  retryable = false
104
106
  retry
@@ -154,7 +156,7 @@ module Sidekiq
154
156
 
155
157
  def self.default_worker_options=(hash)
156
158
  # stringify
157
- @default_worker_options = default_worker_options.merge(Hash[hash.map { |k, v| [k.to_s, v] }])
159
+ @default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
158
160
  end
159
161
 
160
162
  def self.default_worker_options
@@ -192,16 +194,28 @@ module Sidekiq
192
194
 
193
195
  def self.log_formatter=(log_formatter)
194
196
  @log_formatter = log_formatter
197
+ logger.formatter = log_formatter
195
198
  end
196
199
 
197
200
  def self.logger
198
- @logger ||= Sidekiq::Logger.new(STDOUT, level: Logger::INFO)
201
+ @logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
199
202
  end
200
203
 
201
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
+
202
212
  @logger = logger
203
213
  end
204
214
 
215
+ def self.pro?
216
+ defined?(Sidekiq::Pro)
217
+ end
218
+
205
219
  # How frequently Redis should be checked by a random Sidekiq process for
206
220
  # scheduled and retriable jobs. Each individual process will take turns by
207
221
  # waiting some multiple of this value.
data/sidekiq.gemspec CHANGED
@@ -8,14 +8,13 @@ Gem::Specification.new do |gem|
8
8
  gem.homepage = "http://sidekiq.org"
9
9
  gem.license = "LGPL-3.0"
10
10
 
11
- gem.executables = ["sidekiq"]
11
+ gem.executables = ["sidekiq", "sidekiqmon"]
12
12
  gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
13
13
  gem.name = "sidekiq"
14
14
  gem.version = Sidekiq::VERSION
15
15
  gem.required_ruby_version = ">= 2.5.0"
16
16
 
17
- gem.add_dependency "redis", ">= 4.1.0"
17
+ gem.add_dependency "redis", ">= 4.2.0"
18
18
  gem.add_dependency "connection_pool", ">= 2.2.2"
19
- gem.add_dependency "rack", ">= 2.0.0"
20
- gem.add_dependency "rack-protection", ">= 2.0.0"
19
+ gem.add_dependency "rack", "~> 2.0"
21
20
  end