sidekiq-unique-jobs 6.0.5 → 6.0.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-unique-jobs might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/sidekiq_unique_jobs/locksmith.rb +22 -44
- data/lib/sidekiq_unique_jobs/util.rb +6 -1
- data/lib/sidekiq_unique_jobs/version.rb +1 -1
- data/redis/{create.lua → lock.lua} +19 -19
- data/redis/{signal.lua → unlock.lua} +3 -3
- metadata +5 -7
- data/redis/expire.lua +0 -15
- data/redis/release_lock.lua +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f82a371b5f835c77c75c753533472d6b7654cb5f403ebeb686502046a0884681
|
4
|
+
data.tar.gz: 982ad72a4c7f7a164c9dadc7e5979b26562b53d7a934a6a04c2baf0bd35f7732
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e6e9740d60600bdf0ab87b1c24dca5c680f866bbdee55449dcfe2dd143956b85ecf8db33c5bbdbc1c4ec59dcd9ab8ee481af06c93b234419612005ce1628f62
|
7
|
+
data.tar.gz: 58e048744c22ebf4b288863919dad091a122f9511b7d578b06327060e88e4c377542ebae00311381ec2cbda4276d8c6e08cf51033c6369532499aa2c2e49815b
|
@@ -4,10 +4,7 @@ module SidekiqUniqueJobs
|
|
4
4
|
# Lock manager class that handles all the various locks
|
5
5
|
#
|
6
6
|
# @author Mikael Henriksson <mikael@zoolutions.se>
|
7
|
-
class Locksmith
|
8
|
-
API_VERSION = '1'
|
9
|
-
EXPIRES_IN = 10
|
10
|
-
|
7
|
+
class Locksmith
|
11
8
|
include SidekiqUniqueJobs::Connection
|
12
9
|
|
13
10
|
# @param [Hash] item a Sidekiq job hash
|
@@ -23,26 +20,6 @@ module SidekiqUniqueJobs
|
|
23
20
|
@redis_pool = redis_pool
|
24
21
|
end
|
25
22
|
|
26
|
-
# Creates the necessary keys in redis to attempt a lock
|
27
|
-
# @return [String] the Sidekiq job_id
|
28
|
-
def create
|
29
|
-
Scripts.call(
|
30
|
-
:create,
|
31
|
-
redis_pool,
|
32
|
-
keys: [exists_key, grabbed_key, available_key, version_key, UNIQUE_SET, unique_digest],
|
33
|
-
argv: [jid, expiration, API_VERSION, concurrency],
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
def expire
|
38
|
-
Scripts.call(
|
39
|
-
:expire,
|
40
|
-
redis_pool,
|
41
|
-
keys: [exists_key, available_key, version_key],
|
42
|
-
argv: [expiration, jid],
|
43
|
-
)
|
44
|
-
end
|
45
|
-
|
46
23
|
# Checks if the exists key is created in redis
|
47
24
|
# @return [true, false]
|
48
25
|
def exists?
|
@@ -78,48 +55,49 @@ module SidekiqUniqueJobs
|
|
78
55
|
# @yield the block to execute if a lock is successful
|
79
56
|
# @return the Sidekiq job_id (jid)
|
80
57
|
def lock(timeout = nil, &block)
|
81
|
-
|
58
|
+
Scripts.call(:lock, redis_pool,
|
59
|
+
keys: [exists_key, grabbed_key, available_key, UNIQUE_SET, unique_digest],
|
60
|
+
argv: [jid, expiration])
|
82
61
|
|
83
62
|
grab_token(timeout) do |token|
|
84
|
-
expire
|
85
63
|
touch_grabbed_token(token)
|
86
64
|
return_token_or_block_value(token, &block)
|
87
65
|
end
|
88
66
|
end
|
89
67
|
alias wait lock
|
90
68
|
|
91
|
-
# Removes the lock keys from Redis
|
69
|
+
# Removes the lock keys from Redis if locked by the provided jid/token
|
92
70
|
# @return [false] unless locked?
|
93
71
|
# @return [String] Sidekiq job_id (jid) if successful
|
94
72
|
def unlock(token = nil)
|
95
|
-
return false unless locked?(token)
|
96
|
-
signal(token)
|
97
|
-
end
|
98
|
-
|
99
|
-
# Checks if this instance is considered locked
|
100
|
-
# @param [String] token the unique token to check for a lock.
|
101
|
-
# nil will default to the jid provided in the initializer
|
102
|
-
# @return [true, false]
|
103
|
-
def locked?(token = nil)
|
104
73
|
token ||= jid
|
105
|
-
|
74
|
+
return false unless locked?(token)
|
75
|
+
unlock!(token)
|
106
76
|
end
|
107
77
|
|
108
|
-
#
|
109
|
-
# @
|
110
|
-
#
|
111
|
-
|
112
|
-
def signal(token = nil)
|
78
|
+
# Removes the lock keys from Redis
|
79
|
+
# @return [false] unless locked?
|
80
|
+
# @return [String] Sidekiq job_id (jid) if successful
|
81
|
+
def unlock!(token = nil)
|
113
82
|
token ||= jid
|
114
83
|
|
115
84
|
Scripts.call(
|
116
|
-
:
|
85
|
+
:unlock,
|
117
86
|
redis_pool,
|
118
87
|
keys: [exists_key, grabbed_key, available_key, version_key, UNIQUE_SET, unique_digest],
|
119
88
|
argv: [token, expiration],
|
120
89
|
)
|
121
90
|
end
|
122
91
|
|
92
|
+
# Checks if this instance is considered locked
|
93
|
+
# @param [String] token the unique token to check for a lock.
|
94
|
+
# nil will default to the jid provided in the initializer
|
95
|
+
# @return [true, false]
|
96
|
+
def locked?(token = nil)
|
97
|
+
token ||= jid
|
98
|
+
redis(redis_pool) { |conn| conn.hexists(grabbed_key, token) }
|
99
|
+
end
|
100
|
+
|
123
101
|
private
|
124
102
|
|
125
103
|
attr_reader :concurrency, :unique_digest, :expiration, :jid, :redis_pool
|
@@ -148,7 +126,7 @@ module SidekiqUniqueJobs
|
|
148
126
|
begin
|
149
127
|
yield token
|
150
128
|
ensure
|
151
|
-
|
129
|
+
unlock(token)
|
152
130
|
end
|
153
131
|
end
|
154
132
|
|
@@ -44,7 +44,7 @@ module SidekiqUniqueJobs
|
|
44
44
|
# @return [Integer] the number of keys deleted
|
45
45
|
def del(pattern = SCAN_PATTERN, count = 0)
|
46
46
|
raise ArgumentError, 'Please provide a number of keys to delete greater than zero' if count.zero?
|
47
|
-
pattern =
|
47
|
+
pattern = suffix(pattern)
|
48
48
|
|
49
49
|
log_debug { "Deleting keys by: #{pattern}" }
|
50
50
|
keys, time = timed { keys(pattern, count) }
|
@@ -87,6 +87,11 @@ module SidekiqUniqueJobs
|
|
87
87
|
"#{unique_prefix}:#{key}"
|
88
88
|
end
|
89
89
|
|
90
|
+
def suffix(key)
|
91
|
+
return "#{key}*" unless key.end_with?(':*')
|
92
|
+
key
|
93
|
+
end
|
94
|
+
|
90
95
|
def unique_prefix
|
91
96
|
SidekiqUniqueJobs.config.unique_prefix
|
92
97
|
end
|
@@ -3,14 +3,20 @@
|
|
3
3
|
local exists_key = KEYS[1]
|
4
4
|
local grabbed_key = KEYS[2]
|
5
5
|
local available_key = KEYS[3]
|
6
|
-
local
|
7
|
-
local
|
8
|
-
local unique_digest = KEYS[6]
|
6
|
+
local unique_keys = KEYS[4]
|
7
|
+
local unique_digest = KEYS[5]
|
9
8
|
|
10
9
|
local job_id = ARGV[1]
|
11
10
|
local expiration = tonumber(ARGV[2])
|
12
|
-
|
13
|
-
local
|
11
|
+
|
12
|
+
local function current_time()
|
13
|
+
local time = redis.call('time')
|
14
|
+
local s = time[1]
|
15
|
+
local ms = time[2]
|
16
|
+
local number = tonumber((s .. '.' .. ms))
|
17
|
+
|
18
|
+
return number
|
19
|
+
end
|
14
20
|
|
15
21
|
-- redis.log(redis.LOG_DEBUG, "create.lua - investigate possibility of locking jid: " .. job_id)
|
16
22
|
|
@@ -35,24 +41,18 @@ if old_token then
|
|
35
41
|
end
|
36
42
|
----------------------------------------------------------------
|
37
43
|
|
38
|
-
-- redis.log(redis.LOG_DEBUG, "create.lua - creating locks for jid: " .. job_id)
|
39
44
|
redis.call('SADD', unique_keys, unique_digest)
|
40
|
-
redis.call('EXPIRE', exists_key, 5)
|
41
45
|
redis.call('DEL', grabbed_key)
|
46
|
+
-- TODO: Move this to LUA when redis 3.2 is the least supported
|
47
|
+
-- redis.call('HSET', grabbed_key, job_id, current_time())
|
48
|
+
---------------------------------------------------------------
|
42
49
|
redis.call('DEL', available_key)
|
50
|
+
redis.call('RPUSH', available_key, job_id)
|
43
51
|
|
44
|
-
if
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
else
|
49
|
-
redis.call('RPUSH', available_key, job_id)
|
52
|
+
if expiration then
|
53
|
+
redis.call('EXPIRE', available_key, expiration)
|
54
|
+
redis.call('EXPIRE', exists_key, expiration)
|
55
|
+
redis.call('EXPIRE', grabbed_key, expiration)
|
50
56
|
end
|
51
57
|
|
52
|
-
-- redis.log(redis.LOG_DEBUG, "create.lua - persisting locks for jid: " .. job_id)
|
53
|
-
redis.call('PERSIST', exists_key)
|
54
|
-
|
55
|
-
redis.call('GETSET', version_key, api_version)
|
56
|
-
|
57
|
-
|
58
58
|
return job_id
|
@@ -17,15 +17,15 @@ if expiration then
|
|
17
17
|
redis.call('SREM', unique_keys, unique_digest)
|
18
18
|
redis.call('EXPIRE', exists_key, expiration)
|
19
19
|
redis.call('EXPIRE', available_key, expiration)
|
20
|
-
redis.call('EXPIRE', version_key, expiration)
|
20
|
+
redis.call('EXPIRE', version_key, expiration) -- TODO: Legacy support (Remove in v6.1)
|
21
21
|
redis.call('EXPIRE', unique_digest, expiration) -- TODO: Legacy support (Remove in v6.1)
|
22
22
|
else
|
23
23
|
redis.call('DEL', exists_key)
|
24
24
|
redis.call('SREM', unique_keys, unique_digest)
|
25
25
|
redis.call('DEL', grabbed_key)
|
26
26
|
redis.call('DEL', available_key)
|
27
|
-
redis.call('DEL', version_key)
|
28
|
-
redis.call('DEL', 'uniquejobs') -- TODO: Old job hash, just drop the darn thing
|
27
|
+
redis.call('DEL', version_key) -- TODO: Legacy support (Remove in v6.1)
|
28
|
+
redis.call('DEL', 'uniquejobs') -- TODO: Old job hash, just drop the darn thing (Remove in v6.1)
|
29
29
|
redis.call('DEL', unique_digest) -- TODO: Legacy support (Remove in v6.1)
|
30
30
|
end
|
31
31
|
|
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: 6.0.
|
4
|
+
version: 6.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikael Henriksson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -310,14 +310,12 @@ files:
|
|
310
310
|
- lib/sidekiq_unique_jobs/web/views/unique_digest.erb
|
311
311
|
- lib/sidekiq_unique_jobs/web/views/unique_digests.erb
|
312
312
|
- redis/acquire_lock.lua
|
313
|
-
- redis/create.lua
|
314
313
|
- redis/delete.lua
|
315
314
|
- redis/delete_by_digest.lua
|
316
315
|
- redis/delete_job_by_digest.lua
|
317
|
-
- redis/
|
318
|
-
- redis/release_lock.lua
|
316
|
+
- redis/lock.lua
|
319
317
|
- redis/release_stale_locks.lua
|
320
|
-
- redis/
|
318
|
+
- redis/unlock.lua
|
321
319
|
- sidekiq-unique-jobs.gemspec
|
322
320
|
homepage: https://github.com/mhenrixon/sidekiq-unique-jobs
|
323
321
|
licenses:
|
@@ -339,7 +337,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
339
337
|
version: '0'
|
340
338
|
requirements: []
|
341
339
|
rubyforge_project:
|
342
|
-
rubygems_version: 2.7.
|
340
|
+
rubygems_version: 2.7.7
|
343
341
|
signing_key:
|
344
342
|
specification_version: 4
|
345
343
|
summary: Uniqueness for Sidekiq Jobs
|
data/redis/expire.lua
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
-- redis.replicate_commands();
|
2
|
-
|
3
|
-
local exists_key = KEYS[1]
|
4
|
-
local available_key = KEYS[2]
|
5
|
-
local version_key = KEYS[3]
|
6
|
-
|
7
|
-
local expiration = tonumber(ARGV[1])
|
8
|
-
local job_id = ARGV[2]
|
9
|
-
|
10
|
-
if expiration then
|
11
|
-
-- redis.log(redis.LOG_DEBUG, "expire.lua - expiring locks for job_id: " .. job_id)
|
12
|
-
redis.call('EXPIRE', available_key, expiration)
|
13
|
-
redis.call('EXPIRE', exists_key, expiration)
|
14
|
-
redis.call('EXPIRE', version_key, expiration)
|
15
|
-
end
|
data/redis/release_lock.lua
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
local unique_key = KEYS[1]
|
2
|
-
local job_id = ARGV[1]
|
3
|
-
local stored_jid = redis.pcall('get', unique_key)
|
4
|
-
|
5
|
-
if stored_jid then
|
6
|
-
if stored_jid == job_id or stored_jid == '2' then
|
7
|
-
redis.pcall('del', unique_key)
|
8
|
-
redis.pcall('HDEL', 'uniquejobs', job_id)
|
9
|
-
return 1
|
10
|
-
else
|
11
|
-
return 0
|
12
|
-
end
|
13
|
-
else
|
14
|
-
return -1
|
15
|
-
end
|
16
|
-
|