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.

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
- @options ||= DEFAULTS.dup
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
- @options = opts
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 = { :namespace => 'myapp', :size => 1, :url => 'redis://myhost:8877/0' }
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 Redis::BaseError => ex
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 Redis::CommandError => ex
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 ||= Sidekiq::RedisConnection.create
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
- Sidekiq::RedisConnection.create(hash)
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
- options[:death_handlers]
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.fatal!
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
- options[:average_scheduled_poll_interval] = interval
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
- options[:error_handlers]
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 options[:lifecycle_events].key?(event)
260
- options[:lifecycle_events][event] << block
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
- options[:on_complex_arguments] = mode
325
+ self[:on_complex_arguments] = mode
265
326
  end
266
327
 
267
328
  # We are shutting down Sidekiq but what about threads that
@@ -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 : Falhas
62
- DeadJobs : Tarefas mortas
63
- NoDeadJobsFound : Nenhuma tarefa morta foi encontrada
64
- Dead : Morta
65
- Processes : Processos
66
- Thread : Thread
67
- Threads : Threads
68
- Jobs : Tarefas
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.2
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-04-19 00:00:00.000000000 Z
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/util.rb
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