| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- --[[
- Completely obliterates a queue and all of its contents
- This command completely destroys a queue including all of its jobs, current or past
- leaving no trace of its existence. Since this script needs to iterate to find all the job
- keys, consider that this call may be slow for very large queues.
- The queue needs to be "paused" or it will return an error
- If the queue has currently active jobs then the script by default will return error,
- however this behaviour can be overrided using the 'force' option.
-
- Input:
- KEYS[1] meta
- KEYS[2] base
- ARGV[1] count
- ARGV[2] force
- ]]
- local maxCount = tonumber(ARGV[1])
- local baseKey = KEYS[2]
- local rcall = redis.call
- -- Includes
- --- @include "includes/removeJobs"
- --- @include "includes/removeListJobs"
- --- @include "includes/removeZSetJobs"
- local function removeLockKeys(keys)
- for i, key in ipairs(keys) do
- rcall("DEL", baseKey .. key .. ':lock')
- end
- end
- -- 1) Check if paused, if not return with error.
- if rcall("HEXISTS", KEYS[1], "paused") ~= 1 then
- return -1 -- Error, NotPaused
- end
- -- 2) Check if there are active jobs, if there are and not "force" return error.
- local activeKey = baseKey .. 'active'
- local activeJobs = getListItems(activeKey, maxCount)
- if (#activeJobs > 0) then
- if(ARGV[2] == "") then
- return -2 -- Error, ExistActiveJobs
- end
- end
- removeLockKeys(activeJobs)
- maxCount = removeJobs(activeJobs, true, baseKey, maxCount)
- rcall("LTRIM", activeKey, #activeJobs, -1)
- if(maxCount <= 0) then
- return 1
- end
- local delayedKey = baseKey .. 'delayed'
- maxCount = removeZSetJobs(delayedKey, true, baseKey, maxCount)
- if(maxCount <= 0) then
- return 1
- end
- local repeatKey = baseKey .. 'repeat'
- local repeatJobsIds = getZSetItems(repeatKey, maxCount)
- for i, key in ipairs(repeatJobsIds) do
- local jobKey = repeatKey .. ":" .. key
- rcall("DEL", jobKey)
- end
- if(#repeatJobsIds > 0) then
- for from, to in batches(#repeatJobsIds, 7000) do
- rcall("ZREM", repeatKey, unpack(repeatJobsIds, from, to))
- end
- end
- maxCount = maxCount - #repeatJobsIds
- if(maxCount <= 0) then
- return 1
- end
- local completedKey = baseKey .. 'completed'
- maxCount = removeZSetJobs(completedKey, true, baseKey, maxCount)
- if(maxCount <= 0) then
- return 1
- end
- local waitKey = baseKey .. 'paused'
- maxCount = removeListJobs(waitKey, true, baseKey, maxCount)
- if(maxCount <= 0) then
- return 1
- end
- local prioritizedKey = baseKey .. 'prioritized'
- maxCount = removeZSetJobs(prioritizedKey, true, baseKey, maxCount)
- if(maxCount <= 0) then
- return 1
- end
- local failedKey = baseKey .. 'failed'
- maxCount = removeZSetJobs(failedKey, true, baseKey, maxCount)
- if(maxCount <= 0) then
- return 1
- end
- if(maxCount > 0) then
- rcall("DEL",
- baseKey .. 'events',
- baseKey .. 'delay',
- baseKey .. 'stalled-check',
- baseKey .. 'stalled',
- baseKey .. 'id',
- baseKey .. 'pc',
- baseKey .. 'marker',
- baseKey .. 'meta',
- baseKey .. 'metrics:completed',
- baseKey .. 'metrics:completed:data',
- baseKey .. 'metrics:failed',
- baseKey .. 'metrics:failed:data')
- return 0
- else
- return 1
- end
|