——– 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 ———-