Class: SidekiqUniqueJobs::Locksmith
- Inherits:
-
Object
- Object
- SidekiqUniqueJobs::Locksmith
- Includes:
- Connection
- Defined in:
- lib/sidekiq_unique_jobs/locksmith.rb
Overview
Lock manager class that handles all the various locks
Constant Summary collapse
- API_VERSION =
rubocop:disable ClassLength
'1'- EXPIRES_IN =
10
Instance Method Summary collapse
-
#available_count ⇒ Integer
The number of available resourced for this lock.
-
#create ⇒ String
Creates the necessary keys in redis to attempt a lock.
-
#delete ⇒ Object
Deletes the lock unless it has an expiration set.
-
#delete! ⇒ Object
Deletes the lock regardless of if it has an expiration set.
-
#exists? ⇒ true, false
Checks if the exists key is created in redis.
- #expire ⇒ Object
-
#initialize(item, redis_pool = nil) ⇒ Locksmith
constructor
A new instance of Locksmith.
-
#lock(timeout = nil) { ... } ⇒ Object
(also: #wait)
Create a lock for the item.
-
#locked?(token = nil) ⇒ true, false
Checks if this instance is considered locked.
-
#signal(token = nil) ⇒ Integer
Signal that the token should be released.
-
#unlock(token = nil) ⇒ false, String
Removes the lock keys from Redis.
Methods included from Connection
Constructor Details
#initialize(item, redis_pool = nil) ⇒ Locksmith
Returns a new instance of Locksmith.
18 19 20 21 22 23 24 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 18 def initialize(item, redis_pool = nil) @concurrency = 1 # removed in a0cff5bc42edbe7190d6ede7e7f845074d2d7af6 @expiration = item[LOCK_EXPIRATION_KEY] @jid = item[JID_KEY] @unique_digest = item[UNIQUE_DIGEST_KEY] @redis_pool = redis_pool end |
Instance Method Details
#available_count ⇒ Integer
The number of available resourced for this lock
54 55 56 57 58 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 54 def available_count return concurrency unless exists? redis(redis_pool) { |conn| conn.llen(available_key) } end |
#create ⇒ String
Creates the necessary keys in redis to attempt a lock
28 29 30 31 32 33 34 35 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 28 def create Scripts.call( :create, redis_pool, keys: [exists_key, grabbed_key, available_key, version_key, UNIQUE_SET, unique_digest], argv: [jid, expiration, API_VERSION, concurrency], ) end |
#delete ⇒ Object
Deletes the lock unless it has an expiration set
61 62 63 64 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 61 def delete return if expiration delete! end |
#delete! ⇒ Object
Deletes the lock regardless of if it has an expiration set
67 68 69 70 71 72 73 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 67 def delete! Scripts.call( :delete, redis_pool, keys: [exists_key, grabbed_key, available_key, version_key, UNIQUE_SET, unique_digest], ) end |
#exists? ⇒ true, false
Checks if the exists key is created in redis
48 49 50 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 48 def exists? redis(redis_pool) { |conn| conn.exists(exists_key) } end |
#expire ⇒ Object
37 38 39 40 41 42 43 44 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 37 def expire Scripts.call( :expire, redis_pool, keys: [exists_key, available_key, version_key], argv: [expiration, jid], ) end |
#lock(timeout = nil) { ... } ⇒ Object Also known as: wait
Create a lock for the item
80 81 82 83 84 85 86 87 88 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 80 def lock(timeout = nil, &block) create grab_token(timeout) do |token| expire touch_grabbed_token(token) return_token_or_block_value(token, &block) end end |
#locked?(token = nil) ⇒ true, false
Checks if this instance is considered locked
103 104 105 106 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 103 def locked?(token = nil) token ||= jid redis(redis_pool) { |conn| conn.hexists(grabbed_key, token) } end |
#signal(token = nil) ⇒ Integer
Signal that the token should be released
112 113 114 115 116 117 118 119 120 121 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 112 def signal(token = nil) token ||= jid Scripts.call( :signal, redis_pool, keys: [exists_key, grabbed_key, available_key, version_key, UNIQUE_SET, unique_digest], argv: [token, expiration], ) end |
#unlock(token = nil) ⇒ false, String
Removes the lock keys from Redis
94 95 96 97 |
# File 'lib/sidekiq_unique_jobs/locksmith.rb', line 94 def unlock(token = nil) return false unless locked?(token) signal(token) end |