You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							64 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							64 lines
						
					
					
						
							1.5 KiB
						
					
					
				| 'use strict';
 | |
| const content = `--[[
 | |
|   Attempts to retry all failed jobs
 | |
|   Input:
 | |
|     KEYS[1] base key
 | |
|     KEYS[2] failed state key
 | |
|     KEYS[3] wait state key
 | |
|     KEYS[4] 'meta-paused'
 | |
|     KEYS[5] 'paused'
 | |
|     ARGV[1]  count
 | |
|   Output:
 | |
|     1  means the operation is not completed
 | |
|     0  means the operation is completed
 | |
| ]]
 | |
| local baseKey = KEYS[1]
 | |
| local maxCount = tonumber(ARGV[1])
 | |
| local rcall = redis.call;
 | |
| -- Includes
 | |
| --[[
 | |
|   Function to loop in batches.
 | |
|   Just a bit of warning, some commands as ZREM
 | |
|   could receive a maximum of 7000 parameters per call.
 | |
| ]]
 | |
| local function batches(n, batchSize)
 | |
|   local i = 0
 | |
|   return function()
 | |
|     local from = i * batchSize + 1
 | |
|     i = i + 1
 | |
|     if (from <= n) then
 | |
|       local to = math.min(from + batchSize - 1, n)
 | |
|       return from, to
 | |
|     end
 | |
|   end
 | |
| end
 | |
| local function getZSetItems(keyName, max)
 | |
|     return rcall('ZRANGE', keyName, 0, max - 1)
 | |
| end
 | |
| local jobs = getZSetItems(KEYS[2], maxCount)
 | |
| if (#jobs > 0) then
 | |
|     for i, key in ipairs(jobs) do
 | |
|         local jobKey = baseKey .. key
 | |
|         rcall("HDEL", jobKey, "finishedOn", "processedOn", "failedReason")
 | |
|     end
 | |
|     local target
 | |
|     if rcall("EXISTS", KEYS[4]) ~= 1 then
 | |
|         target = KEYS[3]
 | |
|     else
 | |
|         target = KEYS[5]
 | |
|     end
 | |
|     for from, to in batches(#jobs, 7000) do
 | |
|         rcall("ZREM", KEYS[2], unpack(jobs, from, to))
 | |
|         rcall("LPUSH", target, unpack(jobs, from, to))
 | |
|     end
 | |
| end
 | |
| maxCount = maxCount - #jobs
 | |
| if (maxCount <= 0) then return 1 end
 | |
| return 0
 | |
| `;
 | |
| module.exports = {
 | |
|   name: 'retryJobs',
 | |
|   content,
 | |
|   keys: 5,
 | |
| };
 |