sidekiq 4.2.7 → 5.2.8

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 (108) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +61 -0
  3. data/.github/issue_template.md +8 -1
  4. data/.gitignore +3 -0
  5. data/.travis.yml +5 -6
  6. data/5.0-Upgrade.md +56 -0
  7. data/COMM-LICENSE +12 -10
  8. data/Changes.md +187 -0
  9. data/Ent-Changes.md +84 -3
  10. data/Gemfile +14 -20
  11. data/LICENSE +1 -1
  12. data/Pro-4.0-Upgrade.md +35 -0
  13. data/Pro-Changes.md +172 -3
  14. data/README.md +8 -6
  15. data/Rakefile +2 -5
  16. data/bin/sidekiqctl +13 -92
  17. data/bin/sidekiqload +16 -21
  18. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +1 -1
  19. data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
  20. data/lib/sidekiq/api.rb +163 -67
  21. data/lib/sidekiq/cli.rb +121 -78
  22. data/lib/sidekiq/client.rb +25 -18
  23. data/lib/sidekiq/core_ext.rb +1 -119
  24. data/lib/sidekiq/ctl.rb +221 -0
  25. data/lib/sidekiq/delay.rb +42 -0
  26. data/lib/sidekiq/exception_handler.rb +2 -4
  27. data/lib/sidekiq/extensions/generic_proxy.rb +7 -1
  28. data/lib/sidekiq/fetch.rb +1 -1
  29. data/lib/sidekiq/job_logger.rb +25 -0
  30. data/lib/sidekiq/job_retry.rb +262 -0
  31. data/lib/sidekiq/launcher.rb +19 -19
  32. data/lib/sidekiq/logging.rb +18 -2
  33. data/lib/sidekiq/manager.rb +6 -7
  34. data/lib/sidekiq/middleware/server/active_record.rb +10 -0
  35. data/lib/sidekiq/processor.rb +126 -39
  36. data/lib/sidekiq/rails.rb +16 -77
  37. data/lib/sidekiq/redis_connection.rb +50 -5
  38. data/lib/sidekiq/scheduled.rb +35 -8
  39. data/lib/sidekiq/testing.rb +21 -6
  40. data/lib/sidekiq/util.rb +6 -2
  41. data/lib/sidekiq/version.rb +1 -1
  42. data/lib/sidekiq/web/action.rb +2 -6
  43. data/lib/sidekiq/web/application.rb +34 -17
  44. data/lib/sidekiq/web/helpers.rb +72 -23
  45. data/lib/sidekiq/web/router.rb +10 -10
  46. data/lib/sidekiq/web.rb +4 -4
  47. data/lib/sidekiq/worker.rb +118 -19
  48. data/lib/sidekiq.rb +27 -27
  49. data/sidekiq.gemspec +8 -13
  50. data/web/assets/javascripts/application.js +0 -0
  51. data/web/assets/javascripts/dashboard.js +33 -18
  52. data/web/assets/stylesheets/application-rtl.css +246 -0
  53. data/web/assets/stylesheets/application.css +371 -6
  54. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  55. data/web/assets/stylesheets/bootstrap.css +2 -2
  56. data/web/locales/ar.yml +81 -0
  57. data/web/locales/en.yml +2 -0
  58. data/web/locales/es.yml +4 -3
  59. data/web/locales/fa.yml +80 -0
  60. data/web/locales/he.yml +79 -0
  61. data/web/locales/ja.yml +5 -3
  62. data/web/locales/ur.yml +80 -0
  63. data/web/views/_footer.erb +5 -2
  64. data/web/views/_job_info.erb +1 -1
  65. data/web/views/_nav.erb +4 -18
  66. data/web/views/_paging.erb +1 -1
  67. data/web/views/busy.erb +9 -5
  68. data/web/views/dashboard.erb +3 -3
  69. data/web/views/layout.erb +11 -2
  70. data/web/views/morgue.erb +6 -4
  71. data/web/views/queue.erb +11 -10
  72. data/web/views/queues.erb +4 -2
  73. data/web/views/retries.erb +9 -5
  74. data/web/views/retry.erb +1 -1
  75. data/web/views/scheduled.erb +2 -2
  76. metadata +33 -151
  77. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  78. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  79. data/test/config.yml +0 -9
  80. data/test/env_based_config.yml +0 -11
  81. data/test/fake_env.rb +0 -1
  82. data/test/fixtures/en.yml +0 -2
  83. data/test/helper.rb +0 -75
  84. data/test/test_actors.rb +0 -138
  85. data/test/test_api.rb +0 -528
  86. data/test/test_cli.rb +0 -418
  87. data/test/test_client.rb +0 -266
  88. data/test/test_exception_handler.rb +0 -56
  89. data/test/test_extensions.rb +0 -129
  90. data/test/test_fetch.rb +0 -50
  91. data/test/test_launcher.rb +0 -92
  92. data/test/test_logging.rb +0 -35
  93. data/test/test_manager.rb +0 -50
  94. data/test/test_middleware.rb +0 -158
  95. data/test/test_processor.rb +0 -249
  96. data/test/test_rails.rb +0 -22
  97. data/test/test_redis_connection.rb +0 -132
  98. data/test/test_retry.rb +0 -326
  99. data/test/test_retry_exhausted.rb +0 -149
  100. data/test/test_scheduled.rb +0 -115
  101. data/test/test_scheduling.rb +0 -58
  102. data/test/test_sidekiq.rb +0 -107
  103. data/test/test_testing.rb +0 -143
  104. data/test/test_testing_fake.rb +0 -359
  105. data/test/test_testing_inline.rb +0 -94
  106. data/test/test_util.rb +0 -13
  107. data/test/test_web.rb +0 -679
  108. data/test/test_web_helpers.rb +0 -54
@@ -1,249 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'helper'
3
- require 'sidekiq/fetch'
4
- require 'sidekiq/cli'
5
- require 'sidekiq/processor'
6
-
7
- class TestProcessor < Sidekiq::Test
8
- TestException = Class.new(StandardError)
9
- TEST_EXCEPTION = TestException.new("kerboom!")
10
-
11
- describe 'processor' do
12
- before do
13
- $invokes = 0
14
- @mgr = Minitest::Mock.new
15
- @mgr.expect(:options, {:queues => ['default']})
16
- @mgr.expect(:options, {:queues => ['default']})
17
- @processor = ::Sidekiq::Processor.new(@mgr)
18
- end
19
-
20
- class MockWorker
21
- include Sidekiq::Worker
22
- def perform(args)
23
- raise TEST_EXCEPTION if args == 'boom'
24
- args.pop if args.is_a? Array
25
- $invokes += 1
26
- end
27
- end
28
-
29
- def work(msg, queue='queue:default')
30
- Sidekiq::BasicFetch::UnitOfWork.new(queue, msg)
31
- end
32
-
33
- it 'processes as expected' do
34
- msg = Sidekiq.dump_json({ 'class' => MockWorker.to_s, 'args' => ['myarg'] })
35
- @processor.process(work(msg))
36
- assert_equal 1, $invokes
37
- end
38
-
39
- it 'executes a worker as expected' do
40
- worker = Minitest::Mock.new
41
- worker.expect(:perform, nil, [1, 2, 3])
42
- @processor.execute_job(worker, [1, 2, 3])
43
- end
44
-
45
- it 're-raises exceptions after handling' do
46
- msg = Sidekiq.dump_json({ 'class' => MockWorker.to_s, 'args' => ['boom'] })
47
- re_raise = false
48
-
49
- begin
50
- @processor.process(work(msg))
51
- flunk "Expected exception"
52
- rescue TestException
53
- re_raise = true
54
- end
55
-
56
- assert_equal 0, $invokes
57
- assert re_raise, "does not re-raise exceptions after handling"
58
- end
59
-
60
- it 'does not modify original arguments' do
61
- msg = { 'class' => MockWorker.to_s, 'args' => [['myarg']] }
62
- msgstr = Sidekiq.dump_json(msg)
63
- @mgr.expect(:processor_done, nil, [@processor])
64
- @processor.process(work(msgstr))
65
- assert_equal [['myarg']], msg['args']
66
- end
67
-
68
- describe 'exception handling' do
69
- let(:errors) { [] }
70
- let(:error_handler) do
71
- proc do |exception, context|
72
- errors << { exception: exception, context: context }
73
- end
74
- end
75
-
76
- before do
77
- Sidekiq.error_handlers << error_handler
78
- end
79
-
80
- after do
81
- Sidekiq.error_handlers.pop
82
- end
83
-
84
- it 'handles exceptions raised by the job' do
85
- job_hash = { 'class' => MockWorker.to_s, 'args' => ['boom'] }
86
- msg = Sidekiq.dump_json(job_hash)
87
- job = work(msg)
88
- begin
89
- @processor.instance_variable_set(:'@job', job)
90
- @processor.process(job)
91
- rescue TestException
92
- end
93
- assert_equal 1, errors.count
94
- assert_instance_of TestException, errors.first[:exception]
95
- assert_equal msg, errors.first[:context][:jobstr]
96
- assert_equal job_hash, errors.first[:context][:job]
97
- end
98
-
99
- it 'handles exceptions raised by the reloader' do
100
- job_hash = { 'class' => MockWorker.to_s, 'args' => ['boom'] }
101
- msg = Sidekiq.dump_json(job_hash)
102
- @processor.instance_variable_set(:'@reloader', proc { raise TEST_EXCEPTION })
103
- job = work(msg)
104
- begin
105
- @processor.instance_variable_set(:'@job', job)
106
- @processor.process(job)
107
- rescue TestException
108
- end
109
- assert_equal 1, errors.count
110
- assert_instance_of TestException, errors.first[:exception]
111
- assert_equal msg, errors.first[:context][:jobstr]
112
- assert_equal job_hash, errors.first[:context][:job]
113
- end
114
- end
115
-
116
- describe 'acknowledgement' do
117
- class ExceptionRaisingMiddleware
118
- def initialize(raise_before_yield, raise_after_yield, skip)
119
- @raise_before_yield = raise_before_yield
120
- @raise_after_yield = raise_after_yield
121
- @skip = skip
122
- end
123
-
124
- def call(worker, item, queue)
125
- raise TEST_EXCEPTION if @raise_before_yield
126
- yield unless @skip
127
- raise TEST_EXCEPTION if @raise_after_yield
128
- end
129
- end
130
-
131
- let(:raise_before_yield) { false }
132
- let(:raise_after_yield) { false }
133
- let(:skip_job) { false }
134
- let(:worker_args) { ['myarg'] }
135
- let(:work) { MiniTest::Mock.new }
136
-
137
- before do
138
- work.expect(:queue_name, 'queue:default')
139
- work.expect(:job, Sidekiq.dump_json({ 'class' => MockWorker.to_s, 'args' => worker_args }))
140
- Sidekiq.server_middleware do |chain|
141
- chain.prepend ExceptionRaisingMiddleware, raise_before_yield, raise_after_yield, skip_job
142
- end
143
- end
144
-
145
- after do
146
- Sidekiq.server_middleware do |chain|
147
- chain.remove ExceptionRaisingMiddleware
148
- end
149
- work.verify
150
- end
151
-
152
- describe 'middleware throws an exception before processing the work' do
153
- let(:raise_before_yield) { true }
154
-
155
- it 'does not ack' do
156
- begin
157
- @processor.process(work)
158
- flunk "Expected #process to raise exception"
159
- rescue TestException
160
- end
161
- end
162
- end
163
-
164
- describe 'middleware throws an exception after processing the work' do
165
- let(:raise_after_yield) { true }
166
-
167
- it 'acks the job' do
168
- work.expect(:acknowledge, nil)
169
- begin
170
- @processor.process(work)
171
- flunk "Expected #process to raise exception"
172
- rescue TestException
173
- end
174
- end
175
- end
176
-
177
- describe 'middleware decides to skip work' do
178
- let(:skip_job) { true }
179
-
180
- it 'acks the job' do
181
- work.expect(:acknowledge, nil)
182
- @mgr.expect(:processor_done, nil, [@processor])
183
- @processor.process(work)
184
- end
185
- end
186
-
187
- describe 'worker raises an exception' do
188
- let(:worker_args) { ['boom'] }
189
-
190
- it 'acks the job' do
191
- work.expect(:acknowledge, nil)
192
- begin
193
- @processor.process(work)
194
- flunk "Expected #process to raise exception"
195
- rescue TestException
196
- end
197
- end
198
- end
199
-
200
- describe 'everything goes well' do
201
- it 'acks the job' do
202
- work.expect(:acknowledge, nil)
203
- @mgr.expect(:processor_done, nil, [@processor])
204
- @processor.process(work)
205
- end
206
- end
207
- end
208
-
209
- describe 'stats' do
210
- before do
211
- Sidekiq.redis {|c| c.flushdb }
212
- end
213
-
214
- describe 'when successful' do
215
- let(:processed_today_key) { "stat:processed:#{Time.now.utc.strftime("%Y-%m-%d")}" }
216
-
217
- def successful_job
218
- msg = Sidekiq.dump_json({ 'class' => MockWorker.to_s, 'args' => ['myarg'] })
219
- @mgr.expect(:processor_done, nil, [@processor])
220
- @processor.process(work(msg))
221
- end
222
-
223
- it 'increments processed stat' do
224
- Sidekiq::Processor::PROCESSED.value = 0
225
- successful_job
226
- assert_equal 1, Sidekiq::Processor::PROCESSED.value
227
- end
228
- end
229
-
230
- describe 'when failed' do
231
- let(:failed_today_key) { "stat:failed:#{Time.now.utc.strftime("%Y-%m-%d")}" }
232
-
233
- def failed_job
234
- msg = Sidekiq.dump_json({ 'class' => MockWorker.to_s, 'args' => ['boom'] })
235
- begin
236
- @processor.process(work(msg))
237
- rescue TestException
238
- end
239
- end
240
-
241
- it 'increments failed stat' do
242
- Sidekiq::Processor::FAILURE.value = 0
243
- failed_job
244
- assert_equal 1, Sidekiq::Processor::FAILURE.value
245
- end
246
- end
247
- end
248
- end
249
- end
data/test/test_rails.rb DELETED
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'helper'
3
-
4
- $HAS_AJ = true
5
- begin
6
- require 'active_job'
7
- rescue LoadError
8
- $HAS_AJ = false
9
- end
10
-
11
- class TestRails < Sidekiq::Test
12
-
13
- describe 'ActiveJob' do
14
- it 'does not allow Sidekiq::Worker in AJ::Base classes' do
15
- ex = assert_raises ArgumentError do
16
- c = Class.new(ActiveJob::Base)
17
- c.send(:include, Sidekiq::Worker)
18
- end
19
- assert_includes ex.message, "cannot include"
20
- end if $HAS_AJ
21
- end
22
- end
@@ -1,132 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'helper'
3
-
4
- class TestRedisConnection < Sidekiq::Test
5
-
6
- describe ".create" do
7
-
8
- it "creates a pooled redis connection" do
9
- pool = Sidekiq::RedisConnection.create
10
- assert_equal Redis, pool.checkout.class
11
- end
12
-
13
- describe "network_timeout" do
14
- it "sets a custom network_timeout if specified" do
15
- pool = Sidekiq::RedisConnection.create(:network_timeout => 8)
16
- redis = pool.checkout
17
-
18
- assert_equal 8, redis.client.timeout
19
- end
20
-
21
- it "uses the default network_timeout if none specified" do
22
- pool = Sidekiq::RedisConnection.create
23
- redis = pool.checkout
24
-
25
- assert_equal 5, redis.client.timeout
26
- end
27
- end
28
-
29
- describe "namespace" do
30
- it "uses a given :namespace set by a symbol key" do
31
- pool = Sidekiq::RedisConnection.create(:namespace => "xxx")
32
- assert_equal "xxx", pool.checkout.namespace
33
- end
34
-
35
- it "uses a given :namespace set by a string key" do
36
- pool = Sidekiq::RedisConnection.create("namespace" => "xxx")
37
- assert_equal "xxx", pool.checkout.namespace
38
- end
39
-
40
- it "uses given :namespace over :namespace from Sidekiq.options" do
41
- Sidekiq.options[:namespace] = "xxx"
42
- pool = Sidekiq::RedisConnection.create(:namespace => "yyy")
43
- assert_equal "yyy", pool.checkout.namespace
44
- end
45
- end
46
-
47
- describe "socket path" do
48
- it "uses a given :path" do
49
- pool = Sidekiq::RedisConnection.create(:path => "/var/run/redis.sock")
50
- assert_equal "unix", pool.checkout.client.scheme
51
- assert_equal "redis:///var/run/redis.sock/0", pool.checkout.client.id
52
- end
53
-
54
- it "uses a given :path and :db" do
55
- pool = Sidekiq::RedisConnection.create(:path => "/var/run/redis.sock", :db => 8)
56
- assert_equal "unix", pool.checkout.client.scheme
57
- assert_equal "redis:///var/run/redis.sock/8", pool.checkout.client.id
58
- end
59
- end
60
-
61
- describe "pool_timeout" do
62
- it "uses a given :timeout over the default of 1" do
63
- pool = Sidekiq::RedisConnection.create(:pool_timeout => 5)
64
-
65
- assert_equal 5, pool.instance_eval{ @timeout }
66
- end
67
-
68
- it "uses the default timeout of 1 if no override" do
69
- pool = Sidekiq::RedisConnection.create
70
-
71
- assert_equal 1, pool.instance_eval{ @timeout }
72
- end
73
- end
74
- end
75
-
76
- describe ".determine_redis_provider" do
77
-
78
- before do
79
- @old_env = ENV.to_hash
80
- end
81
-
82
- after do
83
- ENV.update(@old_env)
84
- end
85
-
86
- def with_env_var(var, uri, skip_provider=false)
87
- vars = ['REDISTOGO_URL', 'REDIS_PROVIDER', 'REDIS_URL'] - [var]
88
- vars.each do |v|
89
- next if skip_provider
90
- ENV[v] = nil
91
- end
92
- ENV[var] = uri
93
- assert_equal uri, Sidekiq::RedisConnection.__send__(:determine_redis_provider)
94
- ENV[var] = nil
95
- end
96
-
97
- describe "with REDISTOGO_URL and a parallel REDIS_PROVIDER set" do
98
- it "sets connection URI to the provider" do
99
- uri = 'redis://sidekiq-redis-provider:6379/0'
100
- provider = 'SIDEKIQ_REDIS_PROVIDER'
101
-
102
- ENV['REDIS_PROVIDER'] = provider
103
- ENV[provider] = uri
104
- ENV['REDISTOGO_URL'] = 'redis://redis-to-go:6379/0'
105
- with_env_var provider, uri, true
106
-
107
- ENV[provider] = nil
108
- end
109
- end
110
-
111
- describe "with REDIS_PROVIDER set" do
112
- it "sets connection URI to the provider" do
113
- uri = 'redis://sidekiq-redis-provider:6379/0'
114
- provider = 'SIDEKIQ_REDIS_PROVIDER'
115
-
116
- ENV['REDIS_PROVIDER'] = provider
117
- ENV[provider] = uri
118
-
119
- with_env_var provider, uri, true
120
-
121
- ENV[provider] = nil
122
- end
123
- end
124
-
125
- describe "with REDIS_URL set" do
126
- it "sets connection URI to custom uri" do
127
- with_env_var 'REDIS_URL', 'redis://redis-uri:6379/0'
128
- end
129
- end
130
-
131
- end
132
- end