| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- --[[
- 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
|