bullmq
Version:
Queue for messages and jobs based on Redis
77 lines • 2.37 kB
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,
};
//# sourceMappingURL=removeOrphanedJobs-1.js.map