sidekiq-lock 0.3.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -1
- data/README.md +40 -10
- data/lib/sidekiq/lock/container.rb +15 -0
- data/lib/sidekiq/lock/middleware.rb +2 -2
- data/lib/sidekiq/lock/redis_lock.rb +28 -8
- data/lib/sidekiq/lock/testing/inline.rb +2 -2
- data/lib/sidekiq/lock/version.rb +1 -1
- data/lib/sidekiq/lock/worker.rb +1 -1
- data/lib/sidekiq/lock.rb +11 -1
- data/test/lib/container_test.rb +23 -0
- data/test/lib/lock_test.rb +1 -1
- data/test/lib/middleware_test.rb +16 -11
- data/test/lib/redis_lock_test.rb +31 -14
- data/test/lib/testing/inline_test.rb +9 -6
- data/test/lib/worker_test.rb +49 -11
- data/test/test_helper.rb +10 -10
- metadata +9 -44
- data/.gitignore +0 -21
- data/.travis.yml +0 -20
- data/Appraisals +0 -15
- data/Gemfile +0 -2
- data/gemfiles/sidekiq_2.gemfile +0 -7
- data/gemfiles/sidekiq_3.gemfile +0 -7
- data/gemfiles/sidekiq_4.gemfile +0 -7
- data/gemfiles/sidekiq_5.gemfile +0 -7
- data/sidekiq-lock.gemspec +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94c0d6993d3e6f8c2acd6a63e2e78464ac974369138f6c20eeb91525d0b5ea13
|
4
|
+
data.tar.gz: 75437ca38c53bc825d0e6e77b8dc2ef64c5c42bb8802746f5fbacf1f91c9e4f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 463adf7d4dbf5d468a1c795105a716d94fd6f77141e7c7f3d77a84076e4e222cc2b6fb57f64d5286bca6fc8b9491c4de891190fb3d255f1766acd879253220d0
|
7
|
+
data.tar.gz: c215cce1d79e99aaa28a04a5238aac165a8e5d36271a372b39067a80040109e5f64117114fdbfae227c5cb406f86cd46e554cfa6820978573abd1f08b04ada6d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## 0.6.0 (May 27, 2023)
|
2
|
+
|
3
|
+
- support for Sidekiq 7 (thanks to [@stympy](https://github.com/stympy))
|
4
|
+
- move CI pipelines to Github Actions - drop tests for everything below Sidekiq 5, run tests on redis 6.2 & 7.0 and ruby 2.6 - 3.1
|
5
|
+
|
6
|
+
## 0.5.0 (August 13, 2021)
|
7
|
+
|
8
|
+
- maintenance - test on latest ruby versions (remove outdated rubies from build), add sidekiq 6 to build matrix, remove coveralls
|
9
|
+
- fix for ruby 3 (thanks to [@ak15](https://github.com/ak15))
|
10
|
+
|
11
|
+
## 0.4.0 (July 18, 2018)
|
12
|
+
|
13
|
+
- make lock container configurable (non breaking change) - in case you would like to something else than `Thread.current` - now you easily can
|
14
|
+
|
1
15
|
## 0.3.1 (March 3, 2018)
|
2
16
|
|
3
17
|
- do not assume `ActiveSupport` is loaded / or old `Sidekiq` patches are present (add own symbolize keys logic)
|
@@ -6,7 +20,7 @@
|
|
6
20
|
|
7
21
|
## 0.3.0 (July 28, 2016)
|
8
22
|
|
9
|
-
- ability to set custom lock value. Works just like setting timeout and name
|
23
|
+
- ability to set custom lock value. Works just like setting timeout and name, handles procs as well (thanks to [@piokaczm](https://github.com/piokaczm))
|
10
24
|
|
11
25
|
``` ruby
|
12
26
|
sidekiq_options lock: {
|
data/README.md
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
+
<p align="center">
|
2
|
+
<img width="300" height="210" src="https://github.com/rwojsznis/sidekiq-lock/raw/main/logo.png">
|
3
|
+
</p>
|
4
|
+
|
1
5
|
# Sidekiq::Lock
|
2
6
|
|
3
|
-
[![Code Climate](https://codeclimate.com/github/
|
4
|
-
[![Build Status](https://travis-ci.org/emq/sidekiq-lock.png?branch=master)](https://travis-ci.org/emq/sidekiq-lock)
|
5
|
-
[![Coverage Status](https://coveralls.io/repos/emq/sidekiq-lock/badge.png)](https://coveralls.io/r/emq/sidekiq-lock)
|
6
|
-
[![Dependency Status](https://gemnasium.com/emq/sidekiq-lock.png)](https://gemnasium.com/emq/sidekiq-lock)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/rwojsznis/sidekiq-lock.png)](https://codeclimate.com/github/rwojsznis/sidekiq-lock)
|
7
8
|
[![Gem Version](https://badge.fury.io/rb/sidekiq-lock.png)](http://badge.fury.io/rb/sidekiq-lock)
|
8
9
|
|
9
10
|
**Note:** This is a _complete_ piece of software, it should work across all future sidekiq & ruby versions.
|
10
11
|
|
11
12
|
Redis-based simple locking mechanism for [sidekiq][2]. Uses [SET command][1] introduced in Redis 2.6.16.
|
12
13
|
|
13
|
-
It can be handy if you push a lot of jobs into the queue(s), but you don't want to execute specific jobs at the same
|
14
|
+
It can be handy if you push a lot of jobs into the queue(s), but you don't want to execute specific jobs at the same
|
15
|
+
time - it provides a `lock` method that you can use in whatever way you want.
|
14
16
|
|
15
17
|
## Installation
|
16
18
|
|
@@ -34,7 +36,8 @@ $ bundle
|
|
34
36
|
|
35
37
|
Sidekiq-lock is a middleware/module combination, let me go through my thought process here :).
|
36
38
|
|
37
|
-
In your worker class include `Sidekiq::Lock::Worker` module and provide `lock` attribute inside `sidekiq_options`,
|
39
|
+
In your worker class include `Sidekiq::Lock::Worker` module and provide `lock` attribute inside `sidekiq_options`,
|
40
|
+
for example:
|
38
41
|
|
39
42
|
``` ruby
|
40
43
|
class Worker
|
@@ -52,13 +55,17 @@ end
|
|
52
55
|
|
53
56
|
What will happen is:
|
54
57
|
|
55
|
-
- middleware will setup a `Sidekiq::Lock::RedisLock` object under `Thread.current[Sidekiq::Lock::THREAD_KEY]`
|
58
|
+
- middleware will setup a `Sidekiq::Lock::RedisLock` object under `Thread.current[Sidekiq::Lock::THREAD_KEY]`
|
59
|
+
(it should work in most use cases without any problems - but it's configurable, more below) - assuming you provided
|
60
|
+
`lock` options, otherwise it will do nothing, just execute your worker's code
|
56
61
|
|
57
|
-
- `Sidekiq::Lock::Worker` module provides a `lock` method that just simply points to that thread variable, just as
|
62
|
+
- `Sidekiq::Lock::Worker` module provides a `lock` method that just simply points to that thread variable, just as
|
63
|
+
a convenience
|
58
64
|
|
59
65
|
So now in your worker class you can call (whenever you need):
|
60
66
|
|
61
|
-
- `lock.acquire!` - will try to acquire the lock, if returns false on failure (that means some other process / thread
|
67
|
+
- `lock.acquire!` - will try to acquire the lock, if returns false on failure (that means some other process / thread
|
68
|
+
took the lock first)
|
62
69
|
- `lock.acquired?` - set to `true` when lock is successfully acquired
|
63
70
|
- `lock.release!` - deletes the lock (only if it's: acquired by current thread and not already expired)
|
64
71
|
|
@@ -115,9 +122,32 @@ Sidekiq.configure_server do |config|
|
|
115
122
|
end
|
116
123
|
```
|
117
124
|
|
125
|
+
### Customizing lock _container_
|
126
|
+
|
127
|
+
If you would like to change default behavior of storing lock instance in `Thread.current` for whatever reason you
|
128
|
+
can do that as well via server configuration:
|
129
|
+
|
130
|
+
``` ruby
|
131
|
+
# Any thread-safe class that implements .fetch and .store methods will do
|
132
|
+
class CustomStorage
|
133
|
+
def fetch
|
134
|
+
# returns stored lock instance
|
135
|
+
end
|
136
|
+
|
137
|
+
def store(lock_instance)
|
138
|
+
# store lock
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
Sidekiq.configure_server do |config|
|
143
|
+
config.lock_container = CustomStorage.new
|
144
|
+
end
|
145
|
+
```
|
146
|
+
|
118
147
|
### Inline testing
|
119
148
|
|
120
|
-
As you know middleware is not invoked when testing jobs inline, you can require in your test/spec helper file
|
149
|
+
As you know middleware is not invoked when testing jobs inline, you can require in your test/spec helper file
|
150
|
+
`sidekiq/lock/testing/inline` to include two methods that will help you setting / clearing up lock manually:
|
121
151
|
|
122
152
|
- `set_sidekiq_lock(worker_class, payload)` - note: payload should be an array of worker arguments
|
123
153
|
- `clear_sidekiq_lock`
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Sidekiq
|
2
2
|
module Lock
|
3
3
|
class Middleware
|
4
|
-
def call(worker, msg,
|
4
|
+
def call(worker, msg, _queue)
|
5
5
|
options = lock_options(worker)
|
6
6
|
setup_lock(options, msg['args']) unless options.nil?
|
7
7
|
|
@@ -11,7 +11,7 @@ module Sidekiq
|
|
11
11
|
private
|
12
12
|
|
13
13
|
def setup_lock(options, payload)
|
14
|
-
|
14
|
+
Sidekiq.lock_container.store(RedisLock.new(options, payload))
|
15
15
|
end
|
16
16
|
|
17
17
|
def lock_options(worker)
|
@@ -23,18 +23,17 @@ module Sidekiq
|
|
23
23
|
# this also requires redis-rb >= 3.0.5
|
24
24
|
def acquire!
|
25
25
|
@acquired ||= Sidekiq.redis do |r|
|
26
|
-
r.set(name, value,
|
26
|
+
r.set(name, value, nx: true, px: timeout)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
def release!
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
31
|
+
# even if lock expired / was take over by another process
|
32
|
+
# it still means from our perspective that we released it
|
33
|
+
@acquired = false
|
34
|
+
|
35
|
+
# https://redis.io/commands/del/#return
|
36
|
+
release_lock == 1
|
38
37
|
end
|
39
38
|
|
40
39
|
def name
|
@@ -53,6 +52,27 @@ module Sidekiq
|
|
53
52
|
|
54
53
|
attr_reader :options, :payload
|
55
54
|
|
55
|
+
def release_lock
|
56
|
+
# Sidekiq 7 uses redis-client gem, designed for redis 6+
|
57
|
+
if Sidekiq::VERSION >= '7'
|
58
|
+
Sidekiq.redis do |r|
|
59
|
+
begin
|
60
|
+
r.evalsha redis_lock_script_sha, [name], [value]
|
61
|
+
rescue RedisClient::CommandError
|
62
|
+
r.eval redis_lock_script, 1, [name], [value]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
else
|
66
|
+
Sidekiq.redis do |r|
|
67
|
+
begin
|
68
|
+
r.evalsha redis_lock_script_sha, keys: [name], argv: [value]
|
69
|
+
rescue Redis::CommandError
|
70
|
+
r.eval redis_lock_script, keys: [name], argv: [value]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
56
76
|
def redis_lock_script_sha
|
57
77
|
@lock_script_sha ||= Digest::SHA1.hexdigest redis_lock_script
|
58
78
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
def set_sidekiq_lock(worker_class, payload)
|
2
2
|
options = worker_class.get_sidekiq_options['lock']
|
3
|
-
|
3
|
+
Sidekiq.lock_container.store(Sidekiq::Lock::RedisLock.new(options, payload))
|
4
4
|
end
|
5
5
|
|
6
6
|
def clear_sidekiq_lock
|
7
|
-
|
7
|
+
Sidekiq.lock_container.store(nil)
|
8
8
|
end
|
data/lib/sidekiq/lock/version.rb
CHANGED
data/lib/sidekiq/lock/worker.rb
CHANGED
data/lib/sidekiq/lock.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
|
+
require 'sidekiq/lock/container'
|
1
2
|
require 'sidekiq/lock/middleware'
|
2
3
|
require 'sidekiq/lock/redis_lock'
|
3
4
|
require 'sidekiq/lock/version'
|
4
5
|
require 'sidekiq/lock/worker'
|
5
6
|
|
6
7
|
module Sidekiq
|
8
|
+
def self.lock_container
|
9
|
+
@lock_container ||= Lock::Container.new
|
10
|
+
end
|
11
|
+
|
7
12
|
def self.lock_method
|
8
|
-
@lock_method ||=
|
13
|
+
@lock_method ||= Lock::METHOD_NAME
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.lock_container=(container)
|
17
|
+
@lock_container = container
|
9
18
|
end
|
10
19
|
|
11
20
|
def self.lock_method=(method)
|
@@ -14,6 +23,7 @@ module Sidekiq
|
|
14
23
|
|
15
24
|
module Lock
|
16
25
|
THREAD_KEY = :sidekiq_lock
|
26
|
+
METHOD_NAME = :lock
|
17
27
|
end
|
18
28
|
end
|
19
29
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module Sidekiq
|
5
|
+
module Lock
|
6
|
+
describe Container do
|
7
|
+
it 'stores and fetches given value under Thread.current' do
|
8
|
+
begin
|
9
|
+
container = Sidekiq::Lock::Container.new
|
10
|
+
thread_key = Sidekiq::Lock::Container::THREAD_KEY
|
11
|
+
|
12
|
+
Thread.current[thread_key] = 'value'
|
13
|
+
assert_equal 'value', container.fetch
|
14
|
+
|
15
|
+
container.store 'new-value'
|
16
|
+
assert_equal Thread.current[thread_key], 'new-value'
|
17
|
+
ensure
|
18
|
+
Thread.current[thread_key] = nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/test/lib/lock_test.rb
CHANGED
@@ -4,7 +4,7 @@ require 'open3'
|
|
4
4
|
module Sidekiq
|
5
5
|
describe Lock do
|
6
6
|
it 'automatically loads lock middleware for sidekiq server' do
|
7
|
-
skip 'Sidekiq
|
7
|
+
skip 'Sidekiq 7+ does not print out middleware information' if Sidekiq::VERSION >= '7'
|
8
8
|
|
9
9
|
cmd = 'sidekiq -r ./test/test_workers.rb -v'
|
10
10
|
buffer = ''
|
data/test/lib/middleware_test.rb
CHANGED
@@ -4,38 +4,43 @@ module Sidekiq
|
|
4
4
|
module Lock
|
5
5
|
describe Middleware do
|
6
6
|
before do
|
7
|
-
Sidekiq
|
7
|
+
if Sidekiq::VERSION >= '7'
|
8
|
+
Sidekiq.configure_server do |config|
|
9
|
+
config.redis = { url: REDIS_URL }
|
10
|
+
end
|
11
|
+
else
|
12
|
+
Sidekiq.redis = REDIS
|
13
|
+
end
|
8
14
|
Sidekiq.redis { |c| c.flushdb }
|
9
|
-
|
15
|
+
reset_lock_variable!
|
10
16
|
end
|
11
17
|
|
12
|
-
let(:handler){ Sidekiq::Lock::Middleware.new }
|
18
|
+
let(:handler) { Sidekiq::Lock::Middleware.new }
|
13
19
|
|
14
20
|
it 'sets lock variable with provided static lock options' do
|
15
|
-
handler.call(LockWorker.new, {'class' => LockWorker, 'args' => []}, 'default') do
|
21
|
+
handler.call(LockWorker.new, { 'class' => LockWorker, 'args' => [] }, 'default') do
|
16
22
|
true
|
17
23
|
end
|
18
24
|
|
19
|
-
assert_kind_of RedisLock,
|
25
|
+
assert_kind_of RedisLock, lock_container_variable
|
20
26
|
end
|
21
27
|
|
22
28
|
it 'sets lock variable with provided dynamic options' do
|
23
|
-
handler.call(DynamicLockWorker.new, {'class' => DynamicLockWorker, 'args' => [1234, 1000]}, 'default') do
|
29
|
+
handler.call(DynamicLockWorker.new, { 'class' => DynamicLockWorker, 'args' => [1234, 1000] }, 'default') do
|
24
30
|
true
|
25
31
|
end
|
26
32
|
|
27
|
-
assert_equal "lock:1234",
|
28
|
-
assert_equal 2000,
|
33
|
+
assert_equal "lock:1234", lock_container_variable.name
|
34
|
+
assert_equal 2000, lock_container_variable.timeout
|
29
35
|
end
|
30
36
|
|
31
37
|
it 'sets nothing for workers without lock options' do
|
32
|
-
handler.call(RegularWorker.new, {'class' => RegularWorker, 'args' => []}, 'default') do
|
38
|
+
handler.call(RegularWorker.new, { 'class' => RegularWorker, 'args' => [] }, 'default') do
|
33
39
|
true
|
34
40
|
end
|
35
41
|
|
36
|
-
assert_nil
|
42
|
+
assert_nil lock_container_variable
|
37
43
|
end
|
38
|
-
|
39
44
|
end
|
40
45
|
end
|
41
46
|
end
|
data/test/lib/redis_lock_test.rb
CHANGED
@@ -4,12 +4,16 @@ module Sidekiq
|
|
4
4
|
module Lock
|
5
5
|
describe RedisLock do
|
6
6
|
before do
|
7
|
-
Sidekiq
|
7
|
+
if Sidekiq::VERSION >= '7'
|
8
|
+
Sidekiq.configure_client do |config|
|
9
|
+
config.redis = { url: REDIS_URL }
|
10
|
+
end
|
11
|
+
else
|
12
|
+
Sidekiq.redis = REDIS
|
13
|
+
end
|
8
14
|
Sidekiq.redis { |c| c.flushdb }
|
9
15
|
end
|
10
16
|
|
11
|
-
let(:args) { [{'timeout' => 100, 'name' => 'test-lock'}, []] }
|
12
|
-
|
13
17
|
it "raises an error on missing timeout&name values" do
|
14
18
|
assert_raises ArgumentError do
|
15
19
|
RedisLock.new({},[])
|
@@ -52,46 +56,59 @@ module Sidekiq
|
|
52
56
|
end
|
53
57
|
|
54
58
|
it "can acquire a lock" do
|
55
|
-
lock = RedisLock.new(
|
59
|
+
lock = RedisLock.new({'timeout' => 100, 'name' => 'test-lock'}, [])
|
60
|
+
assert lock.acquire!
|
61
|
+
end
|
62
|
+
|
63
|
+
it "sets proper lock value on first and second acquire" do
|
64
|
+
lock = RedisLock.new({'timeout' => 1000, 'name' => 'test-lock', 'value' => 'lock value'}, [])
|
56
65
|
assert lock.acquire!
|
66
|
+
assert_equal 'lock value', redis("get", lock.name)
|
67
|
+
assert lock.release!
|
68
|
+
# at this point script should be used from evalsha
|
69
|
+
assert lock.acquire!
|
70
|
+
assert_equal 'lock value', redis("get", lock.name)
|
71
|
+
|
72
|
+
redis("script", "flush")
|
73
|
+
assert lock.acquire!
|
74
|
+
assert_equal 'lock value', redis("get", lock.name)
|
57
75
|
end
|
58
76
|
|
59
|
-
it "cannot
|
60
|
-
faster_lock = RedisLock.new(
|
77
|
+
it "cannot acquire lock if it's already taken by other process/thread" do
|
78
|
+
faster_lock = RedisLock.new({'timeout' => 100, 'name' => 'test-lock'}, [])
|
61
79
|
assert faster_lock.acquire!
|
62
80
|
|
63
|
-
slower_lock = RedisLock.new(
|
81
|
+
slower_lock = RedisLock.new({'timeout' => 100, 'name' => 'test-lock'}, [])
|
64
82
|
refute slower_lock.acquire!
|
65
83
|
end
|
66
84
|
|
67
85
|
it "releases taken lock" do
|
68
|
-
lock = RedisLock.new(
|
86
|
+
lock = RedisLock.new({'timeout' => 100, 'name' => 'test-lock'}, [])
|
69
87
|
lock.acquire!
|
70
88
|
assert redis("get", "test-lock")
|
71
89
|
|
72
|
-
lock.release!
|
90
|
+
assert lock.release!
|
73
91
|
assert_nil redis("get", "test-lock")
|
74
92
|
end
|
75
93
|
|
76
94
|
it "releases lock taken by another process without deleting lock key" do
|
77
|
-
lock = RedisLock.new(
|
95
|
+
lock = RedisLock.new({'timeout' => 100, 'name' => 'test-lock'}, [])
|
78
96
|
lock.acquire!
|
79
97
|
lock_value = redis("get", "test-lock")
|
80
98
|
assert lock_value
|
81
99
|
sleep 0.11 # timeout lock
|
82
100
|
|
83
|
-
new_lock = RedisLock.new(
|
101
|
+
new_lock = RedisLock.new({'timeout' => 100, 'name' => 'test-lock'}, [])
|
84
102
|
new_lock.acquire!
|
85
103
|
new_lock_value = redis("get", "test-lock")
|
86
104
|
|
87
|
-
lock.release!
|
105
|
+
refute lock.release!
|
88
106
|
|
89
107
|
assert_equal new_lock_value, redis("get", "test-lock")
|
90
108
|
end
|
91
109
|
|
92
110
|
it "releases taken lock" do
|
93
|
-
|
94
|
-
lock = RedisLock.new(*custom_args)
|
111
|
+
lock = RedisLock.new({'timeout' => 100, 'name' => 'test-lock', 'value' => 'custom_value'}, [])
|
95
112
|
lock.acquire!
|
96
113
|
assert redis("get", "test-lock")
|
97
114
|
|
@@ -2,20 +2,23 @@ require "test_helper"
|
|
2
2
|
require "sidekiq/lock/testing/inline"
|
3
3
|
|
4
4
|
describe "inline test helper" do
|
5
|
-
after {
|
5
|
+
after { reset_lock_variable! }
|
6
6
|
|
7
7
|
it "has helper fuction for setting lock" do
|
8
|
-
Sidekiq::Lock::RedisLock
|
8
|
+
Sidekiq::Lock::RedisLock
|
9
|
+
.expects(:new)
|
10
|
+
.with({ timeout: 1, name: 'lock-worker' }, 'worker argument')
|
11
|
+
.returns('lock set')
|
12
|
+
|
9
13
|
set_sidekiq_lock(LockWorker, 'worker argument')
|
10
|
-
assert_equal 'lock set',
|
14
|
+
assert_equal 'lock set', lock_container_variable
|
11
15
|
end
|
12
16
|
|
13
17
|
it "has helper fuction for clearing lock" do
|
14
18
|
set_lock_variable! "test"
|
15
|
-
assert_equal "test",
|
19
|
+
assert_equal "test", lock_container_variable
|
16
20
|
|
17
21
|
clear_sidekiq_lock
|
18
|
-
assert_nil
|
22
|
+
assert_nil lock_container_variable
|
19
23
|
end
|
20
|
-
|
21
24
|
end
|
data/test/lib/worker_test.rb
CHANGED
@@ -3,26 +3,64 @@ require 'test_helper'
|
|
3
3
|
module Sidekiq
|
4
4
|
module Lock
|
5
5
|
describe Worker do
|
6
|
-
after {
|
6
|
+
# after { }
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
class CustomContainer
|
9
|
+
def initialize
|
10
|
+
@lock = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def fetch
|
14
|
+
@lock
|
15
|
+
end
|
16
|
+
|
17
|
+
def store(lock)
|
18
|
+
@lock = lock
|
19
|
+
end
|
11
20
|
end
|
12
21
|
|
22
|
+
# it 'sets lock method that points to thread variable' do
|
23
|
+
# set_lock_variable! "test"
|
24
|
+
# assert_equal "test", LockWorker.new.lock
|
25
|
+
# end
|
26
|
+
|
13
27
|
it 'allows method name configuration' do
|
14
|
-
|
28
|
+
begin
|
29
|
+
Sidekiq.lock_method = :custom_lock_name
|
15
30
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
31
|
+
class WorkerWithCustomLockName
|
32
|
+
include Sidekiq::Worker
|
33
|
+
include Sidekiq::Lock::Worker
|
34
|
+
end
|
35
|
+
|
36
|
+
set_lock_variable! "custom_name"
|
20
37
|
|
21
|
-
|
38
|
+
assert_equal "custom_name", WorkerWithCustomLockName.new.custom_lock_name
|
22
39
|
|
23
|
-
|
40
|
+
reset_lock_variable!
|
41
|
+
ensure
|
42
|
+
|
43
|
+
Sidekiq.lock_method = Sidekiq::Lock::METHOD_NAME
|
44
|
+
end
|
24
45
|
end
|
25
46
|
|
47
|
+
it 'allows container configuration' do
|
48
|
+
begin
|
49
|
+
container = CustomContainer.new
|
50
|
+
Sidekiq.lock_container = container
|
51
|
+
|
52
|
+
class WorkerWithCustomContainer
|
53
|
+
include Sidekiq::Worker
|
54
|
+
include Sidekiq::Lock::Worker
|
55
|
+
end
|
56
|
+
|
57
|
+
container.store "lock-variable"
|
58
|
+
|
59
|
+
assert_equal "lock-variable", WorkerWithCustomContainer.new.lock
|
60
|
+
ensure
|
61
|
+
Sidekiq.lock_container = Sidekiq::Lock::Container.new
|
62
|
+
end
|
63
|
+
end
|
26
64
|
end
|
27
65
|
end
|
28
66
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
require 'coveralls'
|
2
|
-
Coveralls.wear! do
|
3
|
-
add_filter '/test/'
|
4
|
-
end
|
5
|
-
|
6
1
|
require 'minitest/autorun'
|
7
2
|
require 'minitest/pride'
|
8
3
|
require 'mocha/setup'
|
@@ -12,7 +7,8 @@ require 'test_workers'
|
|
12
7
|
|
13
8
|
Sidekiq.logger.level = Logger::ERROR
|
14
9
|
|
15
|
-
|
10
|
+
REDIS_URL = ENV['REDIS_URL'] || 'redis://localhost/15'
|
11
|
+
REDIS = Sidekiq::RedisConnection.create(url: REDIS_URL)
|
16
12
|
|
17
13
|
def redis(command, *args)
|
18
14
|
Sidekiq.redis do |c|
|
@@ -20,10 +16,14 @@ def redis(command, *args)
|
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
23
|
-
def set_lock_variable!(value
|
24
|
-
|
19
|
+
def set_lock_variable!(value)
|
20
|
+
Sidekiq.lock_container.store(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset_lock_variable!
|
24
|
+
set_lock_variable!(nil)
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
27
|
+
def lock_container_variable
|
28
|
+
Sidekiq.lock_container.fetch
|
29
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-lock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafal Wojsznis
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -66,34 +66,6 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rack-test
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: coveralls
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0.8'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0.8'
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
70
|
name: mocha
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,26 +115,19 @@ executables: []
|
|
143
115
|
extensions: []
|
144
116
|
extra_rdoc_files: []
|
145
117
|
files:
|
146
|
-
- ".gitignore"
|
147
|
-
- ".travis.yml"
|
148
|
-
- Appraisals
|
149
118
|
- CHANGELOG.md
|
150
|
-
- Gemfile
|
151
119
|
- LICENSE.txt
|
152
120
|
- README.md
|
153
121
|
- Rakefile
|
154
|
-
- gemfiles/sidekiq_2.gemfile
|
155
|
-
- gemfiles/sidekiq_3.gemfile
|
156
|
-
- gemfiles/sidekiq_4.gemfile
|
157
|
-
- gemfiles/sidekiq_5.gemfile
|
158
122
|
- lib/sidekiq-lock.rb
|
159
123
|
- lib/sidekiq/lock.rb
|
124
|
+
- lib/sidekiq/lock/container.rb
|
160
125
|
- lib/sidekiq/lock/middleware.rb
|
161
126
|
- lib/sidekiq/lock/redis_lock.rb
|
162
127
|
- lib/sidekiq/lock/testing/inline.rb
|
163
128
|
- lib/sidekiq/lock/version.rb
|
164
129
|
- lib/sidekiq/lock/worker.rb
|
165
|
-
-
|
130
|
+
- test/lib/container_test.rb
|
166
131
|
- test/lib/lock_test.rb
|
167
132
|
- test/lib/middleware_test.rb
|
168
133
|
- test/lib/redis_lock_test.rb
|
@@ -174,7 +139,7 @@ homepage: https://github.com/emq/sidekiq-lock
|
|
174
139
|
licenses:
|
175
140
|
- MIT
|
176
141
|
metadata: {}
|
177
|
-
post_install_message:
|
142
|
+
post_install_message:
|
178
143
|
rdoc_options: []
|
179
144
|
require_paths:
|
180
145
|
- lib
|
@@ -189,12 +154,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
154
|
- !ruby/object:Gem::Version
|
190
155
|
version: '0'
|
191
156
|
requirements: []
|
192
|
-
|
193
|
-
|
194
|
-
signing_key:
|
157
|
+
rubygems_version: 3.3.7
|
158
|
+
signing_key:
|
195
159
|
specification_version: 4
|
196
160
|
summary: Simple redis-based lock mechanism for your sidekiq workers
|
197
161
|
test_files:
|
162
|
+
- test/lib/container_test.rb
|
198
163
|
- test/lib/lock_test.rb
|
199
164
|
- test/lib/middleware_test.rb
|
200
165
|
- test/lib/redis_lock_test.rb
|
data/.gitignore
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
*.gem
|
2
|
-
*.rbc
|
3
|
-
.bundle
|
4
|
-
.config
|
5
|
-
.yardoc
|
6
|
-
Gemfile.lock
|
7
|
-
InstalledFiles
|
8
|
-
_yardoc
|
9
|
-
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
|
-
rdoc
|
14
|
-
spec/reports
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
.rvmrc
|
19
|
-
.ruby-version
|
20
|
-
.ruby-gemset
|
21
|
-
*.gemfile.lock
|
data/.travis.yml
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
cache: bundler
|
3
|
-
|
4
|
-
services:
|
5
|
-
- redis-server
|
6
|
-
|
7
|
-
gemfile:
|
8
|
-
- gemfiles/sidekiq_2.gemfile
|
9
|
-
- gemfiles/sidekiq_3.gemfile
|
10
|
-
- gemfiles/sidekiq_4.gemfile
|
11
|
-
- gemfiles/sidekiq_5.gemfile
|
12
|
-
|
13
|
-
rvm:
|
14
|
-
- 2.2.9
|
15
|
-
- 2.3.6
|
16
|
-
- 2.4.3
|
17
|
-
- 2.5.0
|
18
|
-
|
19
|
-
notifications:
|
20
|
-
email: false
|
data/Appraisals
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
appraise 'sidekiq-2' do
|
2
|
-
gem 'sidekiq', '~> 2.17', '>= 2.17.8'
|
3
|
-
end
|
4
|
-
|
5
|
-
appraise 'sidekiq-3' do
|
6
|
-
gem 'sidekiq', '~> 3.5', '>= 3.5.4'
|
7
|
-
end
|
8
|
-
|
9
|
-
appraise 'sidekiq-4' do
|
10
|
-
gem 'sidekiq', '~> 4.2', '>= 4.2.10'
|
11
|
-
end
|
12
|
-
|
13
|
-
appraise 'sidekiq-5' do
|
14
|
-
gem 'sidekiq', '~> 5.1', '>= 5.1'
|
15
|
-
end
|
data/Gemfile
DELETED
data/gemfiles/sidekiq_2.gemfile
DELETED
data/gemfiles/sidekiq_3.gemfile
DELETED
data/gemfiles/sidekiq_4.gemfile
DELETED
data/gemfiles/sidekiq_5.gemfile
DELETED
data/sidekiq-lock.gemspec
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'sidekiq/lock/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "sidekiq-lock"
|
8
|
-
spec.version = Sidekiq::Lock::VERSION
|
9
|
-
spec.authors = ["Rafal Wojsznis"]
|
10
|
-
spec.email = ["rafal.wojsznis@gmail.com"]
|
11
|
-
spec.description = spec.summary = "Simple redis-based lock mechanism for your sidekiq workers"
|
12
|
-
spec.homepage = "https://github.com/emq/sidekiq-lock"
|
13
|
-
spec.license = "MIT"
|
14
|
-
|
15
|
-
spec.files = `git ls-files`.split($/)
|
16
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = ["lib"]
|
19
|
-
|
20
|
-
spec.add_dependency "sidekiq", ">= 2.14.0"
|
21
|
-
spec.add_dependency "redis", ">= 3.0.5"
|
22
|
-
|
23
|
-
spec.add_development_dependency "bundler"
|
24
|
-
spec.add_development_dependency "rake"
|
25
|
-
spec.add_development_dependency "rack-test"
|
26
|
-
spec.add_development_dependency "coveralls", "~> 0.8"
|
27
|
-
spec.add_development_dependency "mocha", "~> 0.14.0"
|
28
|
-
spec.add_development_dependency "minitest"
|
29
|
-
spec.add_development_dependency "appraisal"
|
30
|
-
end
|