77 lines
2.3 KiB
JavaScript
77 lines
2.3 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.removeOrphanedJobs = void 0;
|
|
const content = `--[[
|
|
Removes orphaned job keys that exist in Redis but are not referenced
|
|
in any queue state set. Checks each candidate atomically.
|
|
Input:
|
|
KEYS[1] base prefix key including trailing colon (e.g. bull:queueName:)
|
|
ARGV[1] number of state key suffixes
|
|
ARGV[2 .. 1+N] state key suffixes (e.g. active, wait, completed, ...)
|
|
ARGV[2+N] number of job sub-key suffixes
|
|
ARGV[3+N .. 2+N+M] job sub-key suffixes (e.g. logs, dependencies, ...)
|
|
ARGV[3+N+M .. end] candidate job IDs to check
|
|
Output:
|
|
number of removed jobs
|
|
]]
|
|
local rcall = redis.call
|
|
local basePrefix = KEYS[1]
|
|
-- Parse state key suffixes and cache their full key names + types.
|
|
local stateKeyCount = tonumber(ARGV[1])
|
|
local stateKeys = {}
|
|
local stateKeyTypes = {}
|
|
for i = 1, stateKeyCount do
|
|
local fullKey = basePrefix .. ARGV[1 + i]
|
|
stateKeys[i] = fullKey
|
|
stateKeyTypes[i] = rcall('TYPE', fullKey)['ok']
|
|
end
|
|
-- Parse job sub-key suffixes.
|
|
local subKeyCountIdx = 2 + stateKeyCount
|
|
local subKeyCount = tonumber(ARGV[subKeyCountIdx])
|
|
local subKeySuffixes = {}
|
|
for i = 1, subKeyCount do
|
|
subKeySuffixes[i] = ARGV[subKeyCountIdx + i]
|
|
end
|
|
-- Process candidate job IDs.
|
|
local candidateStart = subKeyCountIdx + subKeyCount + 1
|
|
local removedCount = 0
|
|
for c = candidateStart, #ARGV do
|
|
local jobId = ARGV[c]
|
|
local found = false
|
|
for i = 1, stateKeyCount do
|
|
local kt = stateKeyTypes[i]
|
|
if kt == 'list' then
|
|
if rcall('LPOS', stateKeys[i], jobId) then
|
|
found = true
|
|
break
|
|
end
|
|
elseif kt == 'zset' then
|
|
if rcall('ZSCORE', stateKeys[i], jobId) then
|
|
found = true
|
|
break
|
|
end
|
|
elseif kt == 'set' then
|
|
if rcall('SISMEMBER', stateKeys[i], jobId) == 1 then
|
|
found = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
if not found then
|
|
local jobKey = basePrefix .. jobId
|
|
local keysToDelete = { jobKey }
|
|
for _, suffix in ipairs(subKeySuffixes) do
|
|
keysToDelete[#keysToDelete + 1] = jobKey .. ':' .. suffix
|
|
end
|
|
rcall('DEL', unpack(keysToDelete))
|
|
removedCount = removedCount + 1
|
|
end
|
|
end
|
|
return removedCount
|
|
`;
|
|
exports.removeOrphanedJobs = {
|
|
name: 'removeOrphanedJobs',
|
|
content,
|
|
keys: 1,
|
|
};
|