| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- --[[
- Function to clean job list.
- Returns jobIds and deleted count number.
- ]]
- -- Includes
- --- @include "getTimestamp"
- --- @include "isJobSchedulerJob"
- --- @include "removeJob"
- local function cleanList(listKey, jobKeyPrefix, rangeStart, rangeEnd,
- timestamp, isWaiting, jobSchedulersKey)
- 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) and
- not isJobSchedulerJob(job, jobKey, jobSchedulersKey) 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
|