bullmq 5.41.8 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/classes/job-scheduler.js +14 -18
- package/dist/cjs/classes/job-scheduler.js.map +1 -1
- package/dist/cjs/classes/job.js +20 -13
- package/dist/cjs/classes/job.js.map +1 -1
- package/dist/cjs/classes/scripts.js +33 -3
- package/dist/cjs/classes/scripts.js.map +1 -1
- package/dist/cjs/classes/worker.js +4 -8
- package/dist/cjs/classes/worker.js.map +1 -1
- package/dist/cjs/commands/addJobScheduler-10.lua +9 -36
- package/dist/cjs/commands/includes/addJobFromScheduler.lua +41 -0
- package/dist/cjs/commands/includes/moveParentFromWaitingChildrenToFailed.lua +11 -1
- package/dist/cjs/commands/includes/removeJobKeys.lua +2 -2
- package/dist/cjs/commands/includes/storeJobScheduler.lua +1 -1
- package/dist/cjs/commands/moveStalledJobsToWait-9.lua +5 -0
- package/dist/cjs/commands/moveToFinished-14.lua +2 -0
- package/dist/cjs/commands/moveToWaitingChildren-8.lua +133 -0
- package/dist/cjs/commands/removeJob-3.lua +10 -0
- package/dist/{esm/commands/updateJobScheduler-7.lua → cjs/commands/updateJobScheduler-11.lua} +28 -21
- package/dist/cjs/scripts/addJobScheduler-10.js +80 -70
- package/dist/cjs/scripts/addJobScheduler-10.js.map +1 -1
- package/dist/cjs/scripts/addRepeatableJob-2.js +2 -2
- package/dist/cjs/scripts/cleanJobsInSet-3.js +2 -2
- package/dist/cjs/scripts/drain-5.js +2 -2
- package/dist/cjs/scripts/index.js +2 -2
- package/dist/cjs/scripts/index.js.map +1 -1
- package/dist/cjs/scripts/moveStalledJobsToWait-9.js +17 -3
- package/dist/cjs/scripts/moveStalledJobsToWait-9.js.map +1 -1
- package/dist/cjs/scripts/moveToFinished-14.js +14 -3
- package/dist/cjs/scripts/moveToFinished-14.js.map +1 -1
- package/dist/cjs/scripts/moveToWaitingChildren-8.js +549 -0
- package/dist/cjs/scripts/moveToWaitingChildren-8.js.map +1 -0
- package/dist/cjs/scripts/obliterate-2.js +2 -2
- package/dist/cjs/scripts/removeChildDependency-1.js +2 -2
- package/dist/cjs/scripts/removeJob-3.js +10 -2
- package/dist/cjs/scripts/removeJob-3.js.map +1 -1
- package/dist/cjs/scripts/removeJobScheduler-3.js +2 -2
- package/dist/cjs/scripts/removeRepeatable-3.js +2 -2
- package/dist/cjs/scripts/updateJobScheduler-11.js +246 -0
- package/dist/cjs/scripts/updateJobScheduler-11.js.map +1 -0
- package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/classes/job-scheduler.js +14 -18
- package/dist/esm/classes/job-scheduler.js.map +1 -1
- package/dist/esm/classes/job.js +20 -13
- package/dist/esm/classes/job.js.map +1 -1
- package/dist/esm/classes/scripts.d.ts +1 -1
- package/dist/esm/classes/scripts.js +33 -3
- package/dist/esm/classes/scripts.js.map +1 -1
- package/dist/esm/classes/worker.js +4 -8
- package/dist/esm/classes/worker.js.map +1 -1
- package/dist/esm/commands/addJobScheduler-10.lua +9 -36
- package/dist/esm/commands/includes/addJobFromScheduler.lua +41 -0
- package/dist/esm/commands/includes/moveParentFromWaitingChildrenToFailed.lua +11 -1
- package/dist/esm/commands/includes/removeJobKeys.lua +2 -2
- package/dist/esm/commands/includes/storeJobScheduler.lua +1 -1
- package/dist/esm/commands/moveStalledJobsToWait-9.lua +5 -0
- package/dist/esm/commands/moveToFinished-14.lua +2 -0
- package/dist/esm/commands/moveToWaitingChildren-8.lua +133 -0
- package/dist/esm/commands/removeJob-3.lua +10 -0
- package/dist/{cjs/commands/updateJobScheduler-7.lua → esm/commands/updateJobScheduler-11.lua} +28 -21
- package/dist/esm/scripts/addJobScheduler-10.js +80 -70
- package/dist/esm/scripts/addJobScheduler-10.js.map +1 -1
- package/dist/esm/scripts/addRepeatableJob-2.js +2 -2
- package/dist/esm/scripts/cleanJobsInSet-3.js +2 -2
- package/dist/esm/scripts/drain-5.js +2 -2
- package/dist/esm/scripts/index.d.ts +2 -2
- package/dist/esm/scripts/index.js +2 -2
- package/dist/esm/scripts/index.js.map +1 -1
- package/dist/esm/scripts/moveStalledJobsToWait-9.js +17 -3
- package/dist/esm/scripts/moveStalledJobsToWait-9.js.map +1 -1
- package/dist/esm/scripts/moveToFinished-14.js +14 -3
- package/dist/esm/scripts/moveToFinished-14.js.map +1 -1
- package/dist/esm/scripts/moveToWaitingChildren-8.js +546 -0
- package/dist/esm/scripts/moveToWaitingChildren-8.js.map +1 -0
- package/dist/esm/scripts/obliterate-2.js +2 -2
- package/dist/esm/scripts/removeChildDependency-1.js +2 -2
- package/dist/esm/scripts/removeJob-3.js +10 -2
- package/dist/esm/scripts/removeJob-3.js.map +1 -1
- package/dist/esm/scripts/removeJobScheduler-3.js +2 -2
- package/dist/esm/scripts/removeRepeatable-3.js +2 -2
- package/dist/esm/scripts/updateJobScheduler-11.js +243 -0
- package/dist/esm/scripts/updateJobScheduler-11.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/commands/moveToWaitingChildren-5.lua +0 -68
- package/dist/cjs/scripts/moveToWaitingChildren-5.js +0 -83
- package/dist/cjs/scripts/moveToWaitingChildren-5.js.map +0 -1
- package/dist/cjs/scripts/updateJobScheduler-7.js +0 -144
- package/dist/cjs/scripts/updateJobScheduler-7.js.map +0 -1
- package/dist/esm/commands/moveToWaitingChildren-5.lua +0 -68
- package/dist/esm/scripts/moveToWaitingChildren-5.js +0 -80
- package/dist/esm/scripts/moveToWaitingChildren-5.js.map +0 -1
- package/dist/esm/scripts/updateJobScheduler-7.js +0 -141
- package/dist/esm/scripts/updateJobScheduler-7.js.map +0 -1
- /package/dist/esm/scripts/{moveToWaitingChildren-5.d.ts → moveToWaitingChildren-8.d.ts} +0 -0
- /package/dist/esm/scripts/{updateJobScheduler-7.d.ts → updateJobScheduler-11.d.ts} +0 -0
@@ -1,68 +0,0 @@
|
|
1
|
-
--[[
|
2
|
-
Moves job from active to waiting children set.
|
3
|
-
|
4
|
-
Input:
|
5
|
-
KEYS[1] lock key
|
6
|
-
KEYS[2] active key
|
7
|
-
KEYS[3] waitChildrenKey key
|
8
|
-
KEYS[4] job key
|
9
|
-
KEYS[5] stalled key
|
10
|
-
|
11
|
-
ARGV[1] token
|
12
|
-
ARGV[2] child key
|
13
|
-
ARGV[3] timestamp
|
14
|
-
ARGV[4] the id of the job
|
15
|
-
|
16
|
-
Output:
|
17
|
-
0 - OK
|
18
|
-
1 - There are not pending dependencies.
|
19
|
-
-1 - Missing job.
|
20
|
-
-2 - Missing lock
|
21
|
-
-3 - Job not in active set
|
22
|
-
]]
|
23
|
-
local rcall = redis.call
|
24
|
-
local stalledKey = KEYS[5]
|
25
|
-
|
26
|
-
--- Includes
|
27
|
-
--- @include "includes/removeLock"
|
28
|
-
|
29
|
-
local function moveToWaitingChildren (activeKey, waitingChildrenKey, jobId,
|
30
|
-
timestamp)
|
31
|
-
local score = tonumber(timestamp)
|
32
|
-
|
33
|
-
local numRemovedElements = rcall("LREM", activeKey, -1, jobId)
|
34
|
-
|
35
|
-
if(numRemovedElements < 1) then
|
36
|
-
return -3
|
37
|
-
end
|
38
|
-
|
39
|
-
rcall("ZADD", waitingChildrenKey, score, jobId)
|
40
|
-
|
41
|
-
return 0
|
42
|
-
end
|
43
|
-
|
44
|
-
if rcall("EXISTS", KEYS[4]) == 1 then
|
45
|
-
if ARGV[2] ~= "" then
|
46
|
-
if rcall("SISMEMBER", KEYS[4] .. ":dependencies", ARGV[2]) ~= 0 then
|
47
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
48
|
-
if errorCode < 0 then
|
49
|
-
return errorCode
|
50
|
-
end
|
51
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
52
|
-
end
|
53
|
-
|
54
|
-
return 1
|
55
|
-
else
|
56
|
-
if rcall("SCARD", KEYS[4] .. ":dependencies") ~= 0 then
|
57
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
58
|
-
if errorCode < 0 then
|
59
|
-
return errorCode
|
60
|
-
end
|
61
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
62
|
-
end
|
63
|
-
|
64
|
-
return 1
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
return -1
|
@@ -1,83 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.moveToWaitingChildren = void 0;
|
4
|
-
const content = `--[[
|
5
|
-
Moves job from active to waiting children set.
|
6
|
-
Input:
|
7
|
-
KEYS[1] lock key
|
8
|
-
KEYS[2] active key
|
9
|
-
KEYS[3] waitChildrenKey key
|
10
|
-
KEYS[4] job key
|
11
|
-
KEYS[5] stalled key
|
12
|
-
ARGV[1] token
|
13
|
-
ARGV[2] child key
|
14
|
-
ARGV[3] timestamp
|
15
|
-
ARGV[4] the id of the job
|
16
|
-
Output:
|
17
|
-
0 - OK
|
18
|
-
1 - There are not pending dependencies.
|
19
|
-
-1 - Missing job.
|
20
|
-
-2 - Missing lock
|
21
|
-
-3 - Job not in active set
|
22
|
-
]]
|
23
|
-
local rcall = redis.call
|
24
|
-
local stalledKey = KEYS[5]
|
25
|
-
--- Includes
|
26
|
-
local function removeLock(jobKey, stalledKey, token, jobId)
|
27
|
-
if token ~= "0" then
|
28
|
-
local lockKey = jobKey .. ':lock'
|
29
|
-
local lockToken = rcall("GET", lockKey)
|
30
|
-
if lockToken == token then
|
31
|
-
rcall("DEL", lockKey)
|
32
|
-
rcall("SREM", stalledKey, jobId)
|
33
|
-
else
|
34
|
-
if lockToken then
|
35
|
-
-- Lock exists but token does not match
|
36
|
-
return -6
|
37
|
-
else
|
38
|
-
-- Lock is missing completely
|
39
|
-
return -2
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
return 0
|
44
|
-
end
|
45
|
-
local function moveToWaitingChildren (activeKey, waitingChildrenKey, jobId,
|
46
|
-
timestamp)
|
47
|
-
local score = tonumber(timestamp)
|
48
|
-
local numRemovedElements = rcall("LREM", activeKey, -1, jobId)
|
49
|
-
if(numRemovedElements < 1) then
|
50
|
-
return -3
|
51
|
-
end
|
52
|
-
rcall("ZADD", waitingChildrenKey, score, jobId)
|
53
|
-
return 0
|
54
|
-
end
|
55
|
-
if rcall("EXISTS", KEYS[4]) == 1 then
|
56
|
-
if ARGV[2] ~= "" then
|
57
|
-
if rcall("SISMEMBER", KEYS[4] .. ":dependencies", ARGV[2]) ~= 0 then
|
58
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
59
|
-
if errorCode < 0 then
|
60
|
-
return errorCode
|
61
|
-
end
|
62
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
63
|
-
end
|
64
|
-
return 1
|
65
|
-
else
|
66
|
-
if rcall("SCARD", KEYS[4] .. ":dependencies") ~= 0 then
|
67
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
68
|
-
if errorCode < 0 then
|
69
|
-
return errorCode
|
70
|
-
end
|
71
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
72
|
-
end
|
73
|
-
return 1
|
74
|
-
end
|
75
|
-
end
|
76
|
-
return -1
|
77
|
-
`;
|
78
|
-
exports.moveToWaitingChildren = {
|
79
|
-
name: 'moveToWaitingChildren',
|
80
|
-
content,
|
81
|
-
keys: 5,
|
82
|
-
};
|
83
|
-
//# sourceMappingURL=moveToWaitingChildren-5.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"moveToWaitingChildren-5.js","sourceRoot":"","sources":["../../../src/scripts/moveToWaitingChildren-5.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEf,CAAC;AACW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
|
@@ -1,144 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.updateJobScheduler = void 0;
|
4
|
-
const content = `--[[
|
5
|
-
Updates a job scheduler and adds next delayed job
|
6
|
-
Input:
|
7
|
-
KEYS[1] 'marker',
|
8
|
-
KEYS[2] 'meta'
|
9
|
-
KEYS[3] 'id'
|
10
|
-
KEYS[4] 'delayed'
|
11
|
-
KEYS[5] events stream key
|
12
|
-
KEYS[6] 'repeat' key
|
13
|
-
KEYS[7] producer key
|
14
|
-
ARGV[1] next milliseconds
|
15
|
-
ARGV[2] jobs scheduler id
|
16
|
-
ARGV[3] Json stringified delayed data
|
17
|
-
ARGV[4] msgpacked delayed opts
|
18
|
-
ARGV[5] timestamp
|
19
|
-
ARGV[6] prefix key
|
20
|
-
ARGV[7] producer id
|
21
|
-
Output:
|
22
|
-
next delayed job id - OK
|
23
|
-
]]
|
24
|
-
local rcall = redis.call
|
25
|
-
local repeatKey = KEYS[6]
|
26
|
-
local delayedKey = KEYS[4]
|
27
|
-
local nextMillis = ARGV[1]
|
28
|
-
local jobSchedulerId = ARGV[2]
|
29
|
-
local timestamp = ARGV[5]
|
30
|
-
local prefixKey = ARGV[6]
|
31
|
-
local producerId = ARGV[7]
|
32
|
-
-- Includes
|
33
|
-
--[[
|
34
|
-
Adds a delayed job to the queue by doing the following:
|
35
|
-
- Creates a new job key with the job data.
|
36
|
-
- adds to delayed zset.
|
37
|
-
- Emits a global event 'delayed' if the job is delayed.
|
38
|
-
]]
|
39
|
-
-- Includes
|
40
|
-
--[[
|
41
|
-
Add delay marker if needed.
|
42
|
-
]]
|
43
|
-
-- Includes
|
44
|
-
--[[
|
45
|
-
Function to return the next delayed job timestamp.
|
46
|
-
]]
|
47
|
-
local function getNextDelayedTimestamp(delayedKey)
|
48
|
-
local result = rcall("ZRANGE", delayedKey, 0, 0, "WITHSCORES")
|
49
|
-
if #result then
|
50
|
-
local nextTimestamp = tonumber(result[2])
|
51
|
-
if nextTimestamp ~= nil then
|
52
|
-
return nextTimestamp / 0x1000
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
local function addDelayMarkerIfNeeded(markerKey, delayedKey)
|
57
|
-
local nextTimestamp = getNextDelayedTimestamp(delayedKey)
|
58
|
-
if nextTimestamp ~= nil then
|
59
|
-
-- Replace the score of the marker with the newest known
|
60
|
-
-- next timestamp.
|
61
|
-
rcall("ZADD", markerKey, nextTimestamp, "1")
|
62
|
-
end
|
63
|
-
end
|
64
|
-
--[[
|
65
|
-
Bake in the job id first 12 bits into the timestamp
|
66
|
-
to guarantee correct execution order of delayed jobs
|
67
|
-
(up to 4096 jobs per given timestamp or 4096 jobs apart per timestamp)
|
68
|
-
WARNING: Jobs that are so far apart that they wrap around will cause FIFO to fail
|
69
|
-
]]
|
70
|
-
local function getDelayedScore(delayedKey, timestamp, delay)
|
71
|
-
local delayedTimestamp = (delay > 0 and (tonumber(timestamp) + delay)) or tonumber(timestamp)
|
72
|
-
local minScore = delayedTimestamp * 0x1000
|
73
|
-
local maxScore = (delayedTimestamp + 1 ) * 0x1000 - 1
|
74
|
-
local result = rcall("ZREVRANGEBYSCORE", delayedKey, maxScore,
|
75
|
-
minScore, "WITHSCORES","LIMIT", 0, 1)
|
76
|
-
if #result then
|
77
|
-
local currentMaxScore = tonumber(result[2])
|
78
|
-
if currentMaxScore ~= nil then
|
79
|
-
if currentMaxScore >= maxScore then
|
80
|
-
return maxScore, delayedTimestamp
|
81
|
-
else
|
82
|
-
return currentMaxScore + 1, delayedTimestamp
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
return minScore, delayedTimestamp
|
87
|
-
end
|
88
|
-
local function addDelayedJob(jobId, delayedKey, eventsKey, timestamp,
|
89
|
-
maxEvents, markerKey, delay)
|
90
|
-
local score, delayedTimestamp = getDelayedScore(delayedKey, timestamp, tonumber(delay))
|
91
|
-
rcall("ZADD", delayedKey, score, jobId)
|
92
|
-
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "delayed",
|
93
|
-
"jobId", jobId, "delay", delayedTimestamp)
|
94
|
-
-- mark that a delayed job is available
|
95
|
-
addDelayMarkerIfNeeded(markerKey, delayedKey)
|
96
|
-
end
|
97
|
-
--[[
|
98
|
-
Function to get max events value or set by default 10000.
|
99
|
-
]]
|
100
|
-
local function getOrSetMaxEvents(metaKey)
|
101
|
-
local maxEvents = rcall("HGET", metaKey, "opts.maxLenEvents")
|
102
|
-
if not maxEvents then
|
103
|
-
maxEvents = 10000
|
104
|
-
rcall("HSET", metaKey, "opts.maxLenEvents", maxEvents)
|
105
|
-
end
|
106
|
-
return maxEvents
|
107
|
-
end
|
108
|
-
local schedulerKey = repeatKey .. ":" .. jobSchedulerId
|
109
|
-
local nextDelayedJobId = "repeat:" .. jobSchedulerId .. ":" .. nextMillis
|
110
|
-
local nextDelayedJobKey = schedulerKey .. ":" .. nextMillis
|
111
|
-
-- Validate that scheduler exists.
|
112
|
-
local prevMillis = rcall("ZSCORE", repeatKey, jobSchedulerId)
|
113
|
-
if prevMillis ~= false then
|
114
|
-
local currentDelayedJobId = "repeat:" .. jobSchedulerId .. ":" .. prevMillis
|
115
|
-
if producerId == currentDelayedJobId then
|
116
|
-
local schedulerAttributes = rcall("HMGET", schedulerKey, "name", "data")
|
117
|
-
rcall("ZADD", repeatKey, nextMillis, jobSchedulerId)
|
118
|
-
rcall("HINCRBY", schedulerKey, "ic", 1)
|
119
|
-
local eventsKey = KEYS[5]
|
120
|
-
local metaKey = KEYS[2]
|
121
|
-
local maxEvents = getOrSetMaxEvents(metaKey)
|
122
|
-
rcall("INCR", KEYS[3])
|
123
|
-
local delayedOpts = cmsgpack.unpack(ARGV[4])
|
124
|
-
-- TODO: remove this workaround in next breaking change,
|
125
|
-
-- all job-schedulers must save job data
|
126
|
-
local templateData = schedulerAttributes[2] or ARGV[3]
|
127
|
-
if templateData and templateData ~= '{}' then
|
128
|
-
rcall("HSET", schedulerKey, "data", templateData)
|
129
|
-
end
|
130
|
-
addDelayedJob(nextDelayedJobKey, nextDelayedJobId, delayedKey, eventsKey, schedulerAttributes[1],
|
131
|
-
templateData or '{}', delayedOpts, timestamp, jobSchedulerId, maxEvents, KEYS[1], nil, nil)
|
132
|
-
if KEYS[7] ~= "" then
|
133
|
-
rcall("HSET", KEYS[7], "nrjid", nextDelayedJobId)
|
134
|
-
end
|
135
|
-
return nextDelayedJobId .. "" -- convert to string
|
136
|
-
end
|
137
|
-
end
|
138
|
-
`;
|
139
|
-
exports.updateJobScheduler = {
|
140
|
-
name: 'updateJobScheduler',
|
141
|
-
content,
|
142
|
-
keys: 7,
|
143
|
-
};
|
144
|
-
//# sourceMappingURL=updateJobScheduler-7.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"updateJobScheduler-7.js","sourceRoot":"","sources":["../../../src/scripts/updateJobScheduler-7.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsIf,CAAC;AACW,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,oBAAoB;IAC1B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
|
@@ -1,68 +0,0 @@
|
|
1
|
-
--[[
|
2
|
-
Moves job from active to waiting children set.
|
3
|
-
|
4
|
-
Input:
|
5
|
-
KEYS[1] lock key
|
6
|
-
KEYS[2] active key
|
7
|
-
KEYS[3] waitChildrenKey key
|
8
|
-
KEYS[4] job key
|
9
|
-
KEYS[5] stalled key
|
10
|
-
|
11
|
-
ARGV[1] token
|
12
|
-
ARGV[2] child key
|
13
|
-
ARGV[3] timestamp
|
14
|
-
ARGV[4] the id of the job
|
15
|
-
|
16
|
-
Output:
|
17
|
-
0 - OK
|
18
|
-
1 - There are not pending dependencies.
|
19
|
-
-1 - Missing job.
|
20
|
-
-2 - Missing lock
|
21
|
-
-3 - Job not in active set
|
22
|
-
]]
|
23
|
-
local rcall = redis.call
|
24
|
-
local stalledKey = KEYS[5]
|
25
|
-
|
26
|
-
--- Includes
|
27
|
-
--- @include "includes/removeLock"
|
28
|
-
|
29
|
-
local function moveToWaitingChildren (activeKey, waitingChildrenKey, jobId,
|
30
|
-
timestamp)
|
31
|
-
local score = tonumber(timestamp)
|
32
|
-
|
33
|
-
local numRemovedElements = rcall("LREM", activeKey, -1, jobId)
|
34
|
-
|
35
|
-
if(numRemovedElements < 1) then
|
36
|
-
return -3
|
37
|
-
end
|
38
|
-
|
39
|
-
rcall("ZADD", waitingChildrenKey, score, jobId)
|
40
|
-
|
41
|
-
return 0
|
42
|
-
end
|
43
|
-
|
44
|
-
if rcall("EXISTS", KEYS[4]) == 1 then
|
45
|
-
if ARGV[2] ~= "" then
|
46
|
-
if rcall("SISMEMBER", KEYS[4] .. ":dependencies", ARGV[2]) ~= 0 then
|
47
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
48
|
-
if errorCode < 0 then
|
49
|
-
return errorCode
|
50
|
-
end
|
51
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
52
|
-
end
|
53
|
-
|
54
|
-
return 1
|
55
|
-
else
|
56
|
-
if rcall("SCARD", KEYS[4] .. ":dependencies") ~= 0 then
|
57
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
58
|
-
if errorCode < 0 then
|
59
|
-
return errorCode
|
60
|
-
end
|
61
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
62
|
-
end
|
63
|
-
|
64
|
-
return 1
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
return -1
|
@@ -1,80 +0,0 @@
|
|
1
|
-
const content = `--[[
|
2
|
-
Moves job from active to waiting children set.
|
3
|
-
Input:
|
4
|
-
KEYS[1] lock key
|
5
|
-
KEYS[2] active key
|
6
|
-
KEYS[3] waitChildrenKey key
|
7
|
-
KEYS[4] job key
|
8
|
-
KEYS[5] stalled key
|
9
|
-
ARGV[1] token
|
10
|
-
ARGV[2] child key
|
11
|
-
ARGV[3] timestamp
|
12
|
-
ARGV[4] the id of the job
|
13
|
-
Output:
|
14
|
-
0 - OK
|
15
|
-
1 - There are not pending dependencies.
|
16
|
-
-1 - Missing job.
|
17
|
-
-2 - Missing lock
|
18
|
-
-3 - Job not in active set
|
19
|
-
]]
|
20
|
-
local rcall = redis.call
|
21
|
-
local stalledKey = KEYS[5]
|
22
|
-
--- Includes
|
23
|
-
local function removeLock(jobKey, stalledKey, token, jobId)
|
24
|
-
if token ~= "0" then
|
25
|
-
local lockKey = jobKey .. ':lock'
|
26
|
-
local lockToken = rcall("GET", lockKey)
|
27
|
-
if lockToken == token then
|
28
|
-
rcall("DEL", lockKey)
|
29
|
-
rcall("SREM", stalledKey, jobId)
|
30
|
-
else
|
31
|
-
if lockToken then
|
32
|
-
-- Lock exists but token does not match
|
33
|
-
return -6
|
34
|
-
else
|
35
|
-
-- Lock is missing completely
|
36
|
-
return -2
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
return 0
|
41
|
-
end
|
42
|
-
local function moveToWaitingChildren (activeKey, waitingChildrenKey, jobId,
|
43
|
-
timestamp)
|
44
|
-
local score = tonumber(timestamp)
|
45
|
-
local numRemovedElements = rcall("LREM", activeKey, -1, jobId)
|
46
|
-
if(numRemovedElements < 1) then
|
47
|
-
return -3
|
48
|
-
end
|
49
|
-
rcall("ZADD", waitingChildrenKey, score, jobId)
|
50
|
-
return 0
|
51
|
-
end
|
52
|
-
if rcall("EXISTS", KEYS[4]) == 1 then
|
53
|
-
if ARGV[2] ~= "" then
|
54
|
-
if rcall("SISMEMBER", KEYS[4] .. ":dependencies", ARGV[2]) ~= 0 then
|
55
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
56
|
-
if errorCode < 0 then
|
57
|
-
return errorCode
|
58
|
-
end
|
59
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
60
|
-
end
|
61
|
-
return 1
|
62
|
-
else
|
63
|
-
if rcall("SCARD", KEYS[4] .. ":dependencies") ~= 0 then
|
64
|
-
local errorCode = removeLock(KEYS[4], stalledKey, ARGV[1], ARGV[4])
|
65
|
-
if errorCode < 0 then
|
66
|
-
return errorCode
|
67
|
-
end
|
68
|
-
return moveToWaitingChildren(KEYS[2], KEYS[3], ARGV[4], ARGV[3])
|
69
|
-
end
|
70
|
-
return 1
|
71
|
-
end
|
72
|
-
end
|
73
|
-
return -1
|
74
|
-
`;
|
75
|
-
export const moveToWaitingChildren = {
|
76
|
-
name: 'moveToWaitingChildren',
|
77
|
-
content,
|
78
|
-
keys: 5,
|
79
|
-
};
|
80
|
-
//# sourceMappingURL=moveToWaitingChildren-5.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"moveToWaitingChildren-5.js","sourceRoot":"","sources":["../../../src/scripts/moveToWaitingChildren-5.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEf,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
|
@@ -1,141 +0,0 @@
|
|
1
|
-
const content = `--[[
|
2
|
-
Updates a job scheduler and adds next delayed job
|
3
|
-
Input:
|
4
|
-
KEYS[1] 'marker',
|
5
|
-
KEYS[2] 'meta'
|
6
|
-
KEYS[3] 'id'
|
7
|
-
KEYS[4] 'delayed'
|
8
|
-
KEYS[5] events stream key
|
9
|
-
KEYS[6] 'repeat' key
|
10
|
-
KEYS[7] producer key
|
11
|
-
ARGV[1] next milliseconds
|
12
|
-
ARGV[2] jobs scheduler id
|
13
|
-
ARGV[3] Json stringified delayed data
|
14
|
-
ARGV[4] msgpacked delayed opts
|
15
|
-
ARGV[5] timestamp
|
16
|
-
ARGV[6] prefix key
|
17
|
-
ARGV[7] producer id
|
18
|
-
Output:
|
19
|
-
next delayed job id - OK
|
20
|
-
]]
|
21
|
-
local rcall = redis.call
|
22
|
-
local repeatKey = KEYS[6]
|
23
|
-
local delayedKey = KEYS[4]
|
24
|
-
local nextMillis = ARGV[1]
|
25
|
-
local jobSchedulerId = ARGV[2]
|
26
|
-
local timestamp = ARGV[5]
|
27
|
-
local prefixKey = ARGV[6]
|
28
|
-
local producerId = ARGV[7]
|
29
|
-
-- Includes
|
30
|
-
--[[
|
31
|
-
Adds a delayed job to the queue by doing the following:
|
32
|
-
- Creates a new job key with the job data.
|
33
|
-
- adds to delayed zset.
|
34
|
-
- Emits a global event 'delayed' if the job is delayed.
|
35
|
-
]]
|
36
|
-
-- Includes
|
37
|
-
--[[
|
38
|
-
Add delay marker if needed.
|
39
|
-
]]
|
40
|
-
-- Includes
|
41
|
-
--[[
|
42
|
-
Function to return the next delayed job timestamp.
|
43
|
-
]]
|
44
|
-
local function getNextDelayedTimestamp(delayedKey)
|
45
|
-
local result = rcall("ZRANGE", delayedKey, 0, 0, "WITHSCORES")
|
46
|
-
if #result then
|
47
|
-
local nextTimestamp = tonumber(result[2])
|
48
|
-
if nextTimestamp ~= nil then
|
49
|
-
return nextTimestamp / 0x1000
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
local function addDelayMarkerIfNeeded(markerKey, delayedKey)
|
54
|
-
local nextTimestamp = getNextDelayedTimestamp(delayedKey)
|
55
|
-
if nextTimestamp ~= nil then
|
56
|
-
-- Replace the score of the marker with the newest known
|
57
|
-
-- next timestamp.
|
58
|
-
rcall("ZADD", markerKey, nextTimestamp, "1")
|
59
|
-
end
|
60
|
-
end
|
61
|
-
--[[
|
62
|
-
Bake in the job id first 12 bits into the timestamp
|
63
|
-
to guarantee correct execution order of delayed jobs
|
64
|
-
(up to 4096 jobs per given timestamp or 4096 jobs apart per timestamp)
|
65
|
-
WARNING: Jobs that are so far apart that they wrap around will cause FIFO to fail
|
66
|
-
]]
|
67
|
-
local function getDelayedScore(delayedKey, timestamp, delay)
|
68
|
-
local delayedTimestamp = (delay > 0 and (tonumber(timestamp) + delay)) or tonumber(timestamp)
|
69
|
-
local minScore = delayedTimestamp * 0x1000
|
70
|
-
local maxScore = (delayedTimestamp + 1 ) * 0x1000 - 1
|
71
|
-
local result = rcall("ZREVRANGEBYSCORE", delayedKey, maxScore,
|
72
|
-
minScore, "WITHSCORES","LIMIT", 0, 1)
|
73
|
-
if #result then
|
74
|
-
local currentMaxScore = tonumber(result[2])
|
75
|
-
if currentMaxScore ~= nil then
|
76
|
-
if currentMaxScore >= maxScore then
|
77
|
-
return maxScore, delayedTimestamp
|
78
|
-
else
|
79
|
-
return currentMaxScore + 1, delayedTimestamp
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
return minScore, delayedTimestamp
|
84
|
-
end
|
85
|
-
local function addDelayedJob(jobId, delayedKey, eventsKey, timestamp,
|
86
|
-
maxEvents, markerKey, delay)
|
87
|
-
local score, delayedTimestamp = getDelayedScore(delayedKey, timestamp, tonumber(delay))
|
88
|
-
rcall("ZADD", delayedKey, score, jobId)
|
89
|
-
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "delayed",
|
90
|
-
"jobId", jobId, "delay", delayedTimestamp)
|
91
|
-
-- mark that a delayed job is available
|
92
|
-
addDelayMarkerIfNeeded(markerKey, delayedKey)
|
93
|
-
end
|
94
|
-
--[[
|
95
|
-
Function to get max events value or set by default 10000.
|
96
|
-
]]
|
97
|
-
local function getOrSetMaxEvents(metaKey)
|
98
|
-
local maxEvents = rcall("HGET", metaKey, "opts.maxLenEvents")
|
99
|
-
if not maxEvents then
|
100
|
-
maxEvents = 10000
|
101
|
-
rcall("HSET", metaKey, "opts.maxLenEvents", maxEvents)
|
102
|
-
end
|
103
|
-
return maxEvents
|
104
|
-
end
|
105
|
-
local schedulerKey = repeatKey .. ":" .. jobSchedulerId
|
106
|
-
local nextDelayedJobId = "repeat:" .. jobSchedulerId .. ":" .. nextMillis
|
107
|
-
local nextDelayedJobKey = schedulerKey .. ":" .. nextMillis
|
108
|
-
-- Validate that scheduler exists.
|
109
|
-
local prevMillis = rcall("ZSCORE", repeatKey, jobSchedulerId)
|
110
|
-
if prevMillis ~= false then
|
111
|
-
local currentDelayedJobId = "repeat:" .. jobSchedulerId .. ":" .. prevMillis
|
112
|
-
if producerId == currentDelayedJobId then
|
113
|
-
local schedulerAttributes = rcall("HMGET", schedulerKey, "name", "data")
|
114
|
-
rcall("ZADD", repeatKey, nextMillis, jobSchedulerId)
|
115
|
-
rcall("HINCRBY", schedulerKey, "ic", 1)
|
116
|
-
local eventsKey = KEYS[5]
|
117
|
-
local metaKey = KEYS[2]
|
118
|
-
local maxEvents = getOrSetMaxEvents(metaKey)
|
119
|
-
rcall("INCR", KEYS[3])
|
120
|
-
local delayedOpts = cmsgpack.unpack(ARGV[4])
|
121
|
-
-- TODO: remove this workaround in next breaking change,
|
122
|
-
-- all job-schedulers must save job data
|
123
|
-
local templateData = schedulerAttributes[2] or ARGV[3]
|
124
|
-
if templateData and templateData ~= '{}' then
|
125
|
-
rcall("HSET", schedulerKey, "data", templateData)
|
126
|
-
end
|
127
|
-
addDelayedJob(nextDelayedJobKey, nextDelayedJobId, delayedKey, eventsKey, schedulerAttributes[1],
|
128
|
-
templateData or '{}', delayedOpts, timestamp, jobSchedulerId, maxEvents, KEYS[1], nil, nil)
|
129
|
-
if KEYS[7] ~= "" then
|
130
|
-
rcall("HSET", KEYS[7], "nrjid", nextDelayedJobId)
|
131
|
-
end
|
132
|
-
return nextDelayedJobId .. "" -- convert to string
|
133
|
-
end
|
134
|
-
end
|
135
|
-
`;
|
136
|
-
export const updateJobScheduler = {
|
137
|
-
name: 'updateJobScheduler',
|
138
|
-
content,
|
139
|
-
keys: 7,
|
140
|
-
};
|
141
|
-
//# sourceMappingURL=updateJobScheduler-7.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"updateJobScheduler-7.js","sourceRoot":"","sources":["../../../src/scripts/updateJobScheduler-7.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsIf,CAAC;AACF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,oBAAoB;IAC1B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
|
File without changes
|
File without changes
|