sidekiq 3.4.1 → 7.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +1118 -4
  3. data/LICENSE.txt +9 -0
  4. data/README.md +55 -47
  5. data/bin/multi_queue_bench +271 -0
  6. data/bin/sidekiq +26 -3
  7. data/bin/sidekiqload +247 -0
  8. data/bin/sidekiqmon +11 -0
  9. data/lib/generators/sidekiq/job_generator.rb +57 -0
  10. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  11. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  12. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  13. data/lib/sidekiq/api.rb +714 -312
  14. data/lib/sidekiq/capsule.rb +130 -0
  15. data/lib/sidekiq/cli.rb +275 -241
  16. data/lib/sidekiq/client.rb +141 -110
  17. data/lib/sidekiq/component.rb +68 -0
  18. data/lib/sidekiq/config.rb +291 -0
  19. data/lib/sidekiq/deploy.rb +62 -0
  20. data/lib/sidekiq/embedded.rb +61 -0
  21. data/lib/sidekiq/fetch.rb +53 -121
  22. data/lib/sidekiq/iterable_job.rb +53 -0
  23. data/lib/sidekiq/job/interrupt_handler.rb +22 -0
  24. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  25. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  26. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  27. data/lib/sidekiq/job/iterable.rb +231 -0
  28. data/lib/sidekiq/job.rb +385 -0
  29. data/lib/sidekiq/job_logger.rb +64 -0
  30. data/lib/sidekiq/job_retry.rb +305 -0
  31. data/lib/sidekiq/job_util.rb +107 -0
  32. data/lib/sidekiq/launcher.rb +241 -66
  33. data/lib/sidekiq/logger.rb +131 -0
  34. data/lib/sidekiq/manager.rb +91 -192
  35. data/lib/sidekiq/metrics/query.rb +156 -0
  36. data/lib/sidekiq/metrics/shared.rb +95 -0
  37. data/lib/sidekiq/metrics/tracking.rb +140 -0
  38. data/lib/sidekiq/middleware/chain.rb +114 -56
  39. data/lib/sidekiq/middleware/current_attributes.rb +111 -0
  40. data/lib/sidekiq/middleware/i18n.rb +8 -7
  41. data/lib/sidekiq/middleware/modules.rb +21 -0
  42. data/lib/sidekiq/monitor.rb +146 -0
  43. data/lib/sidekiq/paginator.rb +29 -16
  44. data/lib/sidekiq/processor.rb +248 -112
  45. data/lib/sidekiq/rails.rb +61 -27
  46. data/lib/sidekiq/redis_client_adapter.rb +114 -0
  47. data/lib/sidekiq/redis_connection.rb +68 -48
  48. data/lib/sidekiq/ring_buffer.rb +29 -0
  49. data/lib/sidekiq/scheduled.rb +173 -52
  50. data/lib/sidekiq/sd_notify.rb +149 -0
  51. data/lib/sidekiq/systemd.rb +24 -0
  52. data/lib/sidekiq/testing/inline.rb +7 -5
  53. data/lib/sidekiq/testing.rb +206 -65
  54. data/lib/sidekiq/transaction_aware_client.rb +51 -0
  55. data/lib/sidekiq/version.rb +4 -1
  56. data/lib/sidekiq/web/action.rb +99 -0
  57. data/lib/sidekiq/web/application.rb +479 -0
  58. data/lib/sidekiq/web/csrf_protection.rb +183 -0
  59. data/lib/sidekiq/web/helpers.rb +415 -0
  60. data/lib/sidekiq/web/router.rb +104 -0
  61. data/lib/sidekiq/web.rb +158 -200
  62. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  63. data/lib/sidekiq.rb +100 -132
  64. data/sidekiq.gemspec +27 -23
  65. data/web/assets/images/apple-touch-icon.png +0 -0
  66. data/web/assets/images/favicon.ico +0 -0
  67. data/web/assets/javascripts/application.js +177 -72
  68. data/web/assets/javascripts/base-charts.js +106 -0
  69. data/web/assets/javascripts/chart.min.js +13 -0
  70. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  71. data/web/assets/javascripts/dashboard-charts.js +192 -0
  72. data/web/assets/javascripts/dashboard.js +37 -286
  73. data/web/assets/javascripts/metrics.js +298 -0
  74. data/web/assets/stylesheets/application-dark.css +147 -0
  75. data/web/assets/stylesheets/application-rtl.css +163 -0
  76. data/web/assets/stylesheets/application.css +228 -247
  77. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  78. data/web/assets/stylesheets/bootstrap.css +4 -8
  79. data/web/locales/ar.yml +87 -0
  80. data/web/locales/cs.yml +62 -52
  81. data/web/locales/da.yml +60 -53
  82. data/web/locales/de.yml +65 -53
  83. data/web/locales/el.yml +43 -24
  84. data/web/locales/en.yml +86 -61
  85. data/web/locales/es.yml +70 -53
  86. data/web/locales/fa.yml +80 -0
  87. data/web/locales/fr.yml +86 -56
  88. data/web/locales/gd.yml +99 -0
  89. data/web/locales/he.yml +80 -0
  90. data/web/locales/hi.yml +59 -59
  91. data/web/locales/it.yml +53 -53
  92. data/web/locales/ja.yml +78 -56
  93. data/web/locales/ko.yml +52 -52
  94. data/web/locales/lt.yml +83 -0
  95. data/web/locales/{no.yml → nb.yml} +62 -54
  96. data/web/locales/nl.yml +52 -52
  97. data/web/locales/pl.yml +45 -45
  98. data/web/locales/pt-br.yml +83 -55
  99. data/web/locales/pt.yml +51 -51
  100. data/web/locales/ru.yml +68 -60
  101. data/web/locales/sv.yml +53 -53
  102. data/web/locales/ta.yml +60 -60
  103. data/web/locales/tr.yml +101 -0
  104. data/web/locales/uk.yml +77 -0
  105. data/web/locales/ur.yml +80 -0
  106. data/web/locales/vi.yml +83 -0
  107. data/web/locales/zh-cn.yml +43 -16
  108. data/web/locales/zh-tw.yml +42 -8
  109. data/web/views/_footer.erb +22 -9
  110. data/web/views/_job_info.erb +27 -6
  111. data/web/views/_metrics_period_select.erb +12 -0
  112. data/web/views/_nav.erb +8 -22
  113. data/web/views/_paging.erb +3 -1
  114. data/web/views/_poll_link.erb +4 -0
  115. data/web/views/_summary.erb +7 -7
  116. data/web/views/busy.erb +91 -31
  117. data/web/views/dashboard.erb +52 -22
  118. data/web/views/dead.erb +5 -4
  119. data/web/views/filtering.erb +7 -0
  120. data/web/views/layout.erb +19 -7
  121. data/web/views/metrics.erb +91 -0
  122. data/web/views/metrics_for_job.erb +59 -0
  123. data/web/views/morgue.erb +26 -20
  124. data/web/views/queue.erb +36 -25
  125. data/web/views/queues.erb +24 -7
  126. data/web/views/retries.erb +29 -21
  127. data/web/views/retry.erb +6 -5
  128. data/web/views/scheduled.erb +20 -17
  129. data/web/views/scheduled_job_info.erb +2 -1
  130. metadata +101 -232
  131. data/.gitignore +0 -12
  132. data/.travis.yml +0 -16
  133. data/3.0-Upgrade.md +0 -70
  134. data/COMM-LICENSE +0 -85
  135. data/Contributing.md +0 -32
  136. data/Gemfile +0 -22
  137. data/LICENSE +0 -9
  138. data/Pro-2.0-Upgrade.md +0 -138
  139. data/Pro-Changes.md +0 -412
  140. data/Rakefile +0 -9
  141. data/bin/sidekiqctl +0 -93
  142. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  143. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  144. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  145. data/lib/sidekiq/actor.rb +0 -39
  146. data/lib/sidekiq/core_ext.rb +0 -105
  147. data/lib/sidekiq/exception_handler.rb +0 -30
  148. data/lib/sidekiq/extensions/action_mailer.rb +0 -56
  149. data/lib/sidekiq/extensions/active_record.rb +0 -39
  150. data/lib/sidekiq/extensions/class_methods.rb +0 -39
  151. data/lib/sidekiq/extensions/generic_proxy.rb +0 -24
  152. data/lib/sidekiq/logging.rb +0 -104
  153. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  154. data/lib/sidekiq/middleware/server/logging.rb +0 -35
  155. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
  156. data/lib/sidekiq/util.rb +0 -55
  157. data/lib/sidekiq/web_helpers.rb +0 -234
  158. data/lib/sidekiq/worker.rb +0 -89
  159. data/test/config.yml +0 -9
  160. data/test/env_based_config.yml +0 -11
  161. data/test/fake_env.rb +0 -0
  162. data/test/fixtures/en.yml +0 -2
  163. data/test/helper.rb +0 -39
  164. data/test/test_api.rb +0 -494
  165. data/test/test_cli.rb +0 -365
  166. data/test/test_client.rb +0 -269
  167. data/test/test_exception_handler.rb +0 -55
  168. data/test/test_extensions.rb +0 -120
  169. data/test/test_fetch.rb +0 -104
  170. data/test/test_logging.rb +0 -34
  171. data/test/test_manager.rb +0 -164
  172. data/test/test_middleware.rb +0 -159
  173. data/test/test_processor.rb +0 -166
  174. data/test/test_redis_connection.rb +0 -127
  175. data/test/test_retry.rb +0 -373
  176. data/test/test_scheduled.rb +0 -120
  177. data/test/test_scheduling.rb +0 -71
  178. data/test/test_sidekiq.rb +0 -69
  179. data/test/test_testing.rb +0 -82
  180. data/test/test_testing_fake.rb +0 -271
  181. data/test/test_testing_inline.rb +0 -93
  182. data/test/test_web.rb +0 -594
  183. data/test/test_web_helpers.rb +0 -52
  184. data/test/test_worker_generator.rb +0 -17
  185. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  186. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  187. data/web/assets/images/status/active.png +0 -0
  188. data/web/assets/images/status/idle.png +0 -0
  189. data/web/assets/javascripts/locales/README.md +0 -27
  190. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  191. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  192. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  193. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  194. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  195. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  196. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  197. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  198. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  199. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  200. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  201. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  202. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  203. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  204. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  205. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  206. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  207. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  208. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  209. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  210. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  211. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  212. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  213. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  214. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  215. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  216. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  217. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  218. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  219. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  220. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  221. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  222. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  223. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  224. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  225. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  226. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  227. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  228. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  229. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  230. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  231. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  232. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  233. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  234. data/web/views/_poll.erb +0 -10
  235. /data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
data/Changes.md CHANGED
@@ -1,3 +1,1117 @@
1
+ # Sidekiq Changes
2
+
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
+
5
+ 7.3.0
6
+ ----------
7
+
8
+ - **NEW FEATURE** Add `Sidekiq::IterableJob`, iteration support for long-running jobs. [#6286, fatkodima]
9
+ Iterable jobs are interruptible and can restart quickly if
10
+ running during a deploy. You must ensure that `each_iteration`
11
+ doesn't take more than Sidekiq's `-t` timeout (default: 25 seconds). Iterable jobs must not implement `perform`.
12
+ ```ruby
13
+ class ProcessArrayJob
14
+ include Sidekiq::IterableJob
15
+ def build_enumerator(*args, **kwargs)
16
+ array_enumerator(args, **kwargs)
17
+ end
18
+ def each_iteration(arg)
19
+ puts arg
20
+ end
21
+ end
22
+ ProcessArrayJob.perform_async(1, 2, 3)
23
+ ```
24
+ See the [Iteration](//github.com/sidekiq/sidekiq/wiki/Iteration) wiki page and the RDoc in `Sidekiq::IterableJob`.
25
+ This feature should be considered BETA until the next minor release.
26
+ - **SECURITY** The Web UI no longer allows extensions to use `<script>`.
27
+ Adjust CSP to disallow inline scripts within the Web UI. Please see
28
+ `examples/webui-ext` for how to register Web UI extensions and use
29
+ dynamic CSS and JS. This will make Sidekiq immune to XSS attacks. [#6270]
30
+ - Add config option, `:skip_default_job_logging` to disable Sidekiq's default
31
+ start/finish job logging. [#6200]
32
+ - Allow `Sidekiq::Limiter.redis` to use Redis Cluster [#6288]
33
+ - Retain CurrentAttributeѕ after inline execution [#6307]
34
+ - Ignore non-existent CurrentAttributes attributes when restoring [#6341]
35
+ - Raise default Redis {read,write,connect} timeouts from 1 to 3 seconds
36
+ to minimize ReadTimeoutErrors [#6162]
37
+ - Add `logger` as a dependency since it will become bundled in Ruby 3.5 [#6320]
38
+ - Ignore unsupported locales in the Web UI [#6313]
39
+
40
+ 7.2.4
41
+ ----------
42
+
43
+ - Fix XSS in metrics filtering introduced in 7.2.0, CVE-2024-32887
44
+ Thanks to @UmerAdeemCheema for the security report.
45
+
46
+ 7.2.3
47
+ ----------
48
+
49
+ - [Support Dragonfly.io](https://www.mikeperham.com/2024/02/01/supporting-dragonfly/) as an alternative Redis implementation
50
+ - Fix error unpacking some compressed error backtraces [#6241]
51
+ - Fix potential heartbeat data leak [#6227]
52
+ - Add ability to find a currently running work by jid [#6212, fatkodima]
53
+
54
+ 7.2.2
55
+ ----------
56
+
57
+ - Add `Process.warmup` call in Ruby 3.3+
58
+ - Batch jobs now skip transactional push [#6160]
59
+
60
+ 7.2.1
61
+ ----------
62
+
63
+ - Add `Sidekiq::Work` type which replaces the raw Hash as the third parameter in
64
+ `Sidekiq::WorkSet#each { |pid, tid, hash| ... }` [#6145]
65
+ - **DEPRECATED**: direct access to the attributes within the `hash` block parameter above.
66
+ The `Sidekiq::Work` instance contains accessor methods to get at the same data, e.g.
67
+ ```ruby
68
+ work["queue"] # Old
69
+ work.queue # New
70
+ ```
71
+ - Fix Ruby 3.3 warnings around `base64` gem [#6151, earlopain]
72
+
73
+ 7.2.0
74
+ ----------
75
+
76
+ - `sidekiq_retries_exhausted` can return `:discard` to avoid the deadset
77
+ and all death handlers [#6091]
78
+ - Metrics filtering by job class in Web UI [#5974]
79
+ - Better readability and formatting for numbers within the Web UI [#6080]
80
+ - Add explicit error if user code tries to nest test modes [#6078]
81
+ ```ruby
82
+ Sidekiq::Testing.inline! # global setting
83
+ Sidekiq::Testing.fake! do # override within block
84
+ # ok
85
+ Sidekiq::Testing.inline! do # can't override the override
86
+ # not ok, nested
87
+ end
88
+ end
89
+ ```
90
+ - **SECURITY** Forbid inline JavaScript execution in Web UI [#6074]
91
+ - Adjust redis-client adapter to avoid `method_missing` [#6083]
92
+ This can result in app code breaking if your app's Redis API usage was
93
+ depending on Sidekiq's adapter to correct invalid redis-client API usage.
94
+ One example:
95
+ ```ruby
96
+ # bad, not redis-client native
97
+ # Unsupported command argument type: TrueClass (TypeError)
98
+ Sidekiq.redis { |c| c.set("key", "value", nx: true, ex: 15) }
99
+ # good
100
+ Sidekiq.redis { |c| c.set("key", "value", "nx", "ex", 15) }
101
+ ```
102
+
103
+ 7.1.6
104
+ ----------
105
+
106
+ - The block forms of testing modes (inline, fake) are now thread-safe so you can have
107
+ a multithreaded test suite which uses different modes for different tests. [#6069]
108
+ - Fix breakage with non-Proc error handlers [#6065]
109
+
110
+ 7.1.5
111
+ ----------
112
+
113
+ - **FEATURE**: Job filtering within the Web UI. This feature has been open
114
+ sourced from Sidekiq Pro. [#6052]
115
+ - **API CHANGE** Error handlers now take three arguments `->(ex, context, config)`.
116
+ The previous calling convention will work until Sidekiq 8.0 but will print
117
+ out a deprecation warning. [#6051]
118
+ - Fix issue with the `batch_size` and `at` options in `S::Client.push_bulk` [#6040]
119
+ - Fix inline testing firing batch callbacks early [#6057]
120
+ - Use new log broadcast API in Rails 7.1 [#6054]
121
+ - Crash if user tries to use RESP2 `protocol: 2` [#6061]
122
+
123
+ 7.1.4
124
+ ----------
125
+
126
+ - Fix empty `retry_for` logic [#6035]
127
+
128
+ 7.1.3
129
+ ----------
130
+
131
+ - Add `sidekiq_options retry_for: 48.hours` to allow time-based retry windows [#6029]
132
+ - Support sidekiq_retry_in and sidekiq_retries_exhausted_block in ActiveJobs (#5994)
133
+ - Lowercase all Rack headers for Rack 3.0 [#5951]
134
+ - Validate Sidekiq::Web page refresh delay to avoid potential DoS,
135
+ CVE-2023-26141, thanks for reporting Keegan!
136
+
137
+ 7.1.2
138
+ ----------
139
+
140
+ - Mark Web UI assets as private so CDNs won't cache them [#5936]
141
+ - Fix stackoverflow when using Oj and the JSON log formatter [#5920]
142
+ - Remove spurious `enqueued_at` from scheduled ActiveJobs [#5937]
143
+
144
+ 7.1.1
145
+ ----------
146
+
147
+ - Support multiple CurrentAttributes [#5904]
148
+ - Speed up latency fetch with large queues on Redis <7 [#5910]
149
+ - Allow a larger default client pool [#5886]
150
+ - Ensure Sidekiq.options[:environment] == RAILS_ENV [#5932]
151
+
152
+ 7.1.0
153
+ ----------
154
+
155
+ - Improve display of ActiveJob arguments in Web UI [#5825, cover]
156
+ - Update `push_bulk` to push `batch_size` jobs at a time and allow laziness [#5827, fatkodima]
157
+ This allows Sidekiq::Client to push unlimited jobs as long as it has enough memory for the batch_size.
158
+ - Update `perform_bulk` to use `push_bulk` internally.
159
+ - Change return value of `push_bulk` to map 1-to-1 with arguments.
160
+ If you call `push_bulk(args: [[1], [2], [3]])`, you will now always get
161
+ an array of 3 values as the result: `["jid1", nil, "jid3"]` where nil means
162
+ that particular job did not push successfully (possibly due to middleware
163
+ stopping it). Previously nil values were removed so it was impossible to tell
164
+ which jobs pushed successfully and which did not.
165
+ - Migrate away from all deprecated Redis commands [#5788]
166
+ Sidekiq will now print a warning if you use one of those deprecated commands.
167
+ - Prefix all Sidekiq thread names [#5872]
168
+
169
+ 7.0.9
170
+ ----------
171
+
172
+ - Restore confirmation dialogs in Web UI [#5881, shevaun]
173
+ - Increase fetch timeout to minimize ReadTimeoutError [#5874]
174
+ - Reverse histogram tooltip ordering [#5868]
175
+ - Add Scottish Gaelic (gd) locale [#5867, GunChleoc]
176
+
177
+ 7.0.8
178
+ ----------
179
+
180
+ - **SECURITY** Sanitize `period` input parameter on Metrics pages.
181
+ Specially crafted values can lead to XSS. This functionality
182
+ was introduced in 7.0.4. Thank you to spercex @ huntr.dev [#5694]
183
+ - Add job hash as 3rd parameter to the `sidekiq_retry_in` block.
184
+
185
+ 7.0.7
186
+ ----------
187
+
188
+ - Fix redis-client API usage which could result in stuck Redis
189
+ connections [#5823]
190
+ - Fix AS::Duration with `sidekiq_retry_in` [#5806]
191
+ - Restore dumping config options on startup with `-v` [#5822]
192
+
193
+ 7.0.5,7.0.6
194
+ ----------
195
+
196
+ - More context for debugging json unsafe errors [#5787]
197
+
198
+ 7.0.4
199
+ ----------
200
+
201
+ - Performance and memory optimizations [#5768, fatkodima]
202
+ - Add 1-8 hour period selector to Metrics pages [#5694]
203
+ - Fix process display with `sidekiqmon` [#5733]
204
+
205
+ 7.0.3
206
+ ----------
207
+
208
+ - Don't warn about memory policy on Redis Enterprise [#5712]
209
+ - Don't allow Quiet/Stop on embedded Sidekiq instances [#5716]
210
+ - Fix `size: X` for configuring the default Redis pool size [#5702]
211
+ - Improve the display of queue weights on Busy page [#5642]
212
+ - Freeze CurrentAttributes on a job once initially set [#5692]
213
+
214
+ 7.0.2
215
+ ----------
216
+
217
+ - Improve compatibility with custom loggers [#5673]
218
+ - Add queue weights on Busy page [#5640]
219
+ - Add BID link on job_info page if job is part of a Batch [#5623]
220
+ - Allow custom extensions to add rows/links within Job detail pages [#5624]
221
+ ```ruby
222
+ Sidekiq::Web.custom_job_info_rows << AddAccountLink.new
223
+
224
+ class AddAccountLink
225
+ include CGI::Util
226
+ def add_pair(job)
227
+ # yield a (name, value) pair
228
+ # You can include HTML tags and CSS, Sidekiq does not do any
229
+ # escaping so beware user data injection! Note how we use CGI's
230
+ # `h` escape helper.
231
+ aid = job["account_id"]
232
+ yield "Account", "<a href='/accounts/#{h aid}'>#{h aid}</a>" if aid
233
+ end
234
+ end
235
+ ```
236
+
237
+ 7.0.1
238
+ ----------
239
+
240
+ - Allow an embedding process to reuse its own heartbeat thread
241
+ - Update zh-cn localization
242
+
243
+ 7.0.0
244
+ ----------
245
+
246
+ - Embedded mode!
247
+ - Capsules!!
248
+ - Job Execution metrics!!!
249
+ - See `docs/7.0-Upgrade.md` for release notes
250
+
251
+ 6.5.{10,11,12}
252
+ ----------
253
+
254
+ - Fixes for Rails 7.1 [#6067, #6070]
255
+
256
+ 6.5.9
257
+ ----------
258
+
259
+ - Ensure Sidekiq.options[:environment] == RAILS_ENV [#5932]
260
+
261
+ 6.5.8
262
+ ----------
263
+
264
+ - Fail if using a bad version of scout_apm [#5616]
265
+ - Add pagination to Busy page [#5556]
266
+ - Speed up WorkSet#each [#5559]
267
+ - Adjust CurrentAttributes to work with the String class name so we aren't referencing the Class within a Rails initializer [#5536]
268
+
269
+ 6.5.7
270
+ ----------
271
+
272
+ - Updates for JA and ZH locales
273
+ - Further optimizations for scheduled polling [#5513]
274
+
275
+ 6.5.6
276
+ ----------
277
+
278
+ - Fix deprecation warnings with redis-rb 4.8.0 [#5484]
279
+ - Lock redis-rb to < 5.0 as we are moving to redis-client in Sidekiq 7.0
280
+
281
+ 6.5.5
282
+ ----------
283
+
284
+ - Fix require issue with job_retry.rb [#5462]
285
+ - Improve Sidekiq::Web compatibility with Rack 3.x
286
+
287
+ 6.5.4
288
+ ----------
289
+
290
+ - Fix invalid code on Ruby 2.5 [#5460]
291
+ - Fix further metrics dependency issues [#5457]
292
+
293
+ 6.5.3
294
+ ----------
295
+
296
+ - Don't require metrics code without explicit opt-in [#5456]
297
+
298
+ 6.5.2
299
+ ----------
300
+
301
+ - [Job Metrics are under active development, help wanted!](https://github.com/sidekiq/sidekiq/wiki/Metrics#contributing) **BETA**
302
+ - Add `Context` column on queue page which shows any CurrentAttributes [#5450]
303
+ - `sidekiq_retry_in` may now return `:discard` or `:kill` to dynamically stop job retries [#5406]
304
+ - Smarter sorting of processes in /busy Web UI [#5398]
305
+ - Fix broken hamburger menu in mobile UI [#5428]
306
+ - Require redis-rb 4.5.0. Note that Sidekiq will break if you use the
307
+ [`Redis.exists_returns_integer = false`](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md#450) flag. [#5394]
308
+
309
+ 6.5.1
310
+ ----------
311
+
312
+ - Fix `push_bulk` breakage [#5387]
313
+
314
+ 6.5.0
315
+ ---------
316
+
317
+ - Substantial refactoring of Sidekiq server internals, part of a larger effort
318
+ to reduce Sidekiq's internal usage of global methods and data, see [docs/global_to_local.md](docs/global_to_local.md) and [docs/middleware.md](docs/middleware.md).
319
+ - **Add beta support for the `redis-client` gem**. This will become the default Redis driver in Sidekiq 7.0. [#5298]
320
+ Read more: https://github.com/sidekiq/sidekiq/wiki/Using-redis-client
321
+ - **Add beta support for DB transaction-aware client** [#5291]
322
+ Add this line to your initializer and any jobs created during a transaction
323
+ will only be pushed to Redis **after the transaction commits**. You will need to add the
324
+ `after_commit_everywhere` gem to your Gemfile.
325
+ ```ruby
326
+ Sidekiq.transactional_push!
327
+ ```
328
+ This feature does not have a lot of production usage yet; please try it out and let us
329
+ know if you have any issues. It will be fully supported in Sidekiq 7.0 or removed if it
330
+ proves problematic.
331
+ - Fix regression with middleware arguments [#5312]
332
+
333
+ 6.4.2
334
+ ---------
335
+
336
+ - Strict argument checking now runs after client-side middleware [#5246]
337
+ - Fix page events with live polling [#5184]
338
+ - Many under-the-hood changes to remove all usage of the term "worker"
339
+ from the Sidekiq codebase and APIs. This mostly involved RDoc and local
340
+ variable names but a few constants and public APIs were changed. The old
341
+ APIs will be removed in Sidekiq 7.0.
342
+ ```
343
+ Sidekiq::DEFAULT_WORKER_OPTIONS -> Sidekiq.default_job_options
344
+ Sidekiq.default_worker_options -> Sidekiq.default_job_options
345
+ Sidekiq::Queues["default"].jobs_by_worker(HardJob) -> Sidekiq::Queues["default"].jobs_by_class(HardJob)
346
+ ```
347
+
348
+ 6.4.1
349
+ ---------
350
+
351
+ - Fix pipeline/multi deprecations in redis-rb 4.6
352
+ - Fix sidekiq.yml YAML load errors on Ruby 3.1 [#5141]
353
+ - Sharding support for `perform_bulk` [#5129]
354
+ - Refactor job logger for SPEEEEEEED
355
+
356
+ 6.4.0
357
+ ---------
358
+
359
+ - **SECURITY**: Validate input to avoid possible DoS in Web UI.
360
+ - Add **strict argument checking** [#5071]
361
+ Sidekiq will now log a warning if JSON-unsafe arguments are passed to `perform_async`.
362
+ Add `Sidekiq.strict_args!(false)` to your initializer to disable this warning.
363
+ This warning will switch to an exception in Sidekiq 7.0.
364
+ - Note that Delayed Extensions will be removed in Sidekiq 7.0 [#5076]
365
+ - Add `perform_{inline,sync}` in Sidekiq::Job to run a job synchronously [#5061, hasan-ally]
366
+ ```ruby
367
+ SomeJob.perform_async(args...)
368
+ SomeJob.perform_sync(args...)
369
+ SomeJob.perform_inline(args...)
370
+ ```
371
+ You can also dynamically redirect a job to run synchronously:
372
+ ```ruby
373
+ SomeJob.set("sync": true).perform_async(args...) # will run via perform_inline
374
+ ```
375
+ - Replace Sidekiq::Worker `app/workers` generator with Sidekiq::Job `app/sidekiq` generator [#5055]
376
+ ```
377
+ bin/rails generate sidekiq:job ProcessOrderJob
378
+ ```
379
+ - Fix job retries losing CurrentAttributes [#5090]
380
+ - Tweak shutdown to give long-running threads time to cleanup [#5095]
381
+
382
+ 6.3.1
383
+ ---------
384
+
385
+ - Fix keyword arguments error with CurrentAttributes on Ruby 3.0 [#5048]
386
+
387
+ 6.3.0
388
+ ---------
389
+
390
+ - **BREAK**: The Web UI has been refactored to remove jQuery. Any UI extensions
391
+ which use jQuery will break.
392
+ - **FEATURE**: Sidekiq.logger has been enhanced so any `Rails.logger`
393
+ output in jobs now shows up in the Sidekiq console. Remove any logger
394
+ hacks in your initializer and see if it Just Works™ now. [#5021]
395
+ - **FEATURE**: Add `Sidekiq::Job` alias for `Sidekiq::Worker`, to better
396
+ reflect industry standard terminology. You can now do this:
397
+ ```ruby
398
+ class MyJob
399
+ include Sidekiq::Job
400
+ sidekiq_options ...
401
+ def perform(args)
402
+ end
403
+ end
404
+ ```
405
+ - **FEATURE**: Support for serializing ActiveSupport::CurrentAttributes into each job. [#4982]
406
+ ```ruby
407
+ # config/initializers/sidekiq.rb
408
+ require "sidekiq/middleware/current_attributes"
409
+ Sidekiq::CurrentAttributes.persist(Myapp::Current) # Your AS::CurrentAttributes singleton
410
+ ```
411
+ - **FEATURE**: Add `Sidekiq::Worker.perform_bulk` for enqueuing jobs in bulk,
412
+ similar to `Sidekiq::Client.push_bulk` [#5042]
413
+ ```ruby
414
+ MyJob.perform_bulk([[1], [2], [3]])
415
+ ```
416
+ - Implement `queue_as`, `wait` and `wait_until` for ActiveJob compatibility [#5003]
417
+ - Scheduler now uses Lua to reduce Redis load and network roundtrips [#5044]
418
+ - Retry Redis operation if we get an `UNBLOCKED` Redis error [#4985]
419
+ - Run existing signal traps, if any, before running Sidekiq's trap [#4991]
420
+ - Fix fetch bug when using weighted queues which caused Sidekiq to stop
421
+ processing queues randomly [#5031]
422
+
423
+ 6.2.2
424
+ ---------
425
+
426
+ - Reduce retry jitter, add jitter to `sidekiq_retry_in` values [#4957]
427
+ - Minimize scheduler load on Redis at scale [#4882]
428
+ - Improve logging of delay jobs [#4904, BuonOno]
429
+ - Minor CSS improvements for buttons and tables, design PRs always welcome!
430
+ - Tweak Web UI `Cache-Control` header [#4966]
431
+ - Rename internal API class `Sidekiq::Job` to `Sidekiq::JobRecord` [#4955]
432
+
433
+ 6.2.1
434
+ ---------
435
+
436
+ - Update RTT warning logic to handle transient RTT spikes [#4851]
437
+ - Fix very low priority CVE on unescaped queue name [#4852]
438
+ - Add note about sessions and Rails apps in API mode
439
+
440
+ 6.2.0
441
+ ---------
442
+
443
+ - Store Redis RTT and log if poor [#4824]
444
+ - Add process/thread stats to Busy page [#4806]
445
+ - Improve Web UI on mobile devices [#4840]
446
+ - **Refactor Web UI session usage** [#4804]
447
+ Numerous people have hit "Forbidden" errors and struggled with Sidekiq's
448
+ Web UI session requirement. If you have code in your initializer for
449
+ Web sessions, it's quite possible it will need to be removed. Here's
450
+ an overview:
451
+ ```
452
+ Sidekiq::Web needs a valid Rack session for CSRF protection. If this is a Rails app,
453
+ make sure you mount Sidekiq::Web *inside* your routes in `config/routes.rb` so
454
+ Sidekiq can reuse the Rails session:
455
+
456
+ Rails.application.routes.draw do
457
+ mount Sidekiq::Web => "/sidekiq"
458
+ ....
459
+ end
460
+
461
+ If this is a bare Rack app, use a session middleware before Sidekiq::Web:
462
+
463
+ # first, use IRB to create a shared secret key for sessions and commit it
464
+ require 'securerandom'; File.open(".session.key", "w") {|f| f.write(SecureRandom.hex(32)) }
465
+
466
+ # now, update your Rack app to include the secret with a session cookie middleware
467
+ use Rack::Session::Cookie, secret: File.read(".session.key"), same_site: true, max_age: 86400
468
+ run Sidekiq::Web
469
+
470
+ If this is a Rails app in API mode, you need to enable sessions.
471
+
472
+ https://guides.rubyonrails.org/api_app.html#using-session-middlewares
473
+ ```
474
+
475
+ 6.1.3
476
+ ---------
477
+
478
+ - Warn if Redis is configured to evict data under memory pressure [#4752]
479
+ - Add process RSS on the Busy page [#4717]
480
+
481
+ 6.1.2
482
+ ---------
483
+
484
+ - Improve readability in dark mode Web UI [#4674]
485
+ - Fix Web UI crash with corrupt session [#4672]
486
+ - Allow middleware to yield arguments [#4673, @eugeneius]
487
+ - Migrate CI from CircleCI to GitHub Actions [#4677]
488
+
489
+ 6.1.1
490
+ ---------
491
+
492
+ - Jobs are now sorted by age in the Busy Workers table. [#4641]
493
+ - Fix "check all" JS logic in Web UI [#4619]
494
+
495
+ 6.1.0
496
+ ---------
497
+
498
+ - Web UI - Dark Mode fixes [#4543, natematykiewicz]
499
+ - Ensure `Rack::ContentLength` is loaded as middleware for correct Web UI responses [#4541]
500
+ - Avoid exception dumping SSL store in Redis connection logging [#4532]
501
+ - Better error messages in Sidekiq::Client [#4549]
502
+ - Remove rack-protection, reimplement CSRF protection [#4588]
503
+ - Require redis-rb 4.2 [#4591]
504
+ - Update to jquery 1.12.4 [#4593]
505
+ - Refactor internal fetch logic and API [#4602]
506
+
507
+ 6.0.7
508
+ ---------
509
+
510
+ - Refactor systemd integration to work better with custom binaries [#4511]
511
+ - Don't connect to Redis at process exit if not needed [#4502]
512
+ - Remove Redis connection naming [#4479]
513
+ - Fix Redis Sentinel password redaction [#4499]
514
+ - Add Vietnamese locale (vi) [#4528]
515
+
516
+ 6.0.6
517
+ ---------
518
+
519
+ - **Integrate with systemd's watchdog and notification features** [#4488]
520
+ Set `Type=notify` in [sidekiq.service](https://github.com/sidekiq/sidekiq/blob/4b8a8bd3ae42f6e48ae1fdaf95ed7d7af18ed8bb/examples/systemd/sidekiq.service#L30-L39). The integration works automatically.
521
+ - Use `setTimeout` rather than `setInterval` to avoid thundering herd [#4480]
522
+ - Fix edge case where a job can be pushed without a queue.
523
+ - Flush job stats at exit [#4498]
524
+ - Check RAILS_ENV before RACK_ENV [#4493]
525
+ - Add Lithuanian locale [#4476]
526
+
527
+ 6.0.5
528
+ ---------
529
+
530
+ - Fix broken Web UI response when using NewRelic and Rack 2.1.2+. [#4440]
531
+ - Update APIs to use `UNLINK`, not `DEL`. [#4449]
532
+ - Fix Ruby 2.7 warnings [#4412]
533
+ - Add support for `APP_ENV` [[95fa5d9]](https://github.com/sidekiq/sidekiq/commit/95fa5d90192148026e52ca2902f1b83c70858ce8)
534
+
535
+ 6.0.4
536
+ ---------
537
+
538
+ - Fix ActiveJob's `sidekiq_options` integration [#4404]
539
+ - Sidekiq Pro users will now see a Pause button next to each queue in
540
+ the Web UI, allowing them to pause queues manually [#4374, shayonj]
541
+ - Fix Sidekiq::Workers API unintentional change in 6.0.2 [#4387]
542
+
543
+
544
+ 6.0.3
545
+ ---------
546
+
547
+ - Fix `Sidekiq::Client.push_bulk` API which was erroneously putting
548
+ invalid `at` values in the job payloads [#4321]
549
+
550
+ 6.0.2
551
+ ---------
552
+
553
+ - Fix Sidekiq Enterprise's rolling restart functionality, broken by refactoring in 6.0.0. [#4334]
554
+ - More internal refactoring and performance tuning [fatkodima]
555
+
556
+ 6.0.1
557
+ ---------
558
+
559
+ - **Performance tuning**, Sidekiq should be 10-15% faster now [#4303, 4299,
560
+ 4269, fatkodima]
561
+ - **Dark Mode support in Web UI** (further design polish welcome!) [#4227, mperham,
562
+ fatkodima, silent-e]
563
+ - **Job-specific log levels**, allowing you to turn on debugging for
564
+ problematic workers. [fatkodima, #4287]
565
+ ```ruby
566
+ MyWorker.set(log_level: :debug).perform_async(...)
567
+ ```
568
+ - **Ad-hoc job tags**. You can tag your jobs with, e.g, subdomain, tenant, country,
569
+ locale, application, version, user/client, "alpha/beta/pro/ent", types of jobs,
570
+ teams/people responsible for jobs, additional metadata, etc.
571
+ Tags are shown on different pages with job listings. Sidekiq Pro users
572
+ can filter based on them [fatkodima, #4280]
573
+ ```ruby
574
+ class MyWorker
575
+ include Sidekiq::Worker
576
+ sidekiq_options tags: ['bank-ops', 'alpha']
577
+ ...
578
+ end
579
+ ```
580
+ - Fetch scheduled jobs in batches before pushing into specific queues.
581
+ This will decrease enqueueing time of scheduled jobs by a third. [fatkodima, #4273]
582
+ ```
583
+ ScheduledSet with 10,000 jobs
584
+ Before: 56.6 seconds
585
+ After: 39.2 seconds
586
+ ```
587
+ - Compress error backtraces before pushing into Redis, if you are
588
+ storing error backtraces, this will halve the size of your RetrySet
589
+ in Redis [fatkodima, #4272]
590
+ ```
591
+ RetrySet with 100,000 jobs
592
+ Before: 261 MB
593
+ After: 129 MB
594
+ ```
595
+ - Support display of ActiveJob 6.0 payloads in the Web UI [#4263]
596
+ - Add `SortedSet#scan` for pattern based scanning. For large sets this API will be **MUCH** faster
597
+ than standard iteration using each. [fatkodima, #4262]
598
+ ```ruby
599
+ Sidekiq::DeadSet.new.scan("UnreliableApi") do |job|
600
+ job.retry
601
+ end
602
+ ```
603
+ - Dramatically speed up SortedSet#find\_job(jid) by using Redis's ZSCAN
604
+ support, approx 10x faster. [fatkodima, #4259]
605
+ ```
606
+ zscan 0.179366 0.047727 0.227093 ( 1.161376)
607
+ enum 8.522311 0.419826 8.942137 ( 9.785079)
608
+ ```
609
+ - Respect rails' generators `test_framework` option and gracefully handle extra `worker` suffix on generator [fatkodima, #4256]
610
+ - Add ability to sort 'Enqueued' page on Web UI by position in the queue [fatkodima, #4248]
611
+ - Support `Client.push_bulk` with different delays [fatkodima, #4243]
612
+ ```ruby
613
+ Sidekiq::Client.push_bulk("class" => FooJob, "args" => [[1], [2]], "at" => [1.minute.from_now.to_f, 5.minutes.from_now.to_f])
614
+ ```
615
+ - Easier way to test enqueuing specific ActionMailer and ActiveRecord delayed jobs. Instead of manually
616
+ parsing embedded class, you can now test by fetching jobs for specific classes. [fatkodima, #4292]
617
+ ```ruby
618
+ assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs_for(FooMailer).size
619
+ ```
620
+ - Add `sidekiqmon` to gemspec executables [#4242]
621
+ - Gracefully handle `Sidekiq.logger = nil` [#4240]
622
+ - Inject Sidekiq::LogContext module if user-supplied logger does not include it [#4239]
623
+
624
+ 6.0
625
+ ---------
626
+
627
+ This release has major breaking changes. Read and test carefully in production.
628
+
629
+ - With Rails 6.0.2+, ActiveJobs can now use `sidekiq_options` directly to configure Sidekiq
630
+ features/internals like the retry subsystem. [#4213, pirj]
631
+ ```ruby
632
+ class MyJob < ActiveJob::Base
633
+ queue_as :myqueue
634
+ sidekiq_options retry: 10, backtrace: 20
635
+ def perform(...)
636
+ end
637
+ end
638
+ ```
639
+ - Logging has been redesigned to allow for pluggable log formatters:
640
+ ```ruby
641
+ Sidekiq.configure_server do |config|
642
+ config.log_formatter = Sidekiq::Logger::Formatters::JSON.new
643
+ end
644
+ ```
645
+ See the [Logging wiki page](https://github.com/sidekiq/sidekiq/wiki/Logging) for more details.
646
+ - **BREAKING CHANGE** Validate proper usage of the `REDIS_PROVIDER`
647
+ variable. This variable is meant to hold the name of the environment
648
+ variable which contains your Redis URL, so that you can switch Redis
649
+ providers quickly and easily with a single variable change. It is not
650
+ meant to hold the actual Redis URL itself. If you want to manually set
651
+ the Redis URL (not recommended as it implies you have no failover),
652
+ then you may set `REDIS_URL` directly. [#3969]
653
+ - **BREAKING CHANGE** Increase default shutdown timeout from 8 seconds
654
+ to 25 seconds. Both Heroku and ECS now use 30 second shutdown timeout
655
+ by default and we want Sidekiq to take advantage of this time. If you
656
+ have deployment scripts which depend on the old default timeout, use `-t 8` to
657
+ get the old behavior. [#3968]
658
+ - **BREAKING CHANGE** Remove the daemonization, logfile and pidfile
659
+ arguments to Sidekiq. Use a proper process supervisor (e.g. systemd or
660
+ foreman) to manage Sidekiq. See the Deployment wiki page for links to
661
+ more resources.
662
+ - Integrate the StandardRB code formatter to ensure consistent code
663
+ styling. [#4114, gearnode]
664
+
665
+ 5.2.10
666
+ ---------
667
+
668
+ - Backport fix for CVE-2022-23837.
669
+ - Migrate to `exists?` for redis-rb.
670
+ - Lock redis-rb to <4.6 to avoid deprecations.
671
+
672
+ 5.2.9
673
+ ---------
674
+
675
+ - Release Rack lock due to a cascade of CVEs. [#4566]
676
+ Pro-tip: don't lock Rack.
677
+
678
+ 5.2.8
679
+ ---------
680
+
681
+ - Lock to Rack 2.0.x to prevent future incompatibilities
682
+ - Fix invalid reference in `sidekiqctl`
683
+
684
+ 5.2.7
685
+ ---------
686
+
687
+ - Fix stale `enqueued_at` when retrying [#4149]
688
+ - Move build to [Circle CI](https://circleci.com/gh/mperham/sidekiq) [#4120]
689
+
690
+ 5.2.6
691
+ ---------
692
+
693
+ - Fix edge case where a job failure during Redis outage could result in a lost job [#4141]
694
+ - Better handling of malformed job arguments in payload [#4095]
695
+ - Restore bootstap's dropdown css component [#4099, urkle]
696
+ - Display human-friendly time diff for longer queue latencies [#4111, interlinked]
697
+ - Allow `Sidekiq::Worker#set` to be chained
698
+
699
+ 5.2.5
700
+ ---------
701
+
702
+ - Fix default usage of `config/sidekiq.yml` [#4077, Tensho]
703
+
704
+ 5.2.4
705
+ ---------
706
+
707
+ - Add warnings for various deprecations and changes coming in Sidekiq 6.0.
708
+ See the 6-0 branch. [#4056]
709
+ - Various improvements to the Sidekiq test suite and coverage [#4026, #4039, Tensho]
710
+
711
+ 5.2.3
712
+ ---------
713
+
714
+ - Warning message on invalid REDIS\_PROVIDER [#3970]
715
+ - Add `sidekiqctl status` command [#4003, dzunk]
716
+ - Update elapsed time calculatons to use monotonic clock [#3999]
717
+ - Fix a few issues with mobile Web UI styling [#3973, navied]
718
+ - Jobs with `retry: false` now go through the global `death_handlers`,
719
+ meaning you can take action on failed ephemeral jobs. [#3980, Benjamin-Dobell]
720
+ - Fix race condition in defining Workers. [#3997, mattbooks]
721
+
722
+ 5.2.2
723
+ ---------
724
+
725
+ - Raise error for duplicate queue names in config to avoid unexpected fetch algorithm change [#3911]
726
+ - Fix concurrency bug on JRuby [#3958, mattbooks]
727
+ - Add "Kill All" button to the retries page [#3938]
728
+
729
+ 5.2.1
730
+ -----------
731
+
732
+ - Fix concurrent modification error during heartbeat [#3921]
733
+
734
+ 5.2.0
735
+ -----------
736
+
737
+ - **Decrease default concurrency from 25 to 10** [#3892]
738
+ - Verify connection pool sizing upon startup [#3917]
739
+ - Smoother scheduling for large Sidekiq clusters [#3889]
740
+ - Switch Sidekiq::Testing impl from alias\_method to Module#prepend, for resiliency [#3852]
741
+ - Update Sidekiq APIs to use SCAN for scalability [#3848, ffiller]
742
+ - Remove concurrent-ruby gem dependency [#3830]
743
+ - Optimize Web UI's bootstrap.css [#3914]
744
+
745
+ 5.1.3
746
+ -----------
747
+
748
+ - Fix version comparison so Ruby 2.2.10 works. [#3808, nateberkopec]
749
+
750
+ 5.1.2
751
+ -----------
752
+
753
+ - Add link to docs in Web UI footer
754
+ - Fix crash on Ctrl-C in Windows [#3775, Bernica]
755
+ - Remove `freeze` calls on String constants. This is superfluous with Ruby
756
+ 2.3+ and `frozen_string_literal: true`. [#3759]
757
+ - Fix use of AR middleware outside of Rails [#3787]
758
+ - Sidekiq::Worker `sidekiq_retry_in` block can now return nil or 0 to use
759
+ the default backoff delay [#3796, dsalahutdinov]
760
+
761
+ 5.1.1
762
+ -----------
763
+
764
+ - Fix Web UI incompatibility with Redis 3.x gem [#3749]
765
+
766
+ 5.1.0
767
+ -----------
768
+
769
+ - **NEW** Global death handlers - called when your job exhausts all
770
+ retries and dies. Now you can take action when a job fails permanently. [#3721]
771
+ - **NEW** Enable ActiveRecord query cache within jobs by default [#3718, sobrinho]
772
+ This will prevent duplicate SELECTS; cache is cleared upon any UPDATE/INSERT/DELETE.
773
+ See the issue for how to bypass the cache or disable it completely.
774
+ - Scheduler timing is now more accurate, 15 -> 5 seconds [#3734]
775
+ - Exceptions during the :startup event will now kill the process [#3717]
776
+ - Make `Sidekiq::Client.via` reentrant [#3715]
777
+ - Fix use of Sidekiq logger outside of the server process [#3714]
778
+ - Tweak `constantize` to better match Rails class lookup. [#3701, caffeinated-tech]
779
+
780
+ 5.0.5
781
+ -----------
782
+
783
+ - Update gemspec to allow newer versions of the Redis gem [#3617]
784
+ - Refactor Worker.set so it can be memoized [#3602]
785
+ - Fix display of Redis URL in web footer, broken in 5.0.3 [#3560]
786
+ - Update `Sidekiq::Job#display_args` to avoid mutation [#3621]
787
+
788
+ 5.0.4
789
+ -----------
790
+
791
+ - Fix "slow startup" performance regression from 5.0.2. [#3525]
792
+ - Allow users to disable ID generation since some redis providers disable the CLIENT command. [#3521]
793
+
794
+ 5.0.3
795
+ -----------
796
+
797
+ - Fix overriding `class_attribute` core extension from ActiveSupport with Sidekiq one [PikachuEXE, #3499]
798
+ - Allow job logger to be overridden [AlfonsoUceda, #3502]
799
+ - Set a default Redis client identifier for debugging [#3516]
800
+ - Fix "Uninitialized constant" errors on startup with the delayed extensions [#3509]
801
+
802
+ 5.0.2
803
+ -----------
804
+
805
+ - fix broken release, thanks @nateberkopec
806
+
807
+ 5.0.1
808
+ -----------
809
+
810
+ - Fix incorrect server identity when daemonizing [jwilm, #3496]
811
+ - Work around error running Web UI against Redis Cluster [#3492]
812
+ - Remove core extensions, Sidekiq is now monkeypatch-free! [#3474]
813
+ - Reimplement Web UI's HTTP\_ACCEPT\_LANGUAGE parsing because the spec is utterly
814
+ incomprehensible for various edge cases. [johanlunds, natematykiewicz, #3449]
815
+ - Update `class_attribute` core extension to avoid warnings
816
+ - Expose `job_hash_context` from `Sidekiq::Logging` to support log customization
817
+
818
+ 5.0.0
819
+ -----------
820
+
821
+ - **BREAKING CHANGE** Job dispatch was refactored for safer integration with
822
+ Rails 5. The **Logging** and **RetryJobs** server middleware were removed and
823
+ functionality integrated directly into Sidekiq::Processor. These aren't
824
+ commonly used public APIs so this shouldn't impact most users.
825
+ ```
826
+ Sidekiq::Middleware::Server::RetryJobs -> Sidekiq::JobRetry
827
+ Sidekiq::Middleware::Server::Logging -> Sidekiq::JobLogger
828
+ ```
829
+ - Quieting Sidekiq is now done via the TSTP signal, the USR1 signal is deprecated.
830
+ - The `delay` extension APIs are no longer available by default, you
831
+ must opt into them.
832
+ - The Web UI is now BiDi and can render RTL languages like Arabic, Farsi and Hebrew.
833
+ - Rails 3.2 and Ruby 2.0 and 2.1 are no longer supported.
834
+ - The `SomeWorker.set(options)` API was re-written to avoid thread-local state. [#2152]
835
+ - Sidekiq Enterprise's encrypted jobs now display "[encrypted data]" in the Web UI instead
836
+ of random hex bytes.
837
+ - Please see the [5.0 Upgrade notes](docs/5.0-Upgrade.md) for more detail.
838
+
839
+ 4.2.10
840
+ -----------
841
+
842
+ - Scheduled jobs can now be moved directly to the Dead queue via API [#3390]
843
+ - Fix edge case leading to job duplication when using Sidekiq Pro's
844
+ reliability feature [#3388]
845
+ - Fix error class name display on retry page [#3348]
846
+ - More robust latency calculation [#3340]
847
+
848
+ 4.2.9
849
+ -----------
850
+
851
+ - Rollback [#3303] which broke Heroku Redis users [#3311]
852
+ - Add support for TSTP signal, for Sidekiq 5.0 forward compatibility. [#3302]
853
+
854
+ 4.2.8
855
+ -----------
856
+
857
+ - Fix rare edge case with Redis driver that can create duplicate jobs [#3303]
858
+ - Fix Rails 5 loading issue [#3275]
859
+ - Restore missing tooltips to timestamps in Web UI [#3310]
860
+ - Work on **Sidekiq 5.0** is now active! [#3301]
861
+
862
+ 4.2.7
863
+ -----------
864
+
865
+ - Add new integration testing to verify code loading and job execution
866
+ in development and production modes with Rails 4 and 5 [#3241]
867
+ - Fix delayed extensions in development mode [#3227, DarthSim]
868
+ - Use Worker's `retry` default if job payload does not have a retry
869
+ attribute [#3234, mlarraz]
870
+
871
+ 4.2.6
872
+ -----------
873
+
874
+ - Run Rails Executor when in production [#3221, eugeneius]
875
+
876
+ 4.2.5
877
+ -----------
878
+
879
+ - Re-enable eager loading of all code when running non-development Rails 5. [#3203]
880
+ - Better root URL handling for zany web servers [#3207]
881
+
882
+ 4.2.4
883
+ -----------
884
+
885
+ - Log errors coming from the Rails 5 reloader. [#3212, eugeneius]
886
+ - Clone job data so middleware changes don't appear in Busy tab
887
+
888
+ 4.2.3
889
+ -----------
890
+
891
+ - Disable use of Rails 5's Reloader API in non-development modes, it has proven
892
+ to be unstable under load [#3154]
893
+ - Allow disabling of Sidekiq::Web's cookie session to handle the
894
+ case where the app provides a session already [#3180, inkstak]
895
+ ```ruby
896
+ Sidekiq::Web.set :sessions, false
897
+ ```
898
+ - Fix Web UI sharding support broken in 4.2.2. [#3169]
899
+ - Fix timestamps not updating during UI polling [#3193, shaneog]
900
+ - Relax rack-protection version to >= 1.5.0
901
+ - Provide consistent interface to exception handlers, changing the structure of the context hash. [#3161]
902
+
903
+ 4.2.2
904
+ -----------
905
+
906
+ - Fix ever-increasing cookie size with nginx [#3146, cconstantine]
907
+ - Fix so Web UI works without trailing slash [#3158, timdorr]
908
+
909
+ 4.2.1
910
+ -----------
911
+
912
+ - Ensure browser does not cache JSON/AJAX responses. [#3136]
913
+ - Support old Sinatra syntax for setting config [#3139]
914
+
915
+ 4.2.0
916
+ -----------
917
+
918
+ - Enable development-mode code reloading. **With Rails 5.0+, you don't need
919
+ to restart Sidekiq to pick up your Sidekiq::Worker changes anymore!** [#2457]
920
+ - **Remove Sinatra dependency**. Sidekiq's Web UI now uses Rack directly.
921
+ Thank you to Sidekiq's newest committer, **badosu**, for writing the code
922
+ and doing a lot of testing to ensure compatibility with many different
923
+ 3rd party plugins. If your Web UI works with 4.1.4 but fails with
924
+ 4.2.0, please open an issue. [#3075]
925
+ - Allow tuning of concurrency with the `RAILS_MAX_THREADS` env var. [#2985]
926
+ This is the same var used by Puma so you can tune all of your systems
927
+ the same way:
928
+ ```sh
929
+ web: RAILS_MAX_THREADS=5 bundle exec puma ...
930
+ worker: RAILS_MAX_THREADS=10 bundle exec sidekiq ...
931
+ ```
932
+ Using `-c` or `config/sidekiq.yml` overrides this setting. I recommend
933
+ adjusting your `config/database.yml` to use it too so connections are
934
+ auto-scaled:
935
+ ```yaml
936
+ pool: <%= ENV['RAILS_MAX_THREADS'] || 5 %>
937
+ ```
938
+
939
+ 4.1.4
940
+ -----------
941
+
942
+ - Unlock Sinatra so a Rails 5.0 compatible version may be used [#3048]
943
+ - Fix race condition on startup with JRuby [#3043]
944
+
945
+
946
+ 4.1.3
947
+ -----------
948
+
949
+ - Please note the Redis 3.3.0 gem has a [memory leak](https://github.com/redis/redis-rb/issues/612),
950
+ Redis 3.2.2 is recommended until that issue is fixed.
951
+ - Sinatra 1.4.x is now a required dependency, avoiding cryptic errors
952
+ and old bugs due to people not upgrading Sinatra for years. [#3042]
953
+ - Fixed race condition in heartbeat which could rarely lead to lingering
954
+ processes on the Busy tab. [#2982]
955
+ ```ruby
956
+ # To clean up lingering processes, modify this as necessary to connect to your Redis.
957
+ # After 60 seconds, lingering processes should disappear from the Busy page.
958
+
959
+ require 'redis'
960
+ r = Redis.new(url: "redis://localhost:6379/0")
961
+ # uncomment if you need a namespace
962
+ #require 'redis-namespace'
963
+ #r = Redis::Namespace.new("foo", r)
964
+ r.smembers("processes").each do |pro|
965
+ r.expire(pro, 60)
966
+ r.expire("#{pro}:workers", 60)
967
+ end
968
+ ```
969
+
970
+
971
+ 4.1.2
972
+ -----------
973
+
974
+ - Fix Redis data leak with worker data when a busy Sidekiq process
975
+ crashes. You can find and expire leaked data in Redis with this
976
+ script:
977
+ ```bash
978
+ $ redis-cli keys "*:workers" | while read LINE ; do TTL=`redis-cli expire "$LINE" 60`; echo "$LINE"; done;
979
+ ```
980
+ Please note that `keys` can be dangerous to run on a large, busy Redis. Caveat runner.
981
+ - Freeze all string literals with Ruby 2.3. [#2741]
982
+ - Client middleware can now stop bulk job push. [#2887]
983
+
984
+ 4.1.1
985
+ -----------
986
+
987
+ - Much better behavior when Redis disappears and comes back. [#2866]
988
+ - Update FR locale [dbachet]
989
+ - Don't fill logfile in case of Redis downtime [#2860]
990
+ - Allow definition of a global retries_exhausted handler. [#2807]
991
+ ```ruby
992
+ Sidekiq.configure_server do |config|
993
+ config.default_retries_exhausted = -> (job, ex) do
994
+ Sidekiq.logger.info "#{job['class']} job is now dead"
995
+ end
996
+ end
997
+ ```
998
+
999
+ 4.1.0
1000
+ -----------
1001
+
1002
+ - Tag quiet processes in the Web UI [#2757, jcarlson]
1003
+ - Pass last exception to sidekiq\_retries\_exhausted block [#2787, Nowaker]
1004
+ ```ruby
1005
+ class MyWorker
1006
+ include Sidekiq::Worker
1007
+ sidekiq_retries_exhausted do |job, exception|
1008
+ end
1009
+ end
1010
+ ```
1011
+ - Add native support for ActiveJob's `set(options)` method allowing
1012
+ you to override worker options dynamically. This should make it
1013
+ even easier to switch between ActiveJob and Sidekiq's native APIs [#2780]
1014
+ ```ruby
1015
+ class MyWorker
1016
+ include Sidekiq::Worker
1017
+ sidekiq_options queue: 'default', retry: true
1018
+
1019
+ def perform(*args)
1020
+ # do something
1021
+ end
1022
+ end
1023
+
1024
+ MyWorker.set(queue: 'high', retry: false).perform_async(1)
1025
+ ```
1026
+
1027
+ 4.0.2
1028
+ -----------
1029
+
1030
+ - Better Japanese translations
1031
+ - Remove `json` gem dependency from gemspec. [#2743]
1032
+ - There's a new testing API based off the `Sidekiq::Queues` namespace. All
1033
+ assertions made against the Worker class still work as expected.
1034
+ [#2676, brandonhilkert]
1035
+ ```ruby
1036
+ assert_equal 0, Sidekiq::Queues["default"].size
1037
+ HardWorker.perform_async("log")
1038
+ assert_equal 1, Sidekiq::Queues["default"].size
1039
+ assert_equal "log", Sidekiq::Queues["default"].first['args'][0]
1040
+ Sidekiq::Queues.clear_all
1041
+ ```
1042
+
1043
+ 4.0.1
1044
+ -----------
1045
+
1046
+ - Yank new queue-based testing API [#2663]
1047
+ - Fix invalid constant reference in heartbeat
1048
+
1049
+ 4.0.0
1050
+ -----------
1051
+
1052
+ - Sidekiq's internals have been completely overhauled for performance
1053
+ and to remove dependencies. This has resulted in major speedups, as
1054
+ [detailed on my blog](http://www.mikeperham.com/2015/10/14/optimizing-sidekiq/).
1055
+ - See the [4.0 upgrade notes](docs/4.0-Upgrade.md) for more detail.
1056
+
1057
+ 3.5.4
1058
+ -----------
1059
+
1060
+ - Ensure exception message is a string [#2707]
1061
+ - Revert racy Process.kill usage in sidekiqctl
1062
+
1063
+ 3.5.3
1064
+ -----------
1065
+
1066
+ - Adjust shutdown event to run in parallel with the rest of system shutdown. [#2635]
1067
+
1068
+ 3.5.2
1069
+ -----------
1070
+
1071
+ - **Sidekiq 3 is now in maintenance mode**, only major bugs will be fixed.
1072
+ - The exception triggering a retry is now passed into `sidekiq_retry_in`,
1073
+ allowing you to retry more frequently for certain types of errors.
1074
+ [#2619, kreynolds]
1075
+ ```ruby
1076
+ sidekiq_retry_in do |count, ex|
1077
+ case ex
1078
+ when RuntimeError
1079
+ 5 * count
1080
+ else
1081
+ 10 * count
1082
+ end
1083
+ end
1084
+ ```
1085
+
1086
+ 3.5.1
1087
+ -----------
1088
+
1089
+ - **FIX MEMORY LEAK** Under rare conditions, threads may leak [#2598, gazay]
1090
+ - Add Ukrainian locale [#2561, elrakita]
1091
+ - Disconnect and retry Redis operations if we see a READONLY error [#2550]
1092
+ - Add server middleware testing harness; see [wiki](https://github.com/sidekiq/sidekiq/wiki/Testing#testing-server-middleware) [#2534, ryansch]
1093
+
1094
+ 3.5.0
1095
+ -----------
1096
+
1097
+ - Polished new banner! [#2522, firedev]
1098
+ - Upgrade to Celluloid 0.17. [#2420, digitalextremist]
1099
+ - Activate sessions in Sinatra for CSRF protection, requires Rails
1100
+ monkeypatch due to rails/rails#15843. [#2460, jc00ke]
1101
+
1102
+ 3.4.2
1103
+ -----------
1104
+
1105
+ - Don't allow `Sidekiq::Worker` in ActiveJob::Base classes. [#2424]
1106
+ - Safer display of job data in Web UI [#2405]
1107
+ - Fix CSRF vulnerability in Web UI, thanks to Egor Homakov for
1108
+ reporting. [#2422] If you are running the Web UI as a standalone Rack app,
1109
+ ensure you have a [session middleware
1110
+ configured](https://github.com/sidekiq/sidekiq/wiki/Monitoring#standalone):
1111
+ ```ruby
1112
+ use Rack::Session::Cookie, :secret => "some unique secret string here"
1113
+ ```
1114
+
1
1115
  3.4.1
2
1116
  -----------
3
1117
 
@@ -205,7 +1319,7 @@ sidekiq_options :dead => false, :retry => 5
205
1319
  3.0.0
206
1320
  -----------
207
1321
 
208
- Please see [3.0-Upgrade.md](3.0-Upgrade.md) for more comprehensive upgrade notes.
1322
+ Please see [3.0-Upgrade.md](docs/3.0-Upgrade.md) for more comprehensive upgrade notes.
209
1323
 
210
1324
  - **Dead Job Queue** - jobs which run out of retries are now moved to a dead
211
1325
  job queue. These jobs must be retried manually or they will expire
@@ -249,7 +1363,7 @@ Sidekiq::Client.via(ConnectionPool.new { Redis.new }) do
249
1363
  end
250
1364
  ```
251
1365
  **Sharding support does require a breaking change to client-side
252
- middleware, see 3.0-Upgrade.md.**
1366
+ middleware, see docs/3.0-Upgrade.md.**
253
1367
  - New Chinese, Greek, Swedish and Czech translations for the Web UI.
254
1368
  - Updated most languages translations for the new UI features.
255
1369
  - **Remove official Capistrano integration** - this integration has been
@@ -377,10 +1491,10 @@ middleware, see 3.0-Upgrade.md.**
377
1491
  appear to be doing any work. [#1194]
378
1492
  - Sidekiq's testing behavior is now dynamic. You can choose between
379
1493
  `inline` and `fake` behavior in your tests. See
380
- [Testing](https://github.com/mperham/sidekiq/wiki/Testing) for detail. [#1193]
1494
+ [Testing](https://github.com/sidekiq/sidekiq/wiki/Testing) for detail. [#1193]
381
1495
  - The Retries table has a new column for the error message.
382
1496
  - The Web UI topbar now contains the status and live poll button.
383
- - Orphaned worker records are now auto-vacuumed when you vist the
1497
+ - Orphaned worker records are now auto-vacuumed when you visit the
384
1498
  Workers page in the Web UI.
385
1499
  - Sidekiq.default\_worker\_options allows you to configure default
386
1500
  options for all Sidekiq worker types.