class ExcessFlow::GlobalMutex

ExcessFlow::GlobalMutex

Attempts to set up exclusive lock to execute a block of code. If another lock is in place then GlobalMutex will wait till lock is available. Always returns result of execution. GlobalMutex does not guarantee order of execution; it will only guarantee that only one thread for a given lock_key is running to avoid race conditions.

Attributes

lock_key[R]

Public Class Methods

locked(lock_key:, &block) click to toggle source
# File lib/excess_flow/global_mutex.rb, line 28
def self.locked(lock_key:, &block)
  new(lock_key).locked(&block)
end
new(lock_key) click to toggle source
# File lib/excess_flow/global_mutex.rb, line 32
def initialize(lock_key)
  @lock_key = lock_key
end

Public Instance Methods

locked(&block) click to toggle source
# File lib/excess_flow/global_mutex.rb, line 36
def locked(&block)
  sleep(ExcessFlow::MUTEX_SLEEP_TIME) until lock
  result = block.call
  unlock

  result
end

Private Instance Methods

lock() click to toggle source
# File lib/excess_flow/global_mutex.rb, line 46
def lock
  ExcessFlow.redis { |r| r.set(lock_key, 1, nx: true, ex: ExcessFlow::MUTEX_LOCK_TIME) }
end
unlock() click to toggle source
# File lib/excess_flow/global_mutex.rb, line 50
def unlock
  ExcessFlow.redis { |r| r.expire(lock_key, 0) }
end