class Stockpile::Lock

Stockpile::Lock

Attempts to set up exclusive lock to execute a block of code. Returns Stockpile::LockedExcutionResult holding result of execution. If lock can not be established (someone else is executing the code) then Stockpile::LockedExcutionResult will hold Stockpile::FailedLockExecution as a result of execution

Attributes

db[R]
lock_key[R]

Public Class Methods

new(db, lock_key) click to toggle source
# File lib/stockpile/lock.rb, line 32
def initialize(db, lock_key)
  @db = db
  @lock_key = lock_key
end
perform_locked(db: :default, lock_key:, &block) click to toggle source
# File lib/stockpile/lock.rb, line 28
def self.perform_locked(db: :default, lock_key:, &block)
  new(db, lock_key).perform_locked(&block)
end

Public Instance Methods

perform_locked(&block) click to toggle source
# File lib/stockpile/lock.rb, line 37
def perform_locked(&block)
  if lock
    successful_execution(&block)
  else
    failed_execution
  end
end

Private Instance Methods

failed_execution() click to toggle source
# File lib/stockpile/lock.rb, line 47
def failed_execution
  Stockpile::LockedExcutionResult.new(db: db, result: failed_lock, lock_key: lock_key)
end
failed_lock() click to toggle source
# File lib/stockpile/lock.rb, line 51
def failed_lock
  Stockpile::FailedLockExecution.new
end
lock() click to toggle source
# File lib/stockpile/lock.rb, line 55
def lock
  Stockpile.redis(db: db) { |r| r.set(lock_key, 1, nx: true, ex: Stockpile.configuration.lock_expiration) }
end
successful_execution() { || ... } click to toggle source
# File lib/stockpile/lock.rb, line 59
def successful_execution
  Stockpile::LockedExcutionResult.new(db: db, result: yield, lock_key: lock_key)
end