sidekiq 7.1.4 → 7.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a6064918f9c33be1d21f890b9cff080969fb44a916fe67ccb36958fe0a3b8f3
4
- data.tar.gz: baf268f21f27e0dac2fc287f247910afe493e4dcaee21aa769ccebbed03e7699
3
+ metadata.gz: b9e59dd929beab7b591592800b1b38d7683728b6f6b09e0c3a6b1e7c86ce524f
4
+ data.tar.gz: 27009dd8f71c92bbde9378a4ee1b39a5122ad2c241a9ebb6b55ea295795c87be
5
5
  SHA512:
6
- metadata.gz: c8f4e3caaeab143f20fdd592dc7939f09a302642867bddb4fcd02cbbaa0e734d7685ee3ad02543d3bb3ba6cbedaf2cbab3577a849c03d2f351aa7918d6eab73f
7
- data.tar.gz: 1cf71898600afb872ee717be6496da7a146aa8e2f528b6c73e3630a64f71869bc23bfa2d7130f021c7f5e12b473ed3b537cebb4a8fedcfbe517af48dde5bbea6
6
+ metadata.gz: 10f292d33bb676892789806030f5e9d54d55bcbd7b22431e10f08b8fe7add524a712e16d9e03c8d1913538809468fdc3cff05cfd60188520ba0c015421d100b3
7
+ data.tar.gz: ab4e2225a3aced675ad7bcd65dd377689c7bb2131a828eaab8044b9fbefa68516bac48fd0825f318a13559a797b3f0f547bb6681394aebf14c911bdcbf8817c9
data/Changes.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  [Sidekiq Changes](https://github.com/sidekiq/sidekiq/blob/main/Changes.md) | [Sidekiq Pro Changes](https://github.com/sidekiq/sidekiq/blob/main/Pro-Changes.md) | [Sidekiq Enterprise Changes](https://github.com/sidekiq/sidekiq/blob/main/Ent-Changes.md)
4
4
 
5
+ 7.1.5
6
+ ----------
7
+
8
+ - **FEATURE**: Job filtering within the Web UI. This feature has been open
9
+ sourced from Sidekiq Pro. [#6052]
10
+ - **API CHANGE** Error handlers now take three arguments `->(ex, context, config)`.
11
+ The previous calling convention will work until Sidekiq 8.0 but will print
12
+ out a deprecation warning. [#6051]
13
+ - Fix issue with the `batch_size` and `at` options in `S::Client.push_bulk` [#6040]
14
+ - Fix inline testing firing batch callbacks early [#6057]
15
+ - Use new log broadcast API in Rails 7.1 [#6054]
16
+ - Crash if user tries to use RESP2 `protocol: 2` [#6061]
17
+
5
18
  7.1.4
6
19
  ----------
7
20
 
data/README.md CHANGED
@@ -83,7 +83,7 @@ You can purchase at https://sidekiq.org; email support@contribsys.com for help.
83
83
  Useful resources:
84
84
 
85
85
  * Product documentation is in the [wiki](https://github.com/sidekiq/sidekiq/wiki).
86
- * Occasional announcements are made to the [@sidekiq](https://twitter.com/sidekiq) Twitter account.
86
+ * Occasional announcements are made to the [@sidekiq](https://ruby.social/@sidekiq) Mastodon account.
87
87
  * The [Sidekiq tag](https://stackoverflow.com/questions/tagged/sidekiq) on Stack Overflow has lots of useful Q & A.
88
88
 
89
89
  Every Friday morning is Sidekiq office hour: I video chat and answer questions.
@@ -103,4 +103,4 @@ The license for Sidekiq Pro and Sidekiq Enterprise can be found in [COMM-LICENSE
103
103
  Author
104
104
  -----------------
105
105
 
106
- Mike Perham, [@getajobmike](https://twitter.com/getajobmike) / [@sidekiq](https://twitter.com/sidekiq), [https://www.mikeperham.com](https://www.mikeperham.com) / [https://www.contribsys.com](https://www.contribsys.com)
106
+ Mike Perham, [@getajobmike](https://ruby.social/@getajobmike) / [@sidekiq](https://ruby.social/@sidekiq), [https://www.mikeperham.com](https://www.mikeperham.com) / [https://www.contribsys.com](https://www.contribsys.com)
@@ -124,19 +124,21 @@ module Sidekiq
124
124
  raise ArgumentError, "Explicitly passing 'jid' when pushing more than one job is not supported" if jid && args.size > 1
125
125
 
126
126
  normed = normalize_item(items)
127
+ slice_index = 0
127
128
  result = args.each_slice(batch_size).flat_map do |slice|
128
129
  raise ArgumentError, "Bulk arguments must be an Array of Arrays: [[1], [2]]" unless slice.is_a?(Array) && slice.all?(Array)
129
130
  break [] if slice.empty? # no jobs to push
130
131
 
131
132
  payloads = slice.map.with_index { |job_args, index|
132
133
  copy = normed.merge("args" => job_args, "jid" => SecureRandom.hex(12))
133
- copy["at"] = (at.is_a?(Array) ? at[index] : at) if at
134
+ copy["at"] = (at.is_a?(Array) ? at[slice_index + index] : at) if at
134
135
  result = middleware.invoke(items["class"], copy, copy["queue"], @redis_pool) do
135
136
  verify_json(copy)
136
137
  copy
137
138
  end
138
139
  result || nil
139
140
  }
141
+ slice_index += batch_size
140
142
 
141
143
  to_push = payloads.compact
142
144
  raw_push(to_push) unless to_push.empty?
@@ -34,8 +34,7 @@ module Sidekiq
34
34
  backtrace_cleaner: ->(backtrace) { backtrace }
35
35
  }
36
36
 
37
- ERROR_HANDLER = ->(ex, ctx) {
38
- cfg = ctx[:_config] || Sidekiq.default_configuration
37
+ ERROR_HANDLER = ->(ex, ctx, cfg = Sidekiq.default_configuration) {
39
38
  l = cfg.logger
40
39
  l.warn(Sidekiq.dump_json(ctx)) unless ctx.empty?
41
40
  l.warn("#{ex.class.name}: #{ex.message}")
@@ -264,9 +263,14 @@ module Sidekiq
264
263
  if @options[:error_handlers].size == 0
265
264
  p ["!!!!!", ex]
266
265
  end
267
- ctx[:_config] = self
268
266
  @options[:error_handlers].each do |handler|
269
- handler.call(ex, ctx)
267
+ if handler.arity == 2
268
+ # TODO Remove in 8.0
269
+ logger.info { "DEPRECATION: Sidekiq exception handlers now take three arguments, see #{handler}" }
270
+ handler.call(ex, {_config: self}.merge(ctx))
271
+ else
272
+ handler.call(ex, ctx, self)
273
+ end
270
274
  rescue Exception => e
271
275
  l = logger
272
276
  l.error "!!! ERROR HANDLER THREW AN ERROR !!!"
data/lib/sidekiq/rails.rb CHANGED
@@ -20,10 +20,6 @@ module Sidekiq
20
20
  def inspect
21
21
  "#<Sidekiq::Rails::Reloader @app=#{@app.class.name}>"
22
22
  end
23
-
24
- def to_json(*)
25
- Sidekiq.dump_json(inspect)
26
- end
27
23
  end
28
24
 
29
25
  # By including the Options module, we allow AJs to directly control sidekiq features
@@ -43,17 +39,6 @@ module Sidekiq
43
39
  end
44
40
  end
45
41
 
46
- initializer "sidekiq.rails_logger" do
47
- Sidekiq.configure_server do |config|
48
- # This is the integration code necessary so that if a job uses `Rails.logger.info "Hello"`,
49
- # it will appear in the Sidekiq console with all of the job context. See #5021 and
50
- # https://github.com/rails/rails/blob/b5f2b550f69a99336482739000c58e4e04e033aa/railties/lib/rails/commands/server/server_command.rb#L82-L84
51
- unless ::Rails.logger == config.logger || ::ActiveSupport::Logger.logger_outputs_to?(::Rails.logger, $stdout)
52
- ::Rails.logger.extend(::ActiveSupport::Logger.broadcast(config.logger))
53
- end
54
- end
55
- end
56
-
57
42
  initializer "sidekiq.backtrace_cleaner" do
58
43
  Sidekiq.configure_server do |config|
59
44
  config[:backtrace_cleaner] = ->(backtrace) { ::Rails.backtrace_cleaner.clean(backtrace) }
@@ -67,6 +52,16 @@ module Sidekiq
67
52
  config.after_initialize do
68
53
  Sidekiq.configure_server do |config|
69
54
  config[:reloader] = Sidekiq::Rails::Reloader.new
55
+
56
+ # This is the integration code necessary so that if a job uses `Rails.logger.info "Hello"`,
57
+ # it will appear in the Sidekiq console with all of the job context.
58
+ unless ::Rails.logger == config.logger || ::ActiveSupport::Logger.logger_outputs_to?(::Rails.logger, $stdout)
59
+ if ::Rails::VERSION::STRING < "7.1"
60
+ ::Rails.logger.extend(::ActiveSupport::Logger.broadcast(config.logger))
61
+ else
62
+ ::Rails.logger.broadcast_to(config.logger)
63
+ end
64
+ end
70
65
  end
71
66
  end
72
67
  end
@@ -63,8 +63,7 @@ module Sidekiq
63
63
  opts = options.dup
64
64
 
65
65
  if opts[:namespace]
66
- raise ArgumentError, "Your Redis configuration uses the namespace '#{opts[:namespace]}' but this feature isn't supported by redis-client. " \
67
- "Either use the redis adapter or remove the namespace."
66
+ raise ArgumentError, "Your Redis configuration uses the namespace '#{opts[:namespace]}' but this feature is no longer supported in Sidekiq 7+. See https://github.com/sidekiq/sidekiq/blob/main/docs/7.0-Upgrade.md#redis-namespace."
68
67
  end
69
68
 
70
69
  opts.delete(:size)
@@ -14,6 +14,7 @@ module Sidekiq
14
14
  logger = symbolized_options.delete(:logger)
15
15
  logger&.info { "Sidekiq #{Sidekiq::VERSION} connecting to Redis with options #{scrub(symbolized_options)}" }
16
16
 
17
+ raise "Sidekiq 7+ does not support Redis protocol 2" if symbolized_options[:protocol] == 2
17
18
  size = symbolized_options.delete(:size) || 5
18
19
  pool_timeout = symbolized_options.delete(:pool_timeout) || 1
19
20
  pool_name = symbolized_options.delete(:pool_name)
@@ -64,7 +64,7 @@ module Sidekiq
64
64
  class EmptyQueueError < RuntimeError; end
65
65
 
66
66
  module TestingClient
67
- def raw_push(payloads)
67
+ def atomic_push(conn, payloads)
68
68
  if Sidekiq::Testing.fake?
69
69
  payloads.each do |job|
70
70
  job = Sidekiq.load_json(Sidekiq.dump_json(job))
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sidekiq
4
- VERSION = "7.1.4"
4
+ VERSION = "7.1.5"
5
5
  MAJOR = 7
6
6
  end
@@ -328,6 +328,56 @@ module Sidekiq
328
328
  json Sidekiq::Stats.new.queues
329
329
  end
330
330
 
331
+ ########
332
+ # Filtering
333
+ get "/filter/retries" do
334
+ x = params[:substr]
335
+ return redirect "#{root_path}retries" unless x && x != ""
336
+
337
+ @retries = search(Sidekiq::RetrySet.new, params[:substr])
338
+ erb :retries
339
+ end
340
+
341
+ post "/filter/retries" do
342
+ x = params[:substr]
343
+ return redirect "#{root_path}retries" unless x && x != ""
344
+
345
+ @retries = search(Sidekiq::RetrySet.new, params[:substr])
346
+ erb :retries
347
+ end
348
+
349
+ get "/filter/scheduled" do
350
+ x = params[:substr]
351
+ return redirect "#{root_path}scheduled" unless x && x != ""
352
+
353
+ @scheduled = search(Sidekiq::ScheduledSet.new, params[:substr])
354
+ erb :scheduled
355
+ end
356
+
357
+ post "/filter/scheduled" do
358
+ x = params[:substr]
359
+ return redirect "#{root_path}scheduled" unless x && x != ""
360
+
361
+ @scheduled = search(Sidekiq::ScheduledSet.new, params[:substr])
362
+ erb :scheduled
363
+ end
364
+
365
+ get "/filter/dead" do
366
+ x = params[:substr]
367
+ return redirect "#{root_path}morgue" unless x && x != ""
368
+
369
+ @dead = search(Sidekiq::DeadSet.new, params[:substr])
370
+ erb :morgue
371
+ end
372
+
373
+ post "/filter/dead" do
374
+ x = params[:substr]
375
+ return redirect "#{root_path}morgue" unless x && x != ""
376
+
377
+ @dead = search(Sidekiq::DeadSet.new, params[:substr])
378
+ erb :morgue
379
+ end
380
+
331
381
  def call(env)
332
382
  action = self.class.match(env)
333
383
  return [404, {Rack::CONTENT_TYPE => "text/plain", Web::X_CASCADE => "pass"}, ["Not Found"]] unless action
@@ -49,8 +49,29 @@ module Sidekiq
49
49
  locale_files.select { |file| file =~ /\/#{lang}\.yml$/ }
50
50
  end
51
51
 
52
- # This is a hook for a Sidekiq Pro feature. Please don't touch.
53
- def filtering(*)
52
+ def search(jobset, substr)
53
+ resultset = jobset.scan(substr).to_a
54
+ @current_page = 1
55
+ @count = @total_size = resultset.size
56
+ resultset
57
+ end
58
+
59
+ def filtering(which)
60
+ erb(:filtering, locals: {which: which})
61
+ end
62
+
63
+ def filter_link(jid, within = "retries")
64
+ if within.nil?
65
+ ::Rack::Utils.escape_html(jid)
66
+ else
67
+ "<a href='#{root_path}filter/#{within}?substr=#{jid}'>#{::Rack::Utils.escape_html(jid)}</a>"
68
+ end
69
+ end
70
+
71
+ def display_tags(job, within = "retries")
72
+ job.tags.map { |tag|
73
+ "<span class='label label-info jobtag'>#{filter_link(tag, within)}</span>"
74
+ }.join(" ")
54
75
  end
55
76
 
56
77
  # This view helper provide ability display you html code in
@@ -111,13 +132,6 @@ module Sidekiq
111
132
  end
112
133
  end
113
134
 
114
- # within is used by Sidekiq Pro
115
- def display_tags(job, within = nil)
116
- job.tags.map { |tag|
117
- "<span class='label label-info jobtag'>#{::Rack::Utils.escape_html(tag)}</span>"
118
- }.join(" ")
119
- end
120
-
121
135
  # sidekiq/sidekiq#3243
122
136
  def unfiltered?
123
137
  yield unless env["PATH_INFO"].start_with?("/filter/")
data/web/locales/en.yml CHANGED
@@ -97,3 +97,5 @@ en:
97
97
  Context: Context
98
98
  Bucket: Bucket
99
99
  NoJobMetricsFound: No recent job metrics were found
100
+ Filter: Filter
101
+ AnyJobContent: Any job content
@@ -0,0 +1,7 @@
1
+ <div class="sm-col-3 pull-right" style="display: inline; margin: 25px 15px 0 0;">
2
+ <%= t('Filter') %>:
3
+ <form method="POST" action='<%= root_path %>filter/<%= which %>' style="display: inline-block">
4
+ <%= csrf_tag %>
5
+ <input class="search" type="search" name="substr" value="<%= h params[:substr] %>" placeholder="<%= t('AnyJobContent') %>"/>
6
+ </form>
7
+ </div>
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: 7.1.4
4
+ version: 7.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-12 00:00:00.000000000 Z
11
+ date: 2023-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client
@@ -187,6 +187,7 @@ files:
187
187
  - web/views/busy.erb
188
188
  - web/views/dashboard.erb
189
189
  - web/views/dead.erb
190
+ - web/views/filtering.erb
190
191
  - web/views/layout.erb
191
192
  - web/views/metrics.erb
192
193
  - web/views/metrics_for_job.erb