class ResqueAdmin::Scheduler::Lock::Resilient

Public Instance Methods

acquire!() click to toggle source
# File lib/resque_admin/scheduler/lock/resilient.rb, line 8
def acquire!
  evalsha(:acquire, [key], [value]).to_i == 1
end
locked?() click to toggle source
# File lib/resque_admin/scheduler/lock/resilient.rb, line 12
def locked?
  evalsha(:locked, [key], [value]).to_i == 1
end
timeout=(seconds) click to toggle source
# File lib/resque_admin/scheduler/lock/resilient.rb, line 16
def timeout=(seconds)
  if locked?
    @timeout = seconds
    @locked_sha = nil
    @acquire_sha = nil
  end
  @timeout
end

Private Instance Methods

acquire_sha(refresh = false) click to toggle source
# File lib/resque_admin/scheduler/lock/resilient.rb, line 61
        def acquire_sha(refresh = false)
          @acquire_sha = nil if refresh

          @acquire_sha ||=
            ResqueAdmin.redis.script(:load, <<-EOF.gsub(/^ {14}/, ''))
              if redis.call('SETNX', KEYS[1], ARGV[1]) == 1
              then
                redis.call('EXPIRE', KEYS[1], #{timeout})
                return 1
              else
                return 0
              end
            EOF
        end
evalsha(script, keys, argv, refresh: false) click to toggle source
# File lib/resque_admin/scheduler/lock/resilient.rb, line 27
def evalsha(script, keys, argv, refresh: false)
  sha_method_name = "#{script}_sha"
  ResqueAdmin.redis.evalsha(
    send(sha_method_name, refresh),
    keys: keys,
    argv: argv
  )
rescue Redis::CommandError => e
  if e.message =~ /NOSCRIPT/
    refresh = true
    retry
  end
  raise
end
locked_sha(refresh = false) click to toggle source
# File lib/resque_admin/scheduler/lock/resilient.rb, line 42
        def locked_sha(refresh = false)
          @locked_sha = nil if refresh

          @locked_sha ||=
            ResqueAdmin.redis.script(:load, <<-EOF.gsub(/^ {14}/, ''))
              if redis.call('GET', KEYS[1]) == ARGV[1]
              then
                redis.call('EXPIRE', KEYS[1], #{timeout})

                if redis.call('GET', KEYS[1]) == ARGV[1]
                then
                  return 1
                end
              end

              return 0
            EOF
        end