sidekiq 4.1.4 → 6.5.6

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (213) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +666 -0
  3. data/LICENSE +3 -3
  4. data/README.md +27 -35
  5. data/bin/sidekiq +27 -3
  6. data/bin/sidekiqload +78 -84
  7. data/bin/sidekiqmon +8 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  10. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  11. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  12. data/lib/sidekiq/api.rb +583 -288
  13. data/lib/sidekiq/cli.rb +255 -218
  14. data/lib/sidekiq/client.rb +86 -83
  15. data/lib/sidekiq/component.rb +65 -0
  16. data/lib/sidekiq/delay.rb +43 -0
  17. data/lib/sidekiq/extensions/action_mailer.rb +13 -22
  18. data/lib/sidekiq/extensions/active_record.rb +13 -10
  19. data/lib/sidekiq/extensions/class_methods.rb +14 -11
  20. data/lib/sidekiq/extensions/generic_proxy.rb +13 -5
  21. data/lib/sidekiq/fetch.rb +50 -40
  22. data/lib/sidekiq/job.rb +13 -0
  23. data/lib/sidekiq/job_logger.rb +51 -0
  24. data/lib/sidekiq/job_retry.rb +282 -0
  25. data/lib/sidekiq/job_util.rb +71 -0
  26. data/lib/sidekiq/launcher.rb +192 -85
  27. data/lib/sidekiq/logger.rb +156 -0
  28. data/lib/sidekiq/manager.rb +44 -45
  29. data/lib/sidekiq/metrics/deploy.rb +47 -0
  30. data/lib/sidekiq/metrics/query.rb +153 -0
  31. data/lib/sidekiq/metrics/shared.rb +94 -0
  32. data/lib/sidekiq/metrics/tracking.rb +134 -0
  33. data/lib/sidekiq/middleware/chain.rb +102 -46
  34. data/lib/sidekiq/middleware/current_attributes.rb +63 -0
  35. data/lib/sidekiq/middleware/i18n.rb +7 -7
  36. data/lib/sidekiq/middleware/modules.rb +21 -0
  37. data/lib/sidekiq/monitor.rb +133 -0
  38. data/lib/sidekiq/paginator.rb +20 -16
  39. data/lib/sidekiq/processor.rb +178 -78
  40. data/lib/sidekiq/rails.rb +56 -27
  41. data/lib/sidekiq/redis_client_adapter.rb +154 -0
  42. data/lib/sidekiq/redis_connection.rb +123 -47
  43. data/lib/sidekiq/ring_buffer.rb +29 -0
  44. data/lib/sidekiq/scheduled.rb +97 -40
  45. data/lib/sidekiq/sd_notify.rb +149 -0
  46. data/lib/sidekiq/systemd.rb +24 -0
  47. data/lib/sidekiq/testing/inline.rb +6 -5
  48. data/lib/sidekiq/testing.rb +83 -56
  49. data/lib/sidekiq/transaction_aware_client.rb +45 -0
  50. data/lib/sidekiq/version.rb +2 -1
  51. data/lib/sidekiq/web/action.rb +93 -0
  52. data/lib/sidekiq/web/application.rb +379 -0
  53. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  54. data/lib/sidekiq/web/helpers.rb +365 -0
  55. data/lib/sidekiq/web/router.rb +104 -0
  56. data/lib/sidekiq/web.rb +108 -213
  57. data/lib/sidekiq/worker.rb +288 -42
  58. data/lib/sidekiq.rb +188 -80
  59. data/sidekiq.gemspec +24 -22
  60. data/web/assets/images/apple-touch-icon.png +0 -0
  61. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  62. data/web/assets/javascripts/application.js +130 -75
  63. data/web/assets/javascripts/chart.min.js +13 -0
  64. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  65. data/web/assets/javascripts/dashboard.js +70 -91
  66. data/web/assets/javascripts/graph.js +16 -0
  67. data/web/assets/javascripts/metrics.js +262 -0
  68. data/web/assets/stylesheets/application-dark.css +143 -0
  69. data/web/assets/stylesheets/application-rtl.css +242 -0
  70. data/web/assets/stylesheets/application.css +390 -145
  71. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  72. data/web/assets/stylesheets/bootstrap.css +4 -8
  73. data/web/locales/ar.yml +87 -0
  74. data/web/locales/de.yml +15 -3
  75. data/web/locales/el.yml +43 -19
  76. data/web/locales/en.yml +15 -1
  77. data/web/locales/es.yml +22 -5
  78. data/web/locales/fa.yml +80 -0
  79. data/web/locales/fr.yml +10 -3
  80. data/web/locales/he.yml +79 -0
  81. data/web/locales/ja.yml +12 -4
  82. data/web/locales/lt.yml +83 -0
  83. data/web/locales/pl.yml +4 -4
  84. data/web/locales/pt-br.yml +27 -9
  85. data/web/locales/ru.yml +4 -0
  86. data/web/locales/ur.yml +80 -0
  87. data/web/locales/vi.yml +83 -0
  88. data/web/views/_footer.erb +6 -3
  89. data/web/views/_job_info.erb +4 -3
  90. data/web/views/_nav.erb +5 -19
  91. data/web/views/_paging.erb +1 -1
  92. data/web/views/_poll_link.erb +2 -5
  93. data/web/views/_summary.erb +7 -7
  94. data/web/views/busy.erb +64 -26
  95. data/web/views/dashboard.erb +26 -17
  96. data/web/views/dead.erb +4 -4
  97. data/web/views/layout.erb +15 -5
  98. data/web/views/metrics.erb +69 -0
  99. data/web/views/metrics_for_job.erb +87 -0
  100. data/web/views/morgue.erb +21 -14
  101. data/web/views/queue.erb +28 -14
  102. data/web/views/queues.erb +15 -5
  103. data/web/views/retries.erb +24 -15
  104. data/web/views/retry.erb +5 -5
  105. data/web/views/scheduled.erb +9 -6
  106. data/web/views/scheduled_job_info.erb +1 -1
  107. metadata +73 -256
  108. data/.github/contributing.md +0 -32
  109. data/.github/issue_template.md +0 -4
  110. data/.gitignore +0 -12
  111. data/.travis.yml +0 -18
  112. data/3.0-Upgrade.md +0 -70
  113. data/4.0-Upgrade.md +0 -53
  114. data/COMM-LICENSE +0 -95
  115. data/Ent-Changes.md +0 -123
  116. data/Gemfile +0 -29
  117. data/Pro-2.0-Upgrade.md +0 -138
  118. data/Pro-3.0-Upgrade.md +0 -44
  119. data/Pro-Changes.md +0 -559
  120. data/Rakefile +0 -9
  121. data/bin/sidekiqctl +0 -99
  122. data/code_of_conduct.md +0 -50
  123. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  124. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  125. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  126. data/lib/sidekiq/core_ext.rb +0 -106
  127. data/lib/sidekiq/exception_handler.rb +0 -31
  128. data/lib/sidekiq/logging.rb +0 -106
  129. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  130. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  131. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  132. data/lib/sidekiq/util.rb +0 -62
  133. data/lib/sidekiq/web_helpers.rb +0 -255
  134. data/test/config.yml +0 -9
  135. data/test/env_based_config.yml +0 -11
  136. data/test/fake_env.rb +0 -1
  137. data/test/fixtures/en.yml +0 -2
  138. data/test/helper.rb +0 -75
  139. data/test/test_actors.rb +0 -138
  140. data/test/test_api.rb +0 -528
  141. data/test/test_cli.rb +0 -406
  142. data/test/test_client.rb +0 -266
  143. data/test/test_exception_handler.rb +0 -56
  144. data/test/test_extensions.rb +0 -127
  145. data/test/test_fetch.rb +0 -50
  146. data/test/test_launcher.rb +0 -85
  147. data/test/test_logging.rb +0 -35
  148. data/test/test_manager.rb +0 -50
  149. data/test/test_middleware.rb +0 -158
  150. data/test/test_processor.rb +0 -201
  151. data/test/test_rails.rb +0 -22
  152. data/test/test_redis_connection.rb +0 -132
  153. data/test/test_retry.rb +0 -326
  154. data/test/test_retry_exhausted.rb +0 -149
  155. data/test/test_scheduled.rb +0 -115
  156. data/test/test_scheduling.rb +0 -50
  157. data/test/test_sidekiq.rb +0 -107
  158. data/test/test_testing.rb +0 -143
  159. data/test/test_testing_fake.rb +0 -357
  160. data/test/test_testing_inline.rb +0 -94
  161. data/test/test_util.rb +0 -13
  162. data/test/test_web.rb +0 -614
  163. data/test/test_web_helpers.rb +0 -54
  164. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  165. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  166. data/web/assets/images/status/active.png +0 -0
  167. data/web/assets/images/status/idle.png +0 -0
  168. data/web/assets/javascripts/locales/README.md +0 -27
  169. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  170. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  171. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  172. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  173. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  174. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  175. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  176. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  177. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  178. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  179. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  180. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  181. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  182. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  183. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  184. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  185. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  186. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  187. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  188. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  189. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  190. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  191. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  192. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  193. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  194. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  195. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  196. data/web/assets/javascripts/locales/jquery.timeago.nb.js +0 -18
  197. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  198. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  199. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  200. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  201. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  202. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  203. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  204. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  205. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  206. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  207. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  208. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  209. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  210. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  211. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  212. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  213. data/web/views/_poll_js.erb +0 -5
@@ -1,255 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'uri'
3
-
4
- module Sidekiq
5
- # This is not a public API
6
- module WebHelpers
7
- def strings(lang)
8
- @@strings ||= {}
9
- @@strings[lang] ||= begin
10
- # Allow sidekiq-web extensions to add locale paths
11
- # so extensions can be localized
12
- settings.locales.each_with_object({}) do |path, global|
13
- find_locale_files(lang).each do |file|
14
- strs = YAML.load(File.open(file))
15
- global.deep_merge!(strs[lang])
16
- end
17
- end
18
- end
19
- end
20
-
21
- def clear_caches
22
- @@strings = nil
23
- @@locale_files = nil
24
- end
25
-
26
- def locale_files
27
- @@locale_files ||= settings.locales.flat_map do |path|
28
- Dir["#{path}/*.yml"]
29
- end
30
- end
31
-
32
- def find_locale_files(lang)
33
- locale_files.select { |file| file =~ /\/#{lang}\.yml$/ }
34
- end
35
-
36
- # This is a hook for a Sidekiq Pro feature. Please don't touch.
37
- def filtering(*)
38
- end
39
-
40
- # This view helper provide ability display you html code in
41
- # to head of page. Example:
42
- #
43
- # <% add_to_head do %>
44
- # <link rel="stylesheet" .../>
45
- # <meta .../>
46
- # <% end %>
47
- #
48
- def add_to_head(&block)
49
- @head_html ||= []
50
- @head_html << block if block_given?
51
- end
52
-
53
- def display_custom_head
54
- return unless defined?(@head_html)
55
- @head_html.map { |block| capture(&block) }.join
56
- end
57
-
58
- # Simple capture method for erb templates. The origin was
59
- # capture method from sinatra-contrib library.
60
- def capture(&block)
61
- block.call
62
- eval('', block.binding)
63
- end
64
-
65
- # Given a browser request Accept-Language header like
66
- # "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,ru;q=0.2", this function
67
- # will return "fr" since that's the first code with a matching
68
- # locale in web/locales
69
- def locale
70
- @locale ||= begin
71
- locale = 'en'.freeze
72
- languages = request.env['HTTP_ACCEPT_LANGUAGE'.freeze] || 'en'.freeze
73
- languages.downcase.split(','.freeze).each do |lang|
74
- next if lang == '*'.freeze
75
- lang = lang.split(';'.freeze)[0]
76
- break locale = lang if find_locale_files(lang).any?
77
- end
78
- locale
79
- end
80
- end
81
-
82
- def get_locale
83
- strings(locale)
84
- end
85
-
86
- def t(msg, options={})
87
- string = get_locale[msg] || msg
88
- if options.empty?
89
- string
90
- else
91
- string % options
92
- end
93
- end
94
-
95
- def workers
96
- @workers ||= Sidekiq::Workers.new
97
- end
98
-
99
- def processes
100
- @processes ||= Sidekiq::ProcessSet.new
101
- end
102
-
103
- def stats
104
- @stats ||= Sidekiq::Stats.new
105
- end
106
-
107
- def retries_with_score(score)
108
- Sidekiq.redis do |conn|
109
- conn.zrangebyscore('retry', score, score)
110
- end.map { |msg| Sidekiq.load_json(msg) }
111
- end
112
-
113
- def location
114
- Sidekiq.redis { |conn| conn.client.location }
115
- end
116
-
117
- def redis_connection
118
- Sidekiq.redis { |conn| conn.client.id }
119
- end
120
-
121
- def namespace
122
- @@ns ||= Sidekiq.redis { |conn| conn.respond_to?(:namespace) ? conn.namespace : nil }
123
- end
124
-
125
- def redis_info
126
- Sidekiq.redis_info
127
- end
128
-
129
- def root_path
130
- "#{env['SCRIPT_NAME']}/"
131
- end
132
-
133
- def current_path
134
- @current_path ||= request.path_info.gsub(/^\//,'')
135
- end
136
-
137
- def current_status
138
- workers.size == 0 ? 'idle' : 'active'
139
- end
140
-
141
- def relative_time(time)
142
- %{<time datetime="#{time.getutc.iso8601}">#{time}</time>}
143
- end
144
-
145
- def job_params(job, score)
146
- "#{score}-#{job['jid']}"
147
- end
148
-
149
- def parse_params(params)
150
- score, jid = params.split("-")
151
- [score.to_f, jid]
152
- end
153
-
154
- SAFE_QPARAMS = %w(page poll)
155
-
156
- # Merge options with current params, filter safe params, and stringify to query string
157
- def qparams(options)
158
- options = options.stringify_keys
159
- params.merge(options).map do |key, value|
160
- SAFE_QPARAMS.include?(key) ? "#{key}=#{value}" : next
161
- end.compact.join("&")
162
- end
163
-
164
- def truncate(text, truncate_after_chars = 2000)
165
- truncate_after_chars && text.size > truncate_after_chars ? "#{text[0..truncate_after_chars]}..." : text
166
- end
167
-
168
- def display_args(args, truncate_after_chars = 2000)
169
- args.map do |arg|
170
- h(truncate(to_display(arg), truncate_after_chars))
171
- end.join(", ")
172
- end
173
-
174
- def csrf_tag
175
- "<input type='hidden' name='authenticity_token' value='#{session[:csrf]}'/>"
176
- end
177
-
178
- def to_display(arg)
179
- begin
180
- arg.inspect
181
- rescue
182
- begin
183
- arg.to_s
184
- rescue => ex
185
- "Cannot display argument: [#{ex.class.name}] #{ex.message}"
186
- end
187
- end
188
- end
189
-
190
- RETRY_JOB_KEYS = Set.new(%w(
191
- queue class args retry_count retried_at failed_at
192
- jid error_message error_class backtrace
193
- error_backtrace enqueued_at retry wrapped
194
- created_at
195
- ))
196
-
197
- def retry_extra_items(retry_job)
198
- @retry_extra_items ||= {}.tap do |extra|
199
- retry_job.item.each do |key, value|
200
- extra[key] = value unless RETRY_JOB_KEYS.include?(key)
201
- end
202
- end
203
- end
204
-
205
- def number_with_delimiter(number)
206
- begin
207
- Float(number)
208
- rescue ArgumentError, TypeError
209
- return number
210
- end
211
-
212
- options = {delimiter: ',', separator: '.'}
213
- parts = number.to_s.to_str.split('.')
214
- parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{options[:delimiter]}")
215
- parts.join(options[:separator])
216
- end
217
-
218
- def h(text)
219
- ::Rack::Utils.escape_html(text)
220
- rescue ArgumentError => e
221
- raise unless e.message.eql?('invalid byte sequence in UTF-8')
222
- text.encode!('UTF-16', 'UTF-8', invalid: :replace, replace: '').encode!('UTF-8', 'UTF-16')
223
- retry
224
- end
225
-
226
- # Any paginated list that performs an action needs to redirect
227
- # back to the proper page after performing that action.
228
- def redirect_with_query(url)
229
- r = request.referer
230
- if r && r =~ /\?/
231
- ref = URI(r)
232
- redirect("#{url}?#{ref.query}")
233
- else
234
- redirect url
235
- end
236
- end
237
-
238
- def environment_title_prefix
239
- environment = Sidekiq.options[:environment] || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
240
-
241
- "[#{environment.upcase}] " unless environment == "production"
242
- end
243
-
244
- def product_version
245
- "Sidekiq v#{Sidekiq::VERSION}"
246
- end
247
-
248
- def redis_connection_and_namespace
249
- @redis_connection_and_namespace ||= begin
250
- namespace_suffix = namespace == nil ? '' : "##{namespace}"
251
- "#{redis_connection}#{namespace_suffix}"
252
- end
253
- end
254
- end
255
- end
data/test/config.yml DELETED
@@ -1,9 +0,0 @@
1
- ---
2
- :verbose: false
3
- :require: ./test/fake_env.rb
4
- :pidfile: /tmp/sidekiq-config-test.pid
5
- :logfile: /tmp/sidekiq.log
6
- :concurrency: 50
7
- :queues:
8
- - [<%="very_"%>often, 2]
9
- - [seldom, 1]
@@ -1,11 +0,0 @@
1
- ---
2
- :pidfile: /tmp/sidekiq-config-test.pid
3
- :concurrency: 50
4
- staging:
5
- :verbose: false
6
- :require: ./test/fake_env.rb
7
- :logfile: /tmp/sidekiq.log
8
- :concurrency: 5
9
- :queues:
10
- - [<%="very_"%>often, 2]
11
- - [seldom, 1]
data/test/fake_env.rb DELETED
@@ -1 +0,0 @@
1
- # frozen_string_literal: true
data/test/fixtures/en.yml DELETED
@@ -1,2 +0,0 @@
1
- en:
2
- translated_text: 'Changed text from add locals'
data/test/helper.rb DELETED
@@ -1,75 +0,0 @@
1
- # frozen_string_literal: true
2
- $TESTING = true
3
- # disable minitest/parallel threads
4
- ENV["N"] = "0"
5
-
6
- if ENV["COVERAGE"]
7
- require 'simplecov'
8
- SimpleCov.start do
9
- add_filter "/test/"
10
- add_filter "/myapp/"
11
- end
12
- end
13
- ENV['RACK_ENV'] = ENV['RAILS_ENV'] = 'test'
14
-
15
- trap 'USR1' do
16
- threads = Thread.list
17
-
18
- puts
19
- puts "=" * 80
20
- puts "Received USR1 signal; printing all #{threads.count} thread backtraces."
21
-
22
- threads.each do |thr|
23
- description = thr == Thread.main ? "Main thread" : thr.inspect
24
- puts
25
- puts "#{description} backtrace: "
26
- puts thr.backtrace.join("\n")
27
- end
28
-
29
- puts "=" * 80
30
- end
31
-
32
- begin
33
- require 'pry-byebug'
34
- rescue LoadError
35
- end
36
-
37
- require 'minitest/autorun'
38
-
39
- require 'sidekiq'
40
- require 'sidekiq/util'
41
- Sidekiq.logger.level = Logger::ERROR
42
-
43
- Sidekiq::Test = Minitest::Test
44
-
45
- require 'sidekiq/redis_connection'
46
- REDIS_URL = ENV['REDIS_URL'] || 'redis://localhost/15'
47
- REDIS = Sidekiq::RedisConnection.create(:url => REDIS_URL, :namespace => 'testy')
48
-
49
- Sidekiq.configure_client do |config|
50
- config.redis = { :url => REDIS_URL, :namespace => 'testy' }
51
- end
52
-
53
- def capture_logging(lvl=Logger::INFO)
54
- old = Sidekiq.logger
55
- begin
56
- out = StringIO.new
57
- logger = Logger.new(out)
58
- logger.level = lvl
59
- Sidekiq.logger = logger
60
- yield
61
- out.string
62
- ensure
63
- Sidekiq.logger = old
64
- end
65
- end
66
-
67
- def with_logging(lvl=Logger::DEBUG)
68
- old = Sidekiq.logger.level
69
- begin
70
- Sidekiq.logger.level = lvl
71
- yield
72
- ensure
73
- Sidekiq.logger.level = old
74
- end
75
- end
data/test/test_actors.rb DELETED
@@ -1,138 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'helper'
3
- require 'sidekiq/cli'
4
- require 'sidekiq/fetch'
5
- require 'sidekiq/scheduled'
6
- require 'sidekiq/processor'
7
-
8
- class TestActors < Sidekiq::Test
9
- class JoeWorker
10
- include Sidekiq::Worker
11
- def perform(slp)
12
- raise "boom" if slp == "boom"
13
- sleep(slp) if slp > 0
14
- $count += 1
15
- end
16
- end
17
-
18
- describe 'threads' do
19
- before do
20
- Sidekiq.redis {|c| c.flushdb}
21
- end
22
-
23
- describe 'scheduler' do
24
- it 'can start and stop' do
25
- f = Sidekiq::Scheduled::Poller.new
26
- f.start
27
- f.terminate
28
- end
29
-
30
- it 'can schedule' do
31
- ss = Sidekiq::ScheduledSet.new
32
- q = Sidekiq::Queue.new
33
-
34
- JoeWorker.perform_in(0.01, 0)
35
-
36
- assert_equal 0, q.size
37
- assert_equal 1, ss.size
38
-
39
- sleep 0.015
40
- s = Sidekiq::Scheduled::Poller.new
41
- s.enqueue
42
- assert_equal 1, q.size
43
- assert_equal 0, ss.size
44
- s.terminate
45
- end
46
- end
47
-
48
- describe 'processor' do
49
- before do
50
- $count = 0
51
- end
52
-
53
- it 'can start and stop' do
54
- f = Sidekiq::Processor.new(Mgr.new)
55
- f.terminate
56
- end
57
-
58
- class Mgr
59
- attr_reader :latest_error
60
- attr_reader :mutex
61
- attr_reader :cond
62
- def initialize
63
- @mutex = ::Mutex.new
64
- @cond = ::ConditionVariable.new
65
- end
66
- def processor_died(inst, err)
67
- @latest_error = err
68
- @mutex.synchronize do
69
- @cond.signal
70
- end
71
- end
72
- def processor_stopped(inst)
73
- @mutex.synchronize do
74
- @cond.signal
75
- end
76
- end
77
- def options
78
- { :concurrency => 3, :queues => ['default'] }
79
- end
80
- end
81
-
82
- it 'can process' do
83
- mgr = Mgr.new
84
-
85
- p = Sidekiq::Processor.new(mgr)
86
- JoeWorker.perform_async(0)
87
-
88
- a = $count
89
- p.process_one
90
- b = $count
91
- assert_equal a + 1, b
92
- end
93
-
94
- it 'deals with errors' do
95
- mgr = Mgr.new
96
-
97
- p = Sidekiq::Processor.new(mgr)
98
- JoeWorker.perform_async("boom")
99
- q = Sidekiq::Queue.new
100
- assert_equal 1, q.size
101
-
102
- a = $count
103
- mgr.mutex.synchronize do
104
- p.start
105
- mgr.cond.wait(mgr.mutex)
106
- end
107
- b = $count
108
- assert_equal a, b
109
-
110
- sleep 0.001
111
- assert_equal false, p.thread.status
112
- p.terminate(true)
113
- refute_nil mgr.latest_error
114
- assert_equal RuntimeError, mgr.latest_error.class
115
- end
116
-
117
- it 'gracefully kills' do
118
- mgr = Mgr.new
119
-
120
- p = Sidekiq::Processor.new(mgr)
121
- JoeWorker.perform_async(1)
122
- q = Sidekiq::Queue.new
123
- assert_equal 1, q.size
124
-
125
- a = $count
126
- p.start
127
- sleep(0.02)
128
- p.terminate
129
- p.kill(true)
130
-
131
- b = $count
132
- assert_equal a, b
133
- assert_equal false, p.thread.status
134
- refute mgr.latest_error, mgr.latest_error.to_s
135
- end
136
- end
137
- end
138
- end