sidekiq 6.4.2 → 6.5.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.
- checksums.yaml +4 -4
- data/Changes.md +24 -0
- data/bin/sidekiqload +15 -3
- data/lib/sidekiq/.DS_Store +0 -0
- data/lib/sidekiq/api.rb +47 -20
- data/lib/sidekiq/cli.rb +33 -32
- data/lib/sidekiq/client.rb +4 -4
- data/lib/sidekiq/component.rb +64 -0
- data/lib/sidekiq/delay.rb +1 -1
- data/lib/sidekiq/fetch.rb +16 -14
- data/lib/sidekiq/job_retry.rb +6 -5
- data/lib/sidekiq/job_util.rb +7 -3
- data/lib/sidekiq/launcher.rb +18 -17
- data/lib/sidekiq/logger.rb +1 -1
- data/lib/sidekiq/manager.rb +23 -20
- data/lib/sidekiq/middleware/chain.rb +20 -11
- data/lib/sidekiq/middleware/current_attributes.rb +4 -0
- data/lib/sidekiq/middleware/i18n.rb +2 -0
- data/lib/sidekiq/middleware/modules.rb +21 -0
- data/lib/sidekiq/paginator.rb +2 -2
- data/lib/sidekiq/processor.rb +12 -12
- data/lib/sidekiq/rails.rb +5 -5
- data/lib/sidekiq/redis_client_adapter.rb +154 -0
- data/lib/sidekiq/redis_connection.rb +80 -47
- data/lib/sidekiq/ring_buffer.rb +29 -0
- data/lib/sidekiq/scheduled.rb +11 -10
- data/lib/sidekiq/testing.rb +1 -1
- data/lib/sidekiq/transaction_aware_client.rb +45 -0
- data/lib/sidekiq/version.rb +1 -1
- data/lib/sidekiq/web/helpers.rb +1 -1
- data/lib/sidekiq/worker.rb +2 -1
- data/lib/sidekiq.rb +78 -17
- data/web/locales/pt-br.yml +27 -9
- metadata +8 -4
- data/lib/sidekiq/exception_handler.rb +0 -27
- data/lib/sidekiq/util.rb +0 -108
data/lib/sidekiq.rb
CHANGED
@@ -5,6 +5,7 @@ fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.5.0." i
|
|
5
5
|
|
6
6
|
require "sidekiq/logger"
|
7
7
|
require "sidekiq/client"
|
8
|
+
require "sidekiq/transaction_aware_client"
|
8
9
|
require "sidekiq/worker"
|
9
10
|
require "sidekiq/job"
|
10
11
|
require "sidekiq/redis_connection"
|
@@ -52,19 +53,79 @@ module Sidekiq
|
|
52
53
|
puts "Calm down, yo."
|
53
54
|
end
|
54
55
|
|
56
|
+
# config.concurrency = 5
|
57
|
+
def self.concurrency=(val)
|
58
|
+
self[:concurrency] = Integer(val)
|
59
|
+
end
|
60
|
+
|
61
|
+
# config.queues = %w( high default low ) # strict
|
62
|
+
# config.queues = %w( high,3 default,2 low,1 ) # weighted
|
63
|
+
# config.queues = %w( feature1,1 feature2,1 feature3,1 ) # random
|
64
|
+
#
|
65
|
+
# With weighted priority, queue will be checked first (weight / total) of the time.
|
66
|
+
# high will be checked first (3/6) or 50% of the time.
|
67
|
+
# I'd recommend setting weights between 1-10. Weights in the hundreds or thousands
|
68
|
+
# are ridiculous and unnecessarily expensive. You can get random queue ordering
|
69
|
+
# by explicitly setting all weights to 1.
|
70
|
+
def self.queues=(val)
|
71
|
+
self[:queues] = Array(val).each_with_object([]) do |qstr, memo|
|
72
|
+
name, weight = qstr.split(",")
|
73
|
+
self[:strict] = false if weight.to_i > 0
|
74
|
+
[weight.to_i, 1].max.times do
|
75
|
+
memo << name
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
### Private APIs
|
81
|
+
def self.default_error_handler(ex, ctx)
|
82
|
+
logger.warn(dump_json(ctx)) unless ctx.empty?
|
83
|
+
logger.warn("#{ex.class.name}: #{ex.message}")
|
84
|
+
logger.warn(ex.backtrace.join("\n")) unless ex.backtrace.nil?
|
85
|
+
end
|
86
|
+
|
87
|
+
@config = DEFAULTS.dup
|
55
88
|
def self.options
|
56
|
-
|
89
|
+
logger.warn "`config.options[:key] = value` is deprecated, use `config[:key] = value`: #{caller(1..2)}"
|
90
|
+
@config
|
57
91
|
end
|
58
92
|
|
59
93
|
def self.options=(opts)
|
60
|
-
|
94
|
+
logger.warn "config.options = hash` is deprecated, use `config.merge!(hash)`: #{caller(1..2)}"
|
95
|
+
@config = opts
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.[](key)
|
99
|
+
@config[key]
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.[]=(key, val)
|
103
|
+
@config[key] = val
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.merge!(hash)
|
107
|
+
@config.merge!(hash)
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.fetch(*args, &block)
|
111
|
+
@config.fetch(*args, &block)
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.handle_exception(ex, ctx = {})
|
115
|
+
self[:error_handlers].each do |handler|
|
116
|
+
handler.call(ex, ctx)
|
117
|
+
rescue => ex
|
118
|
+
logger.error "!!! ERROR HANDLER THREW AN ERROR !!!"
|
119
|
+
logger.error ex
|
120
|
+
logger.error ex.backtrace.join("\n") unless ex.backtrace.nil?
|
121
|
+
end
|
61
122
|
end
|
123
|
+
###
|
62
124
|
|
63
125
|
##
|
64
126
|
# Configuration for Sidekiq server, use like:
|
65
127
|
#
|
66
128
|
# Sidekiq.configure_server do |config|
|
67
|
-
# config.redis = { :namespace => 'myapp', :size => 25, :url => 'redis://myhost:8877/0' }
|
68
129
|
# config.server_middleware do |chain|
|
69
130
|
# chain.add MyServerHook
|
70
131
|
# end
|
@@ -77,7 +138,7 @@ module Sidekiq
|
|
77
138
|
# Configuration for Sidekiq client, use like:
|
78
139
|
#
|
79
140
|
# Sidekiq.configure_client do |config|
|
80
|
-
# config.redis = { :
|
141
|
+
# config.redis = { size: 1, url: 'redis://myhost:8877/0' }
|
81
142
|
# end
|
82
143
|
def self.configure_client
|
83
144
|
yield self unless server?
|
@@ -93,7 +154,7 @@ module Sidekiq
|
|
93
154
|
retryable = true
|
94
155
|
begin
|
95
156
|
yield conn
|
96
|
-
rescue
|
157
|
+
rescue RedisConnection.adapter::BaseError => ex
|
97
158
|
# 2550 Failover can cause the server to become a replica, need
|
98
159
|
# to disconnect and reopen the socket to get back to the primary.
|
99
160
|
# 4495 Use the same logic if we have a "Not enough replicas" error from the primary
|
@@ -118,7 +179,7 @@ module Sidekiq
|
|
118
179
|
else
|
119
180
|
conn.info
|
120
181
|
end
|
121
|
-
rescue
|
182
|
+
rescue RedisConnection.adapter::CommandError => ex
|
122
183
|
# 2850 return fake version when INFO command has (probably) been renamed
|
123
184
|
raise unless /unknown command/.match?(ex.message)
|
124
185
|
FAKE_INFO
|
@@ -126,19 +187,19 @@ module Sidekiq
|
|
126
187
|
end
|
127
188
|
|
128
189
|
def self.redis_pool
|
129
|
-
@redis ||=
|
190
|
+
@redis ||= RedisConnection.create
|
130
191
|
end
|
131
192
|
|
132
193
|
def self.redis=(hash)
|
133
194
|
@redis = if hash.is_a?(ConnectionPool)
|
134
195
|
hash
|
135
196
|
else
|
136
|
-
|
197
|
+
RedisConnection.create(hash)
|
137
198
|
end
|
138
199
|
end
|
139
200
|
|
140
201
|
def self.client_middleware
|
141
|
-
@client_chain ||= Middleware::Chain.new
|
202
|
+
@client_chain ||= Middleware::Chain.new(self)
|
142
203
|
yield @client_chain if block_given?
|
143
204
|
@client_chain
|
144
205
|
end
|
@@ -150,7 +211,7 @@ module Sidekiq
|
|
150
211
|
end
|
151
212
|
|
152
213
|
def self.default_server_middleware
|
153
|
-
Middleware::Chain.new
|
214
|
+
Middleware::Chain.new(self)
|
154
215
|
end
|
155
216
|
|
156
217
|
def self.default_worker_options=(hash) # deprecated
|
@@ -179,7 +240,7 @@ module Sidekiq
|
|
179
240
|
# end
|
180
241
|
# end
|
181
242
|
def self.death_handlers
|
182
|
-
|
243
|
+
self[:death_handlers]
|
183
244
|
end
|
184
245
|
|
185
246
|
def self.load_json(string)
|
@@ -209,7 +270,7 @@ module Sidekiq
|
|
209
270
|
|
210
271
|
def self.logger=(logger)
|
211
272
|
if logger.nil?
|
212
|
-
self.logger.
|
273
|
+
self.logger.level = Logger::FATAL
|
213
274
|
return self.logger
|
214
275
|
end
|
215
276
|
|
@@ -232,7 +293,7 @@ module Sidekiq
|
|
232
293
|
#
|
233
294
|
# See sidekiq/scheduled.rb for an in-depth explanation of this value
|
234
295
|
def self.average_scheduled_poll_interval=(interval)
|
235
|
-
|
296
|
+
self[:average_scheduled_poll_interval] = interval
|
236
297
|
end
|
237
298
|
|
238
299
|
# Register a proc to handle any error which occurs within the Sidekiq process.
|
@@ -243,7 +304,7 @@ module Sidekiq
|
|
243
304
|
#
|
244
305
|
# The default error handler logs errors to Sidekiq.logger.
|
245
306
|
def self.error_handlers
|
246
|
-
|
307
|
+
self[:error_handlers]
|
247
308
|
end
|
248
309
|
|
249
310
|
# Register a block to run at a point in the Sidekiq lifecycle.
|
@@ -256,12 +317,12 @@ module Sidekiq
|
|
256
317
|
# end
|
257
318
|
def self.on(event, &block)
|
258
319
|
raise ArgumentError, "Symbols only please: #{event}" unless event.is_a?(Symbol)
|
259
|
-
raise ArgumentError, "Invalid event name: #{event}" unless
|
260
|
-
|
320
|
+
raise ArgumentError, "Invalid event name: #{event}" unless self[:lifecycle_events].key?(event)
|
321
|
+
self[:lifecycle_events][event] << block
|
261
322
|
end
|
262
323
|
|
263
324
|
def self.strict_args!(mode = :raise)
|
264
|
-
|
325
|
+
self[:on_complex_arguments] = mode
|
265
326
|
end
|
266
327
|
|
267
328
|
# We are shutting down Sidekiq but what about threads that
|
data/web/locales/pt-br.yml
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
History: Histórico
|
9
9
|
Busy: Ocupados
|
10
10
|
Processed: Processados
|
11
|
+
Utilization: Utilização
|
11
12
|
Failed: Falhas
|
12
13
|
Scheduled: Agendados
|
13
14
|
Retries: Tentativas
|
@@ -26,18 +27,20 @@
|
|
26
27
|
Delete: Apagar
|
27
28
|
AddToQueue: Adicionar à fila
|
28
29
|
AreYouSureDeleteJob: Deseja deletar esta tarefa?
|
29
|
-
AreYouSureDeleteQueue: Deseja deletar a %{queue} fila
|
30
|
+
AreYouSureDeleteQueue: Deseja deletar a fila %{queue}? Isso irá deletar todas as tarefas desta fila.
|
30
31
|
Queues: Filas
|
31
32
|
Size: Tamanho
|
32
33
|
Actions: Ações
|
33
34
|
NextRetry: Próxima Tentativa
|
34
35
|
RetryCount: Número de Tentativas
|
35
36
|
RetryNow: Tentar novamente agora
|
37
|
+
Kill: Matar
|
36
38
|
LastRetry: Última tentativa
|
37
39
|
OriginallyFailed: Falhou originalmente
|
38
40
|
AreYouSure: Tem certeza?
|
39
41
|
DeleteAll: Apagar tudo
|
40
42
|
RetryAll: Tentar tudo novamente
|
43
|
+
KillAll: Matar todas
|
41
44
|
NoRetriesFound: Nenhuma tentativa encontrada
|
42
45
|
Error: Erro
|
43
46
|
ErrorClass: Classe de erro
|
@@ -58,11 +61,26 @@
|
|
58
61
|
OneMonth: 1 mês
|
59
62
|
ThreeMonths: 3 meses
|
60
63
|
SixMonths: 6 meses
|
61
|
-
Failures
|
62
|
-
DeadJobs
|
63
|
-
NoDeadJobsFound
|
64
|
-
Dead
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
64
|
+
Failures: Falhas
|
65
|
+
DeadJobs: Tarefas mortas
|
66
|
+
NoDeadJobsFound: Nenhuma tarefa morta foi encontrada
|
67
|
+
Dead: Morta
|
68
|
+
Process: Processo
|
69
|
+
Processes: Processos
|
70
|
+
Name: Nome
|
71
|
+
Thread: Thread
|
72
|
+
Threads: Threads
|
73
|
+
Jobs: Tarefas
|
74
|
+
Paused: Pausado
|
75
|
+
Stop: Parar
|
76
|
+
Quiet: Silenciar
|
77
|
+
StopAll: Parar Todos
|
78
|
+
QuietAll: Silenciar Todos
|
79
|
+
PollingInterval: Intervalo de Polling
|
80
|
+
Plugins: Plug-ins
|
81
|
+
NotYetEnqueued: Ainda não enfileirado
|
82
|
+
CreatedAt: Criado em
|
83
|
+
BackToApp: De volta ao aplicativo
|
84
|
+
Latency: Latência
|
85
|
+
Pause: Pausar
|
86
|
+
Unpause: Despausar
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Perham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -72,11 +72,12 @@ files:
|
|
72
72
|
- lib/generators/sidekiq/templates/job_spec.rb.erb
|
73
73
|
- lib/generators/sidekiq/templates/job_test.rb.erb
|
74
74
|
- lib/sidekiq.rb
|
75
|
+
- lib/sidekiq/.DS_Store
|
75
76
|
- lib/sidekiq/api.rb
|
76
77
|
- lib/sidekiq/cli.rb
|
77
78
|
- lib/sidekiq/client.rb
|
79
|
+
- lib/sidekiq/component.rb
|
78
80
|
- lib/sidekiq/delay.rb
|
79
|
-
- lib/sidekiq/exception_handler.rb
|
80
81
|
- lib/sidekiq/extensions/action_mailer.rb
|
81
82
|
- lib/sidekiq/extensions/active_record.rb
|
82
83
|
- lib/sidekiq/extensions/class_methods.rb
|
@@ -92,17 +93,20 @@ files:
|
|
92
93
|
- lib/sidekiq/middleware/chain.rb
|
93
94
|
- lib/sidekiq/middleware/current_attributes.rb
|
94
95
|
- lib/sidekiq/middleware/i18n.rb
|
96
|
+
- lib/sidekiq/middleware/modules.rb
|
95
97
|
- lib/sidekiq/monitor.rb
|
96
98
|
- lib/sidekiq/paginator.rb
|
97
99
|
- lib/sidekiq/processor.rb
|
98
100
|
- lib/sidekiq/rails.rb
|
101
|
+
- lib/sidekiq/redis_client_adapter.rb
|
99
102
|
- lib/sidekiq/redis_connection.rb
|
103
|
+
- lib/sidekiq/ring_buffer.rb
|
100
104
|
- lib/sidekiq/scheduled.rb
|
101
105
|
- lib/sidekiq/sd_notify.rb
|
102
106
|
- lib/sidekiq/systemd.rb
|
103
107
|
- lib/sidekiq/testing.rb
|
104
108
|
- lib/sidekiq/testing/inline.rb
|
105
|
-
- lib/sidekiq/
|
109
|
+
- lib/sidekiq/transaction_aware_client.rb
|
106
110
|
- lib/sidekiq/version.rb
|
107
111
|
- lib/sidekiq/web.rb
|
108
112
|
- lib/sidekiq/web/action.rb
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "sidekiq"
|
4
|
-
|
5
|
-
module Sidekiq
|
6
|
-
module ExceptionHandler
|
7
|
-
class Logger
|
8
|
-
def call(ex, ctx)
|
9
|
-
Sidekiq.logger.warn(Sidekiq.dump_json(ctx)) unless ctx.empty?
|
10
|
-
Sidekiq.logger.warn("#{ex.class.name}: #{ex.message}")
|
11
|
-
Sidekiq.logger.warn(ex.backtrace.join("\n")) unless ex.backtrace.nil?
|
12
|
-
end
|
13
|
-
|
14
|
-
Sidekiq.error_handlers << Sidekiq::ExceptionHandler::Logger.new
|
15
|
-
end
|
16
|
-
|
17
|
-
def handle_exception(ex, ctx = {})
|
18
|
-
Sidekiq.error_handlers.each do |handler|
|
19
|
-
handler.call(ex, ctx)
|
20
|
-
rescue => ex
|
21
|
-
Sidekiq.logger.error "!!! ERROR HANDLER THREW AN ERROR !!!"
|
22
|
-
Sidekiq.logger.error ex
|
23
|
-
Sidekiq.logger.error ex.backtrace.join("\n") unless ex.backtrace.nil?
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/sidekiq/util.rb
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "forwardable"
|
4
|
-
require "socket"
|
5
|
-
require "securerandom"
|
6
|
-
require "sidekiq/exception_handler"
|
7
|
-
|
8
|
-
module Sidekiq
|
9
|
-
##
|
10
|
-
# This module is part of Sidekiq core and not intended for extensions.
|
11
|
-
#
|
12
|
-
|
13
|
-
class RingBuffer
|
14
|
-
include Enumerable
|
15
|
-
extend Forwardable
|
16
|
-
def_delegators :@buf, :[], :each, :size
|
17
|
-
|
18
|
-
def initialize(size, default = 0)
|
19
|
-
@size = size
|
20
|
-
@buf = Array.new(size, default)
|
21
|
-
@index = 0
|
22
|
-
end
|
23
|
-
|
24
|
-
def <<(element)
|
25
|
-
@buf[@index % @size] = element
|
26
|
-
@index += 1
|
27
|
-
element
|
28
|
-
end
|
29
|
-
|
30
|
-
def buffer
|
31
|
-
@buf
|
32
|
-
end
|
33
|
-
|
34
|
-
def reset(default = 0)
|
35
|
-
@buf.fill(default)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
module Util
|
40
|
-
include ExceptionHandler
|
41
|
-
|
42
|
-
# hack for quicker development / testing environment #2774
|
43
|
-
PAUSE_TIME = $stdout.tty? ? 0.1 : 0.5
|
44
|
-
|
45
|
-
# Wait for the orblock to be true or the deadline passed.
|
46
|
-
def wait_for(deadline, &condblock)
|
47
|
-
remaining = deadline - ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
48
|
-
while remaining > PAUSE_TIME
|
49
|
-
return if condblock.call
|
50
|
-
sleep PAUSE_TIME
|
51
|
-
remaining = deadline - ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def watchdog(last_words)
|
56
|
-
yield
|
57
|
-
rescue Exception => ex
|
58
|
-
handle_exception(ex, {context: last_words})
|
59
|
-
raise ex
|
60
|
-
end
|
61
|
-
|
62
|
-
def safe_thread(name, &block)
|
63
|
-
Thread.new do
|
64
|
-
Thread.current.name = name
|
65
|
-
watchdog(name, &block)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def logger
|
70
|
-
Sidekiq.logger
|
71
|
-
end
|
72
|
-
|
73
|
-
def redis(&block)
|
74
|
-
Sidekiq.redis(&block)
|
75
|
-
end
|
76
|
-
|
77
|
-
def tid
|
78
|
-
Thread.current["sidekiq_tid"] ||= (Thread.current.object_id ^ ::Process.pid).to_s(36)
|
79
|
-
end
|
80
|
-
|
81
|
-
def hostname
|
82
|
-
ENV["DYNO"] || Socket.gethostname
|
83
|
-
end
|
84
|
-
|
85
|
-
def process_nonce
|
86
|
-
@@process_nonce ||= SecureRandom.hex(6)
|
87
|
-
end
|
88
|
-
|
89
|
-
def identity
|
90
|
-
@@identity ||= "#{hostname}:#{::Process.pid}:#{process_nonce}"
|
91
|
-
end
|
92
|
-
|
93
|
-
def fire_event(event, options = {})
|
94
|
-
reverse = options[:reverse]
|
95
|
-
reraise = options[:reraise]
|
96
|
-
|
97
|
-
arr = Sidekiq.options[:lifecycle_events][event]
|
98
|
-
arr.reverse! if reverse
|
99
|
-
arr.each do |block|
|
100
|
-
block.call
|
101
|
-
rescue => ex
|
102
|
-
handle_exception(ex, {context: "Exception during Sidekiq lifecycle event.", event: event})
|
103
|
-
raise ex if reraise
|
104
|
-
end
|
105
|
-
arr.clear
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|