--[[ Function to clean job list. Returns jobIds and deleted count number. ]] -- Includes --- @include "getTimestamp" --- @include "removeJob" local function cleanList(listKey, jobKeyPrefix, rangeStart, rangeEnd, timestamp, isWaiting) local jobs = rcall("LRANGE", listKey, rangeStart, rangeEnd) local deleted = {} local deletedCount = 0 local jobTS local deletionMarker = '' local jobIdsLen = #jobs for i, job in ipairs(jobs) do if limit > 0 and deletedCount >= limit then break end local jobKey = jobKeyPrefix .. job if (isWaiting or rcall("EXISTS", jobKey .. ":lock") == 0) then -- Find the right timestamp of the job to compare to maxTimestamp: -- * finishedOn says when the job was completed, but it isn't set unless the job has actually completed -- * processedOn represents when the job was last attempted, but it doesn't get populated until -- the job is first tried -- * timestamp is the original job submission time -- Fetch all three of these (in that order) and use the first one that is set so that we'll leave jobs -- that have been active within the grace period: jobTS = getTimestamp(jobKey, {"finishedOn", "processedOn", "timestamp"}) if (not jobTS or jobTS <= timestamp) then -- replace the entry with a deletion marker; the actual deletion will -- occur at the end of the script rcall("LSET", listKey, rangeEnd - jobIdsLen + i, deletionMarker) removeJob(job, true, jobKeyPrefix, true --[[remove debounce key]]) deletedCount = deletedCount + 1 table.insert(deleted, job) end end end rcall("LREM", listKey, 0, deletionMarker) return {deleted, deletedCount} end