Class: SidekiqUniqueJobs::Lock
- Inherits:
-
Object
- Object
- SidekiqUniqueJobs::Lock
- Includes:
- Connection, JSON, Timing
- Defined in:
- lib/sidekiq_unique_jobs/lock.rb,
lib/sidekiq_unique_jobs/lock/base_lock.rb,
lib/sidekiq_unique_jobs/lock/validator.rb,
lib/sidekiq_unique_jobs/lock/until_expired.rb,
lib/sidekiq_unique_jobs/lock/until_executed.rb,
lib/sidekiq_unique_jobs/lock/until_executing.rb,
lib/sidekiq_unique_jobs/lock/while_executing.rb,
lib/sidekiq_unique_jobs/lock/client_validator.rb,
lib/sidekiq_unique_jobs/lock/server_validator.rb,
lib/sidekiq_unique_jobs/lock/while_executing_reject.rb,
lib/sidekiq_unique_jobs/lock/until_and_while_executing.rb
Overview
Class Lock provides access to information about a lock
Defined Under Namespace
Classes: BaseLock, ClientValidator, ServerValidator, UntilAndWhileExecuting, UntilExecuted, UntilExecuting, UntilExpired, Validator, WhileExecuting, WhileExecutingReject
Instance Attribute Summary collapse
-
#key ⇒ Object
readonly
Returns the value of attribute key.
Class Method Summary collapse
-
.create(digest, job_id, lock_info = {}) ⇒ Lock
Initialize a locked lock.
Instance Method Summary collapse
-
#all_jids ⇒ Array<String>
Returns all job_id’s for this lock.
-
#changelog ⇒ Changelog
A sorted set with changelog entries.
-
#changelogs ⇒ Array<Hash>
Returns all matching changelog entries for this lock.
-
#created_at ⇒ Float
Returns either the time the lock was initialized with or the first changelog entry’s timestamp.
-
#del ⇒ Integer
Deletes all the redis keys for this lock.
-
#digest ⇒ Redis::String
The digest key.
-
#info ⇒ Redis::Hash
Information about the lock.
-
#initialize(key, time: nil) ⇒ Lock
constructor
Initialize a new lock.
- #inspect ⇒ Object
-
#lock(job_id, lock_info = {}) ⇒ void
Locks a job_id.
-
#locked ⇒ Redis::Hash
The locked hash.
-
#locked_jids(with_values: false) ⇒ Hash<String, Float>, Array<String>
Returns a collection of locked job_id’s.
-
#prime(job_id) ⇒ void
Create the :PRIMED key.
-
#primed ⇒ Redis::List
The primed list.
-
#primed_jids ⇒ Array<String>
Returns the primed JIDs.
-
#queue(job_id) ⇒ void
Create the :QUEUED key.
-
#queued ⇒ Redis::List
The queued list.
-
#queued_jids ⇒ Array<String>
Returns the queued JIDs.
-
#to_s ⇒ String
A nicely formatted string with information about this lock.
-
#unlock(job_id) ⇒ true, false
Unlock a specific job_id.
Methods included from JSON
dump_json, load_json, safe_load_json
Methods included from Timing
clock_stamp, now_f, time_source, timed
Methods included from Connection
Constructor Details
#initialize(key, time: nil) ⇒ Lock
Initialize a new lock
48 49 50 51 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 48 def initialize(key, time: nil) @key = get_key(key) @created_at = time.is_a?(Float) ? time : time.to_f end |
Instance Attribute Details
#key ⇒ Object (readonly)
Returns the value of attribute key.
25 26 27 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 25 def key @key end |
Class Method Details
Instance Method Details
#all_jids ⇒ Array<String>
a JID can be present in 3 different places
Returns all job_id’s for this lock
152 153 154 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 152 def all_jids (queued_jids + primed_jids + locked_jids).uniq end |
#changelog ⇒ Changelog
A sorted set with changelog entries
259 260 261 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 259 def changelog @changelog ||= Changelog.new end |
#changelogs ⇒ Array<Hash>
Returns all matching changelog entries for this lock
194 195 196 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 194 def changelogs changelog.entries(pattern: "*#{key.digest}*") end |
#created_at ⇒ Float
Returns either the time the lock was initialized with or
the first changelog entry's timestamp
140 141 142 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 140 def created_at @created_at ||= changelogs.first&.[]("time") end |
#del ⇒ Integer
Deletes all the redis keys for this lock
124 125 126 127 128 129 130 131 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 124 def del redis do |conn| conn.multi do |pipeline| pipeline.zrem(DIGESTS, key.digest) pipeline.del(key.digest, key.queued, key.primed, key.locked, key.info) end end end |
#digest ⇒ Redis::String
Used for exists checks to avoid enqueuing the same lock twice
The digest key
207 208 209 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 207 def digest @digest ||= Redis::String.new(key.digest) end |
#info ⇒ Redis::Hash
Information about the lock
247 248 249 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 247 def info @info ||= LockInfo.new(key.info) end |
#inspect ⇒ Object
285 286 287 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 285 def inspect to_s end |
#lock(job_id, lock_info = {}) ⇒ void
intended only for testing purposes
This method returns an undefined value.
Locks a job_id
63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 63 def lock(job_id, lock_info = {}) redis do |conn| conn.multi do |pipeline| pipeline.set(key.digest, job_id) pipeline.hset(key.locked, job_id, now_f) info.set(lock_info, pipeline) add_digest_to_set(pipeline, lock_info) pipeline.zadd(key.changelog, now_f, changelog_json(job_id, "queue.lua", "Queued")) pipeline.zadd(key.changelog, now_f, changelog_json(job_id, "lock.lua", "Locked")) end end end |
#locked ⇒ Redis::Hash
The locked hash
237 238 239 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 237 def locked @locked ||= Redis::Hash.new(key.locked) end |
#locked_jids(with_values: false) ⇒ Hash<String, Float>, Array<String>
Returns a collection of locked job_id’s
164 165 166 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 164 def locked_jids(with_values: false) locked.entries(with_values: with_values) end |
#prime(job_id) ⇒ void
intended only for testing purposes
This method returns an undefined value.
Create the :PRIMED key
100 101 102 103 104 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 100 def prime(job_id) redis do |conn| conn.lpush(key.primed, job_id) end end |
#primed ⇒ Redis::List
The primed list
227 228 229 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 227 def primed @primed ||= Redis::List.new(key.primed) end |
#primed_jids ⇒ Array<String>
Returns the primed JIDs
184 185 186 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 184 def primed_jids primed.entries end |
#queue(job_id) ⇒ void
intended only for testing purposes
This method returns an undefined value.
Create the :QUEUED key
85 86 87 88 89 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 85 def queue(job_id) redis do |conn| conn.lpush(key.queued, job_id) end end |
#queued ⇒ Redis::List
The queued list
217 218 219 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 217 def queued @queued ||= Redis::List.new(key.queued) end |
#queued_jids ⇒ Array<String>
Returns the queued JIDs
174 175 176 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 174 def queued_jids queued.entries end |
#to_s ⇒ String
A nicely formatted string with information about this lock
269 270 271 272 273 274 275 276 277 278 279 280 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 269 def to_s <<~MESSAGE Lock status for #{key} value: #{digest.value} info: #{info.value} queued_jids: #{queued_jids} primed_jids: #{primed_jids} locked_jids: #{locked_jids} changelogs: #{changelogs} MESSAGE end |
#unlock(job_id) ⇒ true, false
Unlock a specific job_id
114 115 116 |
# File 'lib/sidekiq_unique_jobs/lock.rb', line 114 def unlock(job_id) locked.del(job_id) end |