——– BEGIN keys ——— local digest = KEYS local queued = KEYS local primed = KEYS local locked = KEYS local info = KEYS local changelog = KEYS local digests = KEYS local expiring_digests = KEYS ——– END keys ———

——– BEGIN lock arguments ——— local job_id = ARGV local pttl = tonumber(ARGV) local lock_type = ARGV local limit = tonumber(ARGV) local lock_score = ARGV ——– END lock arguments ———–

——– BEGIN injected arguments ——– local current_time = tonumber(ARGV) local debug_lua = tostring(ARGV) == “1” local max_history = tonumber(ARGV) local script_name = tostring(ARGV) .. “.lua” local redisversion = ARGV ——— END injected arguments ———

——– BEGIN local functions ——– <%= include_partial “shared/_common.lua” %> ———- END local functions ———-

——— BEGIN lock.lua ——— log_debug(“BEGIN lock digest:”, digest, “job_id:”, job_id)

if redis.call(“HEXISTS”, locked, job_id) == 1 then

log_debug(locked, "already locked with job_id:", job_id)
log("Duplicate")

log_debug("LREM", queued, -1, job_id)
redis.call("LREM", queued, -1, job_id)

log_debug("LREM", primed, 1, job_id)
redis.call("LREM", primed, 1, job_id)

return job_id

end

local locked_count = redis.call(“HLEN”, locked) local within_limit = limit > locked_count local limit_exceeded = not within_limit

if limit_exceeded then

log_debug("Limit exceeded:", digest, "(",  locked_count, "of", limit, ")")
log("Limited")
return nil

end

if lock_type == “until_expired” and pttl and pttl > 0 then

log_debug("ZADD", expiring_digests, current_time + pttl, digest)
redis.call("ZADD", expiring_digests, current_time + pttl, digest)

else

local score

if #lock_score == 0 then
  score = current_time
else
  score = lock_score
end

log_debug("ZADD", digests, score, digest)
redis.call("ZADD", digests, score, digest)

end

log_debug(“HSET”, locked, job_id, current_time) redis.call(“HSET”, locked, job_id, current_time)

log_debug(“LREM”, queued, -1, job_id) redis.call(“LREM”, queued, -1, job_id)

log_debug(“LREM”, primed, 1, job_id) redis.call(“LREM”, primed, 1, job_id)

– The Sidekiq client sets pttl if pttl and pttl > 0 then

log_debug("PEXPIRE", digest, pttl)
redis.call("PEXPIRE", digest, pttl)

log_debug("PEXPIRE", locked, pttl)
redis.call("PEXPIRE", locked, pttl)

log_debug("PEXPIRE", info, pttl)
redis.call("PEXPIRE", info, pttl)

end

log_debug(“PEXPIRE”, queued, 1000) redis.call(“PEXPIRE”, queued, 1000)

log_debug(“PEXPIRE”, primed, 1000) redis.call(“PEXPIRE”, primed, 1000)

log(“Locked”) log_debug(“END lock digest:”, digest, “job_id:”, job_id) return job_id ———- END lock.lua ———-