module Rescheduler::Sync

Public Instance Methods

clear!(name) click to toggle source

Forcefully unlock and delete existing locks

# File lib/rescheduler/sync.rb, line 21
def clear!(name)
  redis.del(rk_exists_name(name), rk_lock_name(name))
end
lock(name, opts={}) { || ... } click to toggle source
# File lib/rescheduler/sync.rb, line 5
def lock(name, opts={})
  raise "Requires a block to be supplied" unless block_given? # Maybe later offer naked lock/unlocks?
  raise "Need a valid string name" unless name.is_a?(String)

  res = do_lock(name, opts) # This would block
  return nil unless res # Timeout or failed somehow

  begin
    yield
  ensure
    do_unlock(name)
  end
  return true # Lock was successful
end

Private Instance Methods

do_lock(name, opts) click to toggle source
# File lib/rescheduler/sync.rb, line 25
        def do_lock(name, opts)
  # Make sure semaphore for a given name is only created once
  if redis.getset(rk_exists_name(name), 1)
    # Already created, block wait for the release (possibility for unlock)
    return redis.brpop(rk_lock_name(name), timeout: (opts[:timeout] || 0))
  else
    # First time, get the lock automatically
    return true
  end
end
do_unlock(name) click to toggle source
# File lib/rescheduler/sync.rb, line 36
        def do_unlock(name)
  redis.lpush(rk_lock_name(name), 1)
end
redis() click to toggle source
# File lib/rescheduler/sync.rb, line 40
def redis; Rescheduler.send(:redis); end
rk_exists_name(name) click to toggle source
# File lib/rescheduler/sync.rb, line 41
def rk_exists_name(name); return "#{Rescheduler.prefix}Sync:#{name}"; end
rk_lock_name(name) click to toggle source
# File lib/rescheduler/sync.rb, line 42
def rk_lock_name(name); return "#{Rescheduler.prefix}SyncQ:#{name}"; end