sidekiq 6.2.2 → 8.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.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +726 -11
  3. data/LICENSE.txt +9 -0
  4. data/README.md +70 -39
  5. data/bin/kiq +17 -0
  6. data/bin/lint-herb +13 -0
  7. data/bin/multi_queue_bench +271 -0
  8. data/bin/sidekiq +4 -9
  9. data/bin/sidekiqload +214 -115
  10. data/bin/sidekiqmon +4 -1
  11. data/bin/webload +69 -0
  12. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +124 -0
  13. data/lib/generators/sidekiq/job_generator.rb +71 -0
  14. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +3 -3
  15. data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
  16. data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
  17. data/lib/sidekiq/api.rb +729 -264
  18. data/lib/sidekiq/capsule.rb +135 -0
  19. data/lib/sidekiq/cli.rb +124 -100
  20. data/lib/sidekiq/client.rb +153 -106
  21. data/lib/sidekiq/component.rb +132 -0
  22. data/lib/sidekiq/config.rb +320 -0
  23. data/lib/sidekiq/deploy.rb +64 -0
  24. data/lib/sidekiq/embedded.rb +64 -0
  25. data/lib/sidekiq/fetch.rb +27 -26
  26. data/lib/sidekiq/iterable_job.rb +56 -0
  27. data/lib/sidekiq/job/interrupt_handler.rb +24 -0
  28. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  29. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  30. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  31. data/lib/sidekiq/job/iterable.rb +322 -0
  32. data/lib/sidekiq/job.rb +397 -5
  33. data/lib/sidekiq/job_logger.rb +23 -32
  34. data/lib/sidekiq/job_retry.rb +141 -68
  35. data/lib/sidekiq/job_util.rb +113 -0
  36. data/lib/sidekiq/launcher.rb +122 -98
  37. data/lib/sidekiq/loader.rb +57 -0
  38. data/lib/sidekiq/logger.rb +27 -106
  39. data/lib/sidekiq/manager.rb +41 -43
  40. data/lib/sidekiq/metrics/query.rb +184 -0
  41. data/lib/sidekiq/metrics/shared.rb +109 -0
  42. data/lib/sidekiq/metrics/tracking.rb +153 -0
  43. data/lib/sidekiq/middleware/chain.rb +96 -51
  44. data/lib/sidekiq/middleware/current_attributes.rb +120 -0
  45. data/lib/sidekiq/middleware/i18n.rb +8 -4
  46. data/lib/sidekiq/middleware/modules.rb +23 -0
  47. data/lib/sidekiq/monitor.rb +16 -6
  48. data/lib/sidekiq/paginator.rb +37 -10
  49. data/lib/sidekiq/processor.rb +105 -87
  50. data/lib/sidekiq/profiler.rb +73 -0
  51. data/lib/sidekiq/rails.rb +49 -36
  52. data/lib/sidekiq/redis_client_adapter.rb +117 -0
  53. data/lib/sidekiq/redis_connection.rb +55 -86
  54. data/lib/sidekiq/ring_buffer.rb +32 -0
  55. data/lib/sidekiq/scheduled.rb +106 -50
  56. data/lib/sidekiq/systemd.rb +2 -0
  57. data/lib/sidekiq/test_api.rb +331 -0
  58. data/lib/sidekiq/testing/inline.rb +2 -30
  59. data/lib/sidekiq/testing.rb +2 -342
  60. data/lib/sidekiq/transaction_aware_client.rb +59 -0
  61. data/lib/sidekiq/tui/controls.rb +53 -0
  62. data/lib/sidekiq/tui/filtering.rb +53 -0
  63. data/lib/sidekiq/tui/tabs/base_tab.rb +204 -0
  64. data/lib/sidekiq/tui/tabs/busy.rb +118 -0
  65. data/lib/sidekiq/tui/tabs/dead.rb +19 -0
  66. data/lib/sidekiq/tui/tabs/home.rb +144 -0
  67. data/lib/sidekiq/tui/tabs/metrics.rb +131 -0
  68. data/lib/sidekiq/tui/tabs/queues.rb +95 -0
  69. data/lib/sidekiq/tui/tabs/retries.rb +19 -0
  70. data/lib/sidekiq/tui/tabs/scheduled.rb +19 -0
  71. data/lib/sidekiq/tui/tabs/set_tab.rb +96 -0
  72. data/lib/sidekiq/tui/tabs.rb +15 -0
  73. data/lib/sidekiq/tui.rb +382 -0
  74. data/lib/sidekiq/version.rb +6 -1
  75. data/lib/sidekiq/web/action.rb +149 -64
  76. data/lib/sidekiq/web/application.rb +376 -268
  77. data/lib/sidekiq/web/config.rb +117 -0
  78. data/lib/sidekiq/web/helpers.rb +213 -87
  79. data/lib/sidekiq/web/router.rb +61 -74
  80. data/lib/sidekiq/web.rb +71 -100
  81. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  82. data/lib/sidekiq.rb +95 -196
  83. data/sidekiq.gemspec +14 -11
  84. data/web/assets/images/logo.png +0 -0
  85. data/web/assets/images/status.png +0 -0
  86. data/web/assets/javascripts/application.js +171 -57
  87. data/web/assets/javascripts/base-charts.js +120 -0
  88. data/web/assets/javascripts/chart.min.js +13 -0
  89. data/web/assets/javascripts/chartjs-adapter-date-fns.min.js +7 -0
  90. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  91. data/web/assets/javascripts/dashboard-charts.js +194 -0
  92. data/web/assets/javascripts/dashboard.js +41 -274
  93. data/web/assets/javascripts/metrics.js +280 -0
  94. data/web/assets/stylesheets/style.css +776 -0
  95. data/web/locales/ar.yml +72 -70
  96. data/web/locales/cs.yml +64 -62
  97. data/web/locales/da.yml +62 -53
  98. data/web/locales/de.yml +67 -65
  99. data/web/locales/el.yml +45 -24
  100. data/web/locales/en.yml +93 -69
  101. data/web/locales/es.yml +91 -68
  102. data/web/locales/fa.yml +67 -65
  103. data/web/locales/fr.yml +82 -67
  104. data/web/locales/gd.yml +110 -0
  105. data/web/locales/he.yml +67 -64
  106. data/web/locales/hi.yml +61 -59
  107. data/web/locales/it.yml +94 -54
  108. data/web/locales/ja.yml +74 -68
  109. data/web/locales/ko.yml +54 -52
  110. data/web/locales/lt.yml +68 -66
  111. data/web/locales/nb.yml +63 -61
  112. data/web/locales/nl.yml +54 -52
  113. data/web/locales/pl.yml +47 -45
  114. data/web/locales/{pt-br.yml → pt-BR.yml} +85 -56
  115. data/web/locales/pt.yml +53 -51
  116. data/web/locales/ru.yml +69 -66
  117. data/web/locales/sv.yml +55 -53
  118. data/web/locales/ta.yml +62 -60
  119. data/web/locales/tr.yml +102 -0
  120. data/web/locales/uk.yml +87 -61
  121. data/web/locales/ur.yml +66 -64
  122. data/web/locales/vi.yml +69 -67
  123. data/web/locales/zh-CN.yml +107 -0
  124. data/web/locales/{zh-tw.yml → zh-TW.yml} +44 -9
  125. data/web/views/_footer.html.erb +32 -0
  126. data/web/views/_job_info.html.erb +115 -0
  127. data/web/views/_metrics_period_select.html.erb +15 -0
  128. data/web/views/_nav.html.erb +45 -0
  129. data/web/views/_paging.html.erb +26 -0
  130. data/web/views/_poll_link.html.erb +4 -0
  131. data/web/views/_summary.html.erb +40 -0
  132. data/web/views/busy.html.erb +151 -0
  133. data/web/views/dashboard.html.erb +104 -0
  134. data/web/views/dead.html.erb +38 -0
  135. data/web/views/filtering.html.erb +6 -0
  136. data/web/views/layout.html.erb +26 -0
  137. data/web/views/metrics.html.erb +85 -0
  138. data/web/views/metrics_for_job.html.erb +58 -0
  139. data/web/views/morgue.html.erb +69 -0
  140. data/web/views/profiles.html.erb +43 -0
  141. data/web/views/queue.html.erb +57 -0
  142. data/web/views/queues.html.erb +46 -0
  143. data/web/views/retries.html.erb +77 -0
  144. data/web/views/retry.html.erb +39 -0
  145. data/web/views/scheduled.html.erb +64 -0
  146. data/web/views/{scheduled_job_info.erb → scheduled_job_info.html.erb} +3 -3
  147. metadata +130 -61
  148. data/LICENSE +0 -9
  149. data/lib/generators/sidekiq/worker_generator.rb +0 -57
  150. data/lib/sidekiq/delay.rb +0 -41
  151. data/lib/sidekiq/exception_handler.rb +0 -27
  152. data/lib/sidekiq/extensions/action_mailer.rb +0 -48
  153. data/lib/sidekiq/extensions/active_record.rb +0 -43
  154. data/lib/sidekiq/extensions/class_methods.rb +0 -43
  155. data/lib/sidekiq/extensions/generic_proxy.rb +0 -33
  156. data/lib/sidekiq/util.rb +0 -95
  157. data/lib/sidekiq/web/csrf_protection.rb +0 -180
  158. data/lib/sidekiq/worker.rb +0 -244
  159. data/web/assets/stylesheets/application-dark.css +0 -147
  160. data/web/assets/stylesheets/application-rtl.css +0 -246
  161. data/web/assets/stylesheets/application.css +0 -1053
  162. data/web/assets/stylesheets/bootstrap-rtl.min.css +0 -9
  163. data/web/assets/stylesheets/bootstrap.css +0 -5
  164. data/web/locales/zh-cn.yml +0 -68
  165. data/web/views/_footer.erb +0 -20
  166. data/web/views/_job_info.erb +0 -89
  167. data/web/views/_nav.erb +0 -52
  168. data/web/views/_paging.erb +0 -23
  169. data/web/views/_poll_link.erb +0 -7
  170. data/web/views/_status.erb +0 -4
  171. data/web/views/_summary.erb +0 -40
  172. data/web/views/busy.erb +0 -132
  173. data/web/views/dashboard.erb +0 -83
  174. data/web/views/dead.erb +0 -34
  175. data/web/views/layout.erb +0 -42
  176. data/web/views/morgue.erb +0 -78
  177. data/web/views/queue.erb +0 -55
  178. data/web/views/queues.erb +0 -38
  179. data/web/views/retries.erb +0 -83
  180. data/web/views/retry.erb +0 -34
  181. data/web/views/scheduled.erb +0 -57
data/lib/sidekiq.rb CHANGED
@@ -1,13 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
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")
4
+ fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 3.2.0." if RUBY_PLATFORM != "java" && Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.2.0")
5
5
 
6
+ begin
7
+ require "sidekiq-ent/version"
8
+ fail <<~EOM if Gem::Version.new(Sidekiq::Enterprise::VERSION).segments[0] != Sidekiq::MAJOR
9
+
10
+ Sidekiq Enterprise #{Sidekiq::Enterprise::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
11
+ Starting with Sidekiq 7, major versions are synchronized so Sidekiq Enterprise 7 works with Sidekiq 7.
12
+ Use `bundle up sidekiq-ent` to upgrade.
13
+
14
+ EOM
15
+ rescue LoadError
16
+ end
17
+
18
+ begin
19
+ require "sidekiq/pro/version"
20
+ fail <<~EOM if Gem::Version.new(Sidekiq::Pro::VERSION).segments[0] != Sidekiq::MAJOR
21
+
22
+ Sidekiq Pro #{Sidekiq::Pro::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
23
+ Starting with Sidekiq 7, major versions are synchronized so Sidekiq Pro 7 works with Sidekiq 7.
24
+ Use `bundle up sidekiq-pro` to upgrade.
25
+
26
+ EOM
27
+ rescue LoadError
28
+ end
29
+
30
+ require "sidekiq/config"
6
31
  require "sidekiq/logger"
32
+ require "sidekiq/loader"
7
33
  require "sidekiq/client"
8
- require "sidekiq/worker"
9
- require "sidekiq/redis_connection"
10
- require "sidekiq/delay"
34
+ require "sidekiq/transaction_aware_client"
35
+ require "sidekiq/job"
36
+ require "sidekiq/iterable_job"
37
+ require "sidekiq/worker_compatibility_alias"
38
+ require "sidekiq/redis_client_adapter"
11
39
 
12
40
  require "json"
13
41
 
@@ -15,247 +43,118 @@ module Sidekiq
15
43
  NAME = "Sidekiq"
16
44
  LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
17
45
 
18
- DEFAULTS = {
19
- queues: [],
20
- labels: [],
21
- concurrency: 10,
22
- require: ".",
23
- strict: true,
24
- environment: nil,
25
- timeout: 25,
26
- poll_interval_average: nil,
27
- average_scheduled_poll_interval: 5,
28
- error_handlers: [],
29
- death_handlers: [],
30
- lifecycle_events: {
31
- startup: [],
32
- quiet: [],
33
- shutdown: [],
34
- heartbeat: []
35
- },
36
- dead_max_jobs: 10_000,
37
- dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
38
- reloader: proc { |&block| block.call }
39
- }
40
-
41
- DEFAULT_WORKER_OPTIONS = {
42
- "retry" => true,
43
- "queue" => "default"
44
- }
45
-
46
- FAKE_INFO = {
47
- "redis_version" => "9.9.9",
48
- "uptime_in_days" => "9999",
49
- "connected_clients" => "9999",
50
- "used_memory_human" => "9P",
51
- "used_memory_peak_human" => "9P"
52
- }
53
-
54
46
  def self.❨╯°□°❩╯︵┻━┻
55
- puts "Calm down, yo."
56
- end
57
-
58
- def self.options
59
- @options ||= DEFAULTS.dup
60
- end
61
-
62
- def self.options=(opts)
63
- @options = opts
47
+ puts "Take a deep breath and count to ten..."
64
48
  end
65
49
 
66
- ##
67
- # Configuration for Sidekiq server, use like:
68
- #
69
- # Sidekiq.configure_server do |config|
70
- # config.redis = { :namespace => 'myapp', :size => 25, :url => 'redis://myhost:8877/0' }
71
- # config.server_middleware do |chain|
72
- # chain.add MyServerHook
73
- # end
74
- # end
75
- def self.configure_server
76
- yield self if server?
77
- end
50
+ def self.testing!(mode = :fake, &block)
51
+ raise "Unknown testing mode: #{mode}" unless %i[fake disable inline].include?(mode)
78
52
 
79
- ##
80
- # Configuration for Sidekiq client, use like:
81
- #
82
- # Sidekiq.configure_client do |config|
83
- # config.redis = { :namespace => 'myapp', :size => 1, :url => 'redis://myhost:8877/0' }
84
- # end
85
- def self.configure_client
86
- yield self unless server?
53
+ require "sidekiq/test_api"
54
+ Sidekiq::Testing.__set_test_mode(mode, &block)
87
55
  end
88
56
 
89
57
  def self.server?
90
58
  defined?(Sidekiq::CLI)
91
59
  end
92
60
 
93
- def self.redis
94
- raise ArgumentError, "requires a block" unless block_given?
95
- redis_pool.with do |conn|
96
- retryable = true
97
- begin
98
- yield conn
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
108
- raise
109
- end
110
- end
111
- end
112
-
113
- def self.redis_info
114
- redis do |conn|
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
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
126
- end
127
- end
128
-
129
- def self.redis_pool
130
- @redis ||= Sidekiq::RedisConnection.create
131
- end
132
-
133
- def self.redis=(hash)
134
- @redis = if hash.is_a?(ConnectionPool)
135
- hash
136
- else
137
- Sidekiq::RedisConnection.create(hash)
138
- end
139
- end
140
-
141
- def self.client_middleware
142
- @client_chain ||= Middleware::Chain.new
143
- yield @client_chain if block_given?
144
- @client_chain
61
+ def self.load_json(string)
62
+ JSON.parse(string)
145
63
  end
146
64
 
147
- def self.server_middleware
148
- @server_chain ||= default_server_middleware
149
- yield @server_chain if block_given?
150
- @server_chain
65
+ def self.dump_json(object)
66
+ JSON.generate(object)
151
67
  end
152
68
 
153
- def self.default_server_middleware
154
- Middleware::Chain.new
69
+ def self.pro?
70
+ defined?(Sidekiq::Pro)
155
71
  end
156
72
 
157
- def self.default_worker_options=(hash)
158
- # stringify
159
- @default_worker_options = default_worker_options.merge(hash.transform_keys(&:to_s))
73
+ def self.ent?
74
+ defined?(Sidekiq::Enterprise)
160
75
  end
161
76
 
162
- def self.default_worker_options
163
- defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
77
+ def self.redis_pool
78
+ (Thread.current[:sidekiq_capsule] || default_configuration).redis_pool
164
79
  end
165
80
 
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
- #
171
- # Sidekiq.configure_server do |config|
172
- # config.death_handlers << ->(job, ex) do
173
- # end
174
- # end
175
- def self.death_handlers
176
- options[:death_handlers]
81
+ def self.redis(&block)
82
+ (Thread.current[:sidekiq_capsule] || default_configuration).redis(&block)
177
83
  end
178
84
 
179
- def self.load_json(string)
180
- JSON.parse(string)
85
+ def self.strict_args!(mode = :raise)
86
+ Sidekiq::Config::DEFAULTS[:on_complex_arguments] = mode
181
87
  end
182
88
 
183
- def self.dump_json(object)
184
- JSON.generate(object)
89
+ def self.default_job_options=(hash)
90
+ @default_job_options = default_job_options.merge(hash.transform_keys(&:to_s))
185
91
  end
186
92
 
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
93
+ def self.default_job_options
94
+ @default_job_options ||= {"retry" => true, "queue" => "default"}
193
95
  end
194
96
 
195
- def self.log_formatter=(log_formatter)
196
- @log_formatter = log_formatter
197
- logger.formatter = log_formatter
97
+ def self.default_configuration
98
+ @config ||= Sidekiq::Config.new
198
99
  end
199
100
 
200
101
  def self.logger
201
- @logger ||= Sidekiq::Logger.new($stdout, level: Logger::INFO)
102
+ default_configuration.logger
202
103
  end
203
104
 
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
105
+ def self.loader
106
+ @loader ||= Loader.new
213
107
  end
214
108
 
215
- def self.pro?
216
- defined?(Sidekiq::Pro)
109
+ def self.configure_server(&block)
110
+ (@config_blocks ||= []) << block
111
+ yield default_configuration if server?
217
112
  end
218
113
 
219
- # How frequently Redis should be checked by a random Sidekiq process for
220
- # scheduled and retriable jobs. Each individual process will take turns by
221
- # waiting some multiple of this value.
222
- #
223
- # See sidekiq/scheduled.rb for an in-depth explanation of this value
224
- def self.average_scheduled_poll_interval=(interval)
225
- options[:average_scheduled_poll_interval] = interval
114
+ def self.freeze!
115
+ @frozen = true
116
+ @config_blocks = nil
117
+ default_configuration.freeze!
226
118
  end
227
119
 
228
- # Register a proc to handle any error which occurs within the Sidekiq process.
120
+ # Creates a Sidekiq::Config instance that is more tuned for embedding
121
+ # within an arbitrary Ruby process. Notably it reduces concurrency by
122
+ # default so there is less contention for CPU time with other threads.
229
123
  #
230
- # Sidekiq.configure_server do |config|
231
- # config.error_handlers << proc {|ex,ctx_hash| MyErrorService.notify(ex, ctx_hash) }
124
+ # instance = Sidekiq.configure_embed do |config|
125
+ # config.queues = %w[critical default low]
232
126
  # end
127
+ # instance.run
128
+ # sleep 10
129
+ # instance.stop
233
130
  #
234
- # The default error handler logs errors to Sidekiq.logger.
235
- def self.error_handlers
236
- options[:error_handlers]
131
+ # NB: it is really easy to overload a Ruby process with threads due to the GIL.
132
+ # I do not recommend setting concurrency higher than 2-3.
133
+ #
134
+ # NB: Sidekiq only supports one instance in memory. You will get undefined behavior
135
+ # if you try to embed Sidekiq twice in the same process.
136
+ def self.configure_embed(&block)
137
+ raise "Sidekiq global configuration is frozen, you must create all embedded instances BEFORE calling `run`" if @frozen
138
+
139
+ require "sidekiq/embedded"
140
+ cfg = default_configuration
141
+ cfg.concurrency = 2
142
+ @config_blocks&.each { |block| block.call(cfg) }
143
+ yield cfg
144
+
145
+ Sidekiq::Embedded.new(cfg)
237
146
  end
238
147
 
239
- # Register a block to run at a point in the Sidekiq lifecycle.
240
- # :startup, :quiet or :shutdown are valid events.
241
- #
242
- # Sidekiq.configure_server do |config|
243
- # config.on(:shutdown) do
244
- # puts "Goodbye cruel world!"
245
- # end
246
- # end
247
- def self.on(event, &block)
248
- raise ArgumentError, "Symbols only please: #{event}" unless event.is_a?(Symbol)
249
- raise ArgumentError, "Invalid event name: #{event}" unless options[:lifecycle_events].key?(event)
250
- options[:lifecycle_events][event] << block
148
+ def self.configure_client
149
+ yield default_configuration unless server?
251
150
  end
252
151
 
253
- # We are shutting down Sidekiq but what about workers that
152
+ # We are shutting down Sidekiq but what about threads that
254
153
  # are working on some long job? This error is
255
- # raised in workers that have not finished within the hard
154
+ # raised in jobs that have not finished within the hard
256
155
  # timeout limit. This is needed to rollback db transactions,
257
156
  # otherwise Ruby's Thread#kill will commit. See #377.
258
- # DO NOT RESCUE THIS ERROR IN YOUR WORKERS
157
+ # DO NOT RESCUE THIS ERROR IN YOUR JOBS
259
158
  class Shutdown < Interrupt; end
260
159
  end
261
160
 
data/sidekiq.gemspec CHANGED
@@ -2,27 +2,30 @@ require_relative "lib/sidekiq/version"
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.authors = ["Mike Perham"]
5
- gem.email = ["mperham@gmail.com"]
5
+ gem.email = ["info@contribsys.com"]
6
6
  gem.summary = "Simple, efficient background processing for Ruby"
7
7
  gem.description = "Simple, efficient background processing for Ruby."
8
8
  gem.homepage = "https://sidekiq.org"
9
9
  gem.license = "LGPL-3.0"
10
10
 
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")
11
+ gem.executables = ["sidekiq", "sidekiqmon", "kiq"]
12
+ gem.files = %w[sidekiq.gemspec README.md Changes.md LICENSE.txt] + `git ls-files | grep -E '^(bin|lib|web)'`.split("\n")
13
13
  gem.name = "sidekiq"
14
14
  gem.version = Sidekiq::VERSION
15
- gem.required_ruby_version = ">= 2.5.0"
15
+ gem.required_ruby_version = ">= 3.2.0"
16
16
 
17
17
  gem.metadata = {
18
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"
19
+ "bug_tracker_uri" => "https://github.com/sidekiq/sidekiq/issues",
20
+ "documentation_uri" => "https://github.com/sidekiq/sidekiq/wiki",
21
+ "changelog_uri" => "https://github.com/sidekiq/sidekiq/blob/main/Changes.md",
22
+ "source_code_uri" => "https://github.com/sidekiq/sidekiq",
23
+ "rubygems_mfa_required" => "true"
23
24
  }
24
25
 
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
+ gem.add_dependency "redis-client", ">= 0.29.0"
27
+ gem.add_dependency "connection_pool", ">= 3.0.0"
28
+ gem.add_dependency "rack", ">= 3.2.0"
29
+ gem.add_dependency "json", ">= 2.16.0"
30
+ gem.add_dependency "logger", ">= 1.7.0"
28
31
  end
File without changes
File without changes