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