sidekiq-unique-jobs 5.0.0 → 5.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq-unique-jobs might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -31
- data/.editorconfig +2 -2
- data/.rubocop.yml +1 -1
- data/.travis.yml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +2 -6
- data/lib/sidekiq-unique-jobs.rb +5 -1
- data/lib/sidekiq/simulator.rb +3 -4
- data/lib/sidekiq_unique_jobs/cli.rb +27 -5
- data/lib/sidekiq_unique_jobs/lock/until_executed.rb +6 -14
- data/lib/sidekiq_unique_jobs/scripts.rb +8 -6
- data/lib/sidekiq_unique_jobs/scripts/acquire_lock.rb +45 -0
- data/lib/sidekiq_unique_jobs/scripts/release_lock.rb +47 -0
- data/lib/sidekiq_unique_jobs/testing.rb +1 -1
- data/lib/sidekiq_unique_jobs/unique_args.rb +3 -3
- data/lib/sidekiq_unique_jobs/unlockable.rb +4 -18
- data/lib/sidekiq_unique_jobs/util.rb +21 -2
- data/lib/sidekiq_unique_jobs/version.rb +1 -1
- data/rails_example/.env +1 -1
- data/rails_example/Gemfile +1 -0
- data/rails_example/Procfile +1 -1
- data/rails_example/app/workers/simple_worker.rb +1 -1
- data/rails_example/app/workers/slow_until_executing_worker.rb +1 -1
- data/rails_example/app/workers/spawn_simple_worker.rb +1 -1
- data/rails_example/app/workers/while_executing_worker.rb +12 -0
- data/rails_example/app/workers/without_argument_worker.rb +1 -1
- data/sidekiq-unique-jobs.gemspec +1 -0
- data/spec/jobs/another_unique_job.rb +1 -1
- data/spec/jobs/my_job.rb +1 -1
- data/spec/jobs/unique_job_with_filter_method.rb +1 -1
- data/spec/jobs/unique_on_all_queues_job.rb +1 -1
- data/spec/jobs/until_executed_job.rb +1 -1
- data/spec/jobs/while_executing_job.rb +1 -1
- data/spec/lib/sidekiq_unique_jobs/cli_spec.rb +183 -0
- data/spec/lib/sidekiq_unique_jobs/client/middleware_spec.rb +1 -9
- data/spec/lib/sidekiq_unique_jobs/lock/until_and_while_executing_spec.rb +0 -2
- data/spec/lib/sidekiq_unique_jobs/script_mock_spec.rb +1 -3
- data/spec/lib/sidekiq_unique_jobs/scripts/acquire_lock_spec.rb +50 -0
- data/spec/lib/sidekiq_unique_jobs/scripts/release_lock_spec.rb +41 -0
- data/spec/lib/sidekiq_unique_jobs/scripts_spec.rb +4 -8
- data/spec/lib/sidekiq_unique_jobs/server/middleware_spec.rb +0 -5
- data/spec/lib/sidekiq_unique_jobs/sidekiq_testing_enabled_spec.rb +0 -19
- data/spec/lib/sidekiq_unique_jobs/sidekiq_unique_ext_spec.rb +0 -5
- data/spec/lib/sidekiq_unique_jobs/unlockable_spec.rb +0 -1
- data/spec/lib/sidekiq_unique_jobs/util_spec.rb +54 -26
- data/spec/spec_helper.rb +40 -2
- data/spec/support/matchers/redis_matchers.rb +16 -6
- metadata +22 -2
@@ -6,10 +6,6 @@ RSpec.describe SidekiqUniqueJobs::Scripts do
|
|
6
6
|
ANOTHER_JID ||= 'anotherjid'.freeze
|
7
7
|
|
8
8
|
context 'class methods' do
|
9
|
-
before do
|
10
|
-
Sidekiq.redis(&:flushdb)
|
11
|
-
Sidekiq::Worker.clear_all
|
12
|
-
end
|
13
9
|
subject { SidekiqUniqueJobs::Scripts }
|
14
10
|
|
15
11
|
it { is_expected.to respond_to(:call).with(3).arguments }
|
@@ -34,12 +30,12 @@ RSpec.describe SidekiqUniqueJobs::Scripts do
|
|
34
30
|
context 'when job is unique' do
|
35
31
|
specify { expect(lock_for).to eq(1) }
|
36
32
|
specify do
|
37
|
-
expect(lock_for(
|
38
|
-
expect(
|
33
|
+
expect(lock_for(2)).to eq(1)
|
34
|
+
expect(SidekiqUniqueJobs)
|
39
35
|
.to have_key(UNIQUE_KEY)
|
40
36
|
.for_seconds(1)
|
41
|
-
.with_value(
|
42
|
-
sleep
|
37
|
+
.with_value(JID)
|
38
|
+
sleep 2
|
43
39
|
expect(lock_for).to eq(1)
|
44
40
|
end
|
45
41
|
|
@@ -11,11 +11,6 @@ RSpec.describe SidekiqUniqueJobs::Server::Middleware do
|
|
11
11
|
SidekiqUniqueJobs::UniqueArgs.digest(item)
|
12
12
|
end
|
13
13
|
|
14
|
-
before do
|
15
|
-
Sidekiq.redis = REDIS
|
16
|
-
Sidekiq.redis(&:flushdb)
|
17
|
-
end
|
18
|
-
|
19
14
|
describe '#call' do
|
20
15
|
context 'when unique is disabled' do
|
21
16
|
it 'does not use locking' do
|
@@ -5,25 +5,6 @@ require 'sidekiq/scheduled'
|
|
5
5
|
|
6
6
|
RSpec.describe 'When Sidekiq::Testing is enabled' do
|
7
7
|
describe 'when set to :fake!', sidekiq: :fake do
|
8
|
-
before do
|
9
|
-
SidekiqUniqueJobs.configure do |config|
|
10
|
-
config.redis_test_mode = :redis
|
11
|
-
end
|
12
|
-
Sidekiq.redis = REDIS
|
13
|
-
Sidekiq.redis(&:flushdb)
|
14
|
-
Sidekiq::Worker.clear_all
|
15
|
-
if Sidekiq::Testing.respond_to?(:server_middleware)
|
16
|
-
Sidekiq::Testing.server_middleware do |chain|
|
17
|
-
chain.add SidekiqUniqueJobs::Server::Middleware
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
after do
|
23
|
-
Sidekiq.redis(&:flushdb)
|
24
|
-
Sidekiq::Testing.server_middleware(&:clear) if Sidekiq::Testing.respond_to?(:server_middleware)
|
25
|
-
end
|
26
|
-
|
27
8
|
context 'with unique worker' do
|
28
9
|
it 'does not push duplicate messages' do
|
29
10
|
param = 'work'
|
@@ -6,11 +6,6 @@ require 'sidekiq_unique_jobs/client/middleware'
|
|
6
6
|
require 'sidekiq_unique_jobs/sidekiq_unique_ext'
|
7
7
|
|
8
8
|
RSpec.describe 'Sidekiq::Api' do
|
9
|
-
before do
|
10
|
-
Sidekiq.redis = REDIS
|
11
|
-
Sidekiq.redis(&:flushdb)
|
12
|
-
end
|
13
|
-
|
14
9
|
let(:item) do
|
15
10
|
{ 'class' => JustAWorker,
|
16
11
|
'queue' => 'testqueue',
|
@@ -1,47 +1,62 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe SidekiqUniqueJobs::Util do
|
4
|
-
let(:
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
let(:job) do
|
5
|
+
{
|
6
|
+
'class' => 'MyUniqueJob',
|
7
|
+
'args' => [[1, 2]],
|
8
|
+
'at' => 1_492_341_850.358196,
|
9
|
+
'retry' => true,
|
10
|
+
'queue' => 'customqueue',
|
11
|
+
'unique' => :until_executed,
|
12
|
+
'unique_expiration' => 7200,
|
13
|
+
'retry_count' => 10,
|
14
|
+
'jid' => jid,
|
15
|
+
'created_at' => 1_492_341_790.358217,
|
16
|
+
}
|
11
17
|
end
|
18
|
+
let(:unique_args) { SidekiqUniqueJobs::UniqueArgs.new(job) }
|
19
|
+
let(:unique_key) { unique_args.unique_digest }
|
20
|
+
let(:jid) { 'e3049b05b0bd9c809182bbe0' }
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
Sidekiq.redis(&:flushdb)
|
22
|
+
def acquire_lock
|
23
|
+
SidekiqUniqueJobs::Scripts::AcquireLock.execute(nil, unique_key, jid, 1)
|
16
24
|
end
|
17
25
|
|
18
26
|
describe '.keys' do
|
19
27
|
end
|
20
28
|
|
21
29
|
describe '.del' do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
30
|
+
before do
|
31
|
+
acquire_lock
|
32
|
+
end
|
26
33
|
|
27
|
-
|
28
|
-
|
29
|
-
|
34
|
+
it 'deletes the keys by pattern' do
|
35
|
+
expect(described_class.del(described_class::SCAN_PATTERN, 100, false)).to eq(1)
|
36
|
+
end
|
30
37
|
|
31
|
-
|
32
|
-
|
33
|
-
end
|
38
|
+
it 'deletes the keys by distinct key' do
|
39
|
+
expect(described_class.del(unique_key, 100, false)).to eq(1)
|
34
40
|
end
|
35
41
|
end
|
36
42
|
|
37
|
-
describe '.
|
38
|
-
|
39
|
-
|
40
|
-
allow(SidekiqUniqueJobs.config).to receive(:unique_prefix).and_return(nil)
|
41
|
-
expect(described_class.prefix('key')).to eq('key')
|
42
|
-
end
|
43
|
+
describe '.expire' do
|
44
|
+
before do
|
45
|
+
acquire_lock
|
43
46
|
end
|
44
47
|
|
48
|
+
it 'does some shit' do
|
49
|
+
sleep 1
|
50
|
+
expected = { jid => unique_key }
|
51
|
+
expect(described_class.unique_hash).to match(expected)
|
52
|
+
removed_keys = described_class.expire
|
53
|
+
expect(removed_keys).to match(expected)
|
54
|
+
expect(described_class.unique_hash).not_to match(expected)
|
55
|
+
expect(described_class.keys('*')).not_to include(unique_key)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '.prefix' do
|
45
60
|
before do
|
46
61
|
allow(SidekiqUniqueJobs.config).to receive(:unique_prefix).and_return('test-uniqueness')
|
47
62
|
end
|
@@ -49,5 +64,18 @@ RSpec.describe SidekiqUniqueJobs::Util do
|
|
49
64
|
it 'returns a prefixed key' do
|
50
65
|
expect(described_class.prefix('key')).to eq('test-uniqueness:key')
|
51
66
|
end
|
67
|
+
|
68
|
+
context 'when .unique_prefix is nil?' do
|
69
|
+
it 'does not prefix with unique_prefix' do
|
70
|
+
allow(SidekiqUniqueJobs.config).to receive(:unique_prefix).and_return(nil)
|
71
|
+
expect(described_class.prefix('key')).to eq('key')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when key is already prefixed' do
|
76
|
+
it 'does not add another prefix' do
|
77
|
+
expect(described_class.prefix('test-uniqueness:key')).to eq('test-uniqueness:key')
|
78
|
+
end
|
79
|
+
end
|
52
80
|
end
|
53
81
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -20,7 +20,7 @@ require 'sidekiq_unique_jobs/testing'
|
|
20
20
|
require 'sidekiq/simulator'
|
21
21
|
|
22
22
|
Sidekiq::Testing.disable!
|
23
|
-
|
23
|
+
SidekiqUniqueJobs.logger.level = "Logger::#{ENV.fetch('LOGLEVEL') { 'error' }.upcase}".constantize
|
24
24
|
|
25
25
|
require 'sidekiq/redis_connection'
|
26
26
|
|
@@ -35,7 +35,8 @@ Sidekiq.configure_client do |config|
|
|
35
35
|
end
|
36
36
|
|
37
37
|
Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].each { |f| require f }
|
38
|
-
|
38
|
+
|
39
|
+
RSpec.configure do |config| # rubocop:disable BlockLength
|
39
40
|
config.expect_with :rspec do |expectations|
|
40
41
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
41
42
|
end
|
@@ -49,6 +50,43 @@ RSpec.configure do |config|
|
|
49
50
|
config.default_formatter = 'doc' if config.files_to_run.one?
|
50
51
|
config.order = :random
|
51
52
|
Kernel.srand config.seed
|
53
|
+
|
54
|
+
config.before(:each) do
|
55
|
+
SidekiqUniqueJobs.configure do |unique_config|
|
56
|
+
unique_config.redis_test_mode = :redis
|
57
|
+
end
|
58
|
+
Sidekiq.redis = REDIS
|
59
|
+
Sidekiq.redis(&:flushdb)
|
60
|
+
Sidekiq::Worker.clear_all
|
61
|
+
Sidekiq::Queues.clear_all
|
62
|
+
|
63
|
+
if Sidekiq::Testing.respond_to?(:server_middleware)
|
64
|
+
Sidekiq::Testing.server_middleware do |chain|
|
65
|
+
chain.add SidekiqUniqueJobs::Server::Middleware
|
66
|
+
end
|
67
|
+
end
|
68
|
+
enable_delay = defined?(Sidekiq::Extensions) && Sidekiq::Extensions.respond_to?(:enable_delay!)
|
69
|
+
Sidekiq::Extensions.enable_delay! if enable_delay
|
70
|
+
end
|
71
|
+
|
72
|
+
config.after(:each) do
|
73
|
+
Sidekiq.redis(&:flushdb)
|
74
|
+
respond_to_middleware = defined?(Sidekiq::Testing) && Sidekiq::Testing.respond_to?(:server_middleware)
|
75
|
+
Sidekiq::Testing.server_middleware(&:clear) if respond_to_middleware
|
76
|
+
end
|
52
77
|
end
|
53
78
|
|
54
79
|
Dir[File.join(File.dirname(__FILE__), 'jobs', '**', '*.rb')].each { |f| require f }
|
80
|
+
|
81
|
+
def capture(stream)
|
82
|
+
begin
|
83
|
+
stream = stream.to_s
|
84
|
+
eval "$#{stream} = StringIO.new" # rubocop:disable Security/Eval
|
85
|
+
yield
|
86
|
+
result = eval("$#{stream}").string # rubocop:disable Security/Eval
|
87
|
+
ensure
|
88
|
+
eval("$#{stream} = #{stream.upcase}") # rubocop:disable Security/Eval
|
89
|
+
end
|
90
|
+
|
91
|
+
result
|
92
|
+
end
|
@@ -2,18 +2,28 @@ require 'rspec/expectations'
|
|
2
2
|
|
3
3
|
RSpec::Matchers.define :have_key do |unique_key|
|
4
4
|
Sidekiq.redis do |redis|
|
5
|
-
match do |
|
6
|
-
|
5
|
+
match do |_unique_jobs|
|
6
|
+
@value = redis.get(unique_key)
|
7
|
+
@ttl = redis.ttl(unique_key)
|
8
|
+
|
9
|
+
@value && with_value && for_seconds
|
7
10
|
end
|
8
11
|
|
9
12
|
chain :with_value do |value = nil|
|
10
|
-
value
|
11
|
-
|
13
|
+
@expected_value = value
|
14
|
+
@expected_value && @value == @expected_value
|
12
15
|
end
|
13
16
|
|
14
17
|
chain :for_seconds do |ttl = nil|
|
15
|
-
ttl
|
16
|
-
|
18
|
+
@expected_ttl = ttl
|
19
|
+
@expected_ttl && @ttl == @expected_ttl
|
20
|
+
end
|
21
|
+
|
22
|
+
failure_message do |_actual|
|
23
|
+
msg = "expected Redis to have key #{unique_key}"
|
24
|
+
msg << " with value #{@expected_value} was (#{@value})" if @expected_value
|
25
|
+
msg << " with value #{@expected_ttl} was (#{@ttl})" if @expected_ttl
|
26
|
+
msg
|
17
27
|
end
|
18
28
|
end
|
19
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-unique-jobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikael Henriksson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: aruba
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: codeclimate-test-reporter
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,6 +189,8 @@ files:
|
|
175
189
|
- lib/sidekiq_unique_jobs/run_lock_failed.rb
|
176
190
|
- lib/sidekiq_unique_jobs/script_mock.rb
|
177
191
|
- lib/sidekiq_unique_jobs/scripts.rb
|
192
|
+
- lib/sidekiq_unique_jobs/scripts/acquire_lock.rb
|
193
|
+
- lib/sidekiq_unique_jobs/scripts/release_lock.rb
|
178
194
|
- lib/sidekiq_unique_jobs/server/middleware.rb
|
179
195
|
- lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb
|
180
196
|
- lib/sidekiq_unique_jobs/testing.rb
|
@@ -213,6 +229,7 @@ files:
|
|
213
229
|
- rails_example/app/workers/simple_worker.rb
|
214
230
|
- rails_example/app/workers/slow_until_executing_worker.rb
|
215
231
|
- rails_example/app/workers/spawn_simple_worker.rb
|
232
|
+
- rails_example/app/workers/while_executing_worker.rb
|
216
233
|
- rails_example/app/workers/without_argument_worker.rb
|
217
234
|
- rails_example/bin/bundle
|
218
235
|
- rails_example/bin/check_or_setup_db
|
@@ -307,6 +324,7 @@ files:
|
|
307
324
|
- spec/jobs/until_timeout_job.rb
|
308
325
|
- spec/jobs/while_executing_job.rb
|
309
326
|
- spec/jobs/without_argument_job.rb
|
327
|
+
- spec/lib/sidekiq_unique_jobs/cli_spec.rb
|
310
328
|
- spec/lib/sidekiq_unique_jobs/client/middleware_spec.rb
|
311
329
|
- spec/lib/sidekiq_unique_jobs/config_spec.rb
|
312
330
|
- spec/lib/sidekiq_unique_jobs/core_ext_spec.rb
|
@@ -319,6 +337,8 @@ files:
|
|
319
337
|
- spec/lib/sidekiq_unique_jobs/queue_lock_timeout_calculator_spec.rb
|
320
338
|
- spec/lib/sidekiq_unique_jobs/run_lock_timeout_calculator_spec.rb
|
321
339
|
- spec/lib/sidekiq_unique_jobs/script_mock_spec.rb
|
340
|
+
- spec/lib/sidekiq_unique_jobs/scripts/acquire_lock_spec.rb
|
341
|
+
- spec/lib/sidekiq_unique_jobs/scripts/release_lock_spec.rb
|
322
342
|
- spec/lib/sidekiq_unique_jobs/scripts_spec.rb
|
323
343
|
- spec/lib/sidekiq_unique_jobs/server/middleware_spec.rb
|
324
344
|
- spec/lib/sidekiq_unique_jobs/sidekiq_testing_enabled_spec.rb
|