bullmq 5.47.1 → 5.47.3
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/async-fifo-queue.js.map +1 -1
- package/dist/cjs/classes/child.js.map +1 -1
- package/dist/cjs/classes/job-scheduler.js +1 -1
- package/dist/cjs/classes/job-scheduler.js.map +1 -1
- package/dist/cjs/classes/queue-base.js.map +1 -1
- package/dist/cjs/classes/queue-keys.js.map +1 -1
- package/dist/cjs/classes/repeat.js +1 -1
- package/dist/cjs/classes/repeat.js.map +1 -1
- package/dist/cjs/classes/scripts.js +1 -1
- package/dist/cjs/classes/scripts.js.map +1 -1
- package/dist/cjs/classes/worker.js.map +1 -1
- package/dist/cjs/commands/includes/{moveParentToFailedIfNeeded.lua → moveChildFromDependenciesIfNeeded.lua} +40 -29
- package/dist/cjs/commands/includes/moveParentToWaitIfNeeded.lua +2 -2
- package/dist/cjs/commands/moveStalledJobsToWait-9.lua +2 -31
- package/dist/cjs/commands/moveToFinished-14.lua +3 -23
- package/dist/cjs/commands/moveToWaitingChildren-8.lua +2 -32
- package/dist/cjs/scripts/addDelayedJob-6.js +2 -2
- package/dist/cjs/scripts/addParentJob-4.js +2 -2
- package/dist/cjs/scripts/addPrioritizedJob-8.js +2 -2
- package/dist/cjs/scripts/addStandardJob-8.js +2 -2
- package/dist/cjs/scripts/moveStalledJobsToWait-9.js +42 -60
- package/dist/cjs/scripts/moveStalledJobsToWait-9.js.map +1 -1
- package/dist/cjs/scripts/moveToFinished-14.js +43 -52
- package/dist/cjs/scripts/moveToFinished-14.js.map +1 -1
- package/dist/cjs/scripts/moveToWaitingChildren-8.js +42 -62
- package/dist/cjs/scripts/moveToWaitingChildren-8.js.map +1 -1
- package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/classes/async-fifo-queue.js.map +1 -1
- package/dist/esm/classes/child.js.map +1 -1
- package/dist/esm/classes/job-scheduler.js +1 -1
- package/dist/esm/classes/job-scheduler.js.map +1 -1
- package/dist/esm/classes/queue-base.js.map +1 -1
- package/dist/esm/classes/queue-keys.js.map +1 -1
- package/dist/esm/classes/repeat.js +1 -1
- package/dist/esm/classes/repeat.js.map +1 -1
- package/dist/esm/classes/scripts.js +1 -1
- package/dist/esm/classes/scripts.js.map +1 -1
- package/dist/esm/classes/worker.js.map +1 -1
- package/dist/esm/commands/includes/{moveParentToFailedIfNeeded.lua → moveChildFromDependenciesIfNeeded.lua} +40 -29
- package/dist/esm/commands/includes/moveParentToWaitIfNeeded.lua +2 -2
- package/dist/esm/commands/moveStalledJobsToWait-9.lua +2 -31
- package/dist/esm/commands/moveToFinished-14.lua +3 -23
- package/dist/esm/commands/moveToWaitingChildren-8.lua +2 -32
- package/dist/esm/scripts/addDelayedJob-6.js +2 -2
- package/dist/esm/scripts/addParentJob-4.js +2 -2
- package/dist/esm/scripts/addPrioritizedJob-8.js +2 -2
- package/dist/esm/scripts/addStandardJob-8.js +2 -2
- package/dist/esm/scripts/moveStalledJobsToWait-9.js +42 -60
- package/dist/esm/scripts/moveStalledJobsToWait-9.js.map +1 -1
- package/dist/esm/scripts/moveToFinished-14.js +43 -52
- package/dist/esm/scripts/moveToFinished-14.js.map +1 -1
- package/dist/esm/scripts/moveToWaitingChildren-8.js +42 -62
- package/dist/esm/scripts/moveToWaitingChildren-8.js.map +1 -1
- 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
@@ -26,7 +26,7 @@ local rcall = redis.call
|
|
26
26
|
--- @include "includes/addJobInTargetList"
|
27
27
|
--- @include "includes/batches"
|
28
28
|
--- @include "includes/getTargetQueueList"
|
29
|
-
--- @include "includes/
|
29
|
+
--- @include "includes/moveChildFromDependenciesIfNeeded"
|
30
30
|
--- @include "includes/moveParentToWaitIfNeeded"
|
31
31
|
--- @include "includes/moveParentToWait"
|
32
32
|
--- @include "includes/removeDeduplicationKeyIfNeeded"
|
@@ -93,36 +93,7 @@ if (#stalling > 0) then
|
|
93
93
|
rcall("XADD", eventStreamKey, "*", "event", "failed", "jobId", jobId, 'prev', 'active',
|
94
94
|
'failedReason', failedReason)
|
95
95
|
|
96
|
-
|
97
|
-
if opts['fpof'] or opts['cpof'] then
|
98
|
-
local parentData = cjson.decode(rawParentData)
|
99
|
-
-- TODO: need to remove this job from dependencies set in next breaking change
|
100
|
-
-- no for now as it would imply a breaking change
|
101
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
102
|
-
local unsuccesssfulSet = parentKey .. ":unsuccessful"
|
103
|
-
rcall("ZADD", unsuccesssfulSet, timestamp, jobKey)
|
104
|
-
|
105
|
-
if opts['fpof'] then
|
106
|
-
moveParentToFailedIfNeeded(parentData['queueKey'],
|
107
|
-
parentData['queueKey'] .. ':' .. parentData['id'], parentData['id'], jobKey,
|
108
|
-
timestamp)
|
109
|
-
elseif opts['cpof'] then
|
110
|
-
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
111
|
-
end
|
112
|
-
elseif opts['idof'] or opts['rdof'] then
|
113
|
-
local parentData = cjson.decode(rawParentData)
|
114
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
115
|
-
local dependenciesSet = parentKey .. ":dependencies"
|
116
|
-
if rcall("SREM", dependenciesSet, jobKey) == 1 then
|
117
|
-
moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet, parentKey,
|
118
|
-
parentData['id'], timestamp)
|
119
|
-
if opts['idof'] then
|
120
|
-
local failedSet = parentKey .. ":failed"
|
121
|
-
rcall("HSET", failedSet, jobKey, failedReason)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
96
|
+
moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
|
126
97
|
|
127
98
|
removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestamp)
|
128
99
|
|
@@ -64,7 +64,7 @@ local rcall = redis.call
|
|
64
64
|
--- @include "includes/getRateLimitTTL"
|
65
65
|
--- @include "includes/getTargetQueueList"
|
66
66
|
--- @include "includes/moveJobFromPriorityToActive"
|
67
|
-
--- @include "includes/
|
67
|
+
--- @include "includes/moveChildFromDependenciesIfNeeded"
|
68
68
|
--- @include "includes/moveParentToWait"
|
69
69
|
--- @include "includes/moveParentToWaitIfNeeded"
|
70
70
|
--- @include "includes/prepareJobForProcessing"
|
@@ -109,7 +109,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
|
|
109
109
|
local parentKey = jobAttributes[1] or ""
|
110
110
|
local parentId = ""
|
111
111
|
local parentQueueKey = ""
|
112
|
-
if jobAttributes[2] then
|
112
|
+
if jobAttributes[2] then -- TODO: need to revisit this logic if it's still needed
|
113
113
|
local jsonDecodedParent = cjson.decode(jobAttributes[2])
|
114
114
|
parentId = jsonDecodedParent['id']
|
115
115
|
parentQueueKey = jsonDecodedParent['queueKey']
|
@@ -152,27 +152,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
|
|
152
152
|
timestamp)
|
153
153
|
end
|
154
154
|
else
|
155
|
-
|
156
|
-
local unsuccesssfulSet = parentKey .. ":unsuccessful"
|
157
|
-
rcall("ZADD", unsuccesssfulSet, timestamp, jobIdKey)
|
158
|
-
|
159
|
-
if opts['fpof'] then
|
160
|
-
moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
|
161
|
-
elseif opts['cpof'] then
|
162
|
-
local failedSet = parentKey .. ":failed"
|
163
|
-
rcall("HSET", failedSet, jobIdKey, ARGV[4])
|
164
|
-
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
165
|
-
end
|
166
|
-
elseif opts['idof'] or opts['rdof'] then
|
167
|
-
local dependenciesSet = parentKey .. ":dependencies"
|
168
|
-
if rcall("SREM", dependenciesSet, jobIdKey) == 1 then
|
169
|
-
moveParentToWaitIfNeeded(parentQueueKey, dependenciesSet, parentKey, parentId, timestamp)
|
170
|
-
if opts['idof'] then
|
171
|
-
local failedSet = parentKey .. ":failed"
|
172
|
-
rcall("HSET", failedSet, jobIdKey, ARGV[4])
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
155
|
+
moveChildFromDependenciesIfNeeded(jobAttributes[2], jobIdKey, ARGV[4], timestamp)
|
176
156
|
end
|
177
157
|
end
|
178
158
|
|
@@ -36,7 +36,7 @@ local timestamp = ARGV[3]
|
|
36
36
|
local jobId = ARGV[4]
|
37
37
|
|
38
38
|
--- Includes
|
39
|
-
--- @include "includes/
|
39
|
+
--- @include "includes/moveChildFromDependenciesIfNeeded"
|
40
40
|
--- @include "includes/moveParentToWait"
|
41
41
|
--- @include "includes/moveParentToWaitIfNeeded"
|
42
42
|
--- @include "includes/removeDeduplicationKeyIfNeeded"
|
@@ -75,37 +75,7 @@ if rcall("EXISTS", jobKey) == 1 then
|
|
75
75
|
local rawOpts = jobAttributes[3]
|
76
76
|
local opts = cjson.decode(rawOpts)
|
77
77
|
|
78
|
-
|
79
|
-
if opts['fpof'] or opts['cpof'] then
|
80
|
-
local parentData = cjson.decode(rawParentData)
|
81
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
82
|
-
local parentUnsuccesssful = parentKey .. ":unsuccessful"
|
83
|
-
rcall("ZADD", parentUnsuccesssful, timestamp, jobKey)
|
84
|
-
if opts['fpof'] then
|
85
|
-
moveParentToFailedIfNeeded(
|
86
|
-
parentData['queueKey'],
|
87
|
-
parentData['queueKey'] .. ':' .. parentData['id'],
|
88
|
-
parentData['id'],
|
89
|
-
jobKey,
|
90
|
-
timestamp
|
91
|
-
)
|
92
|
-
elseif opts['cpof'] then
|
93
|
-
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
94
|
-
end
|
95
|
-
elseif opts['idof'] or opts['rdof'] then
|
96
|
-
local parentData = cjson.decode(rawParentData)
|
97
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
98
|
-
local dependenciesSet = parentKey .. ":dependencies"
|
99
|
-
if rcall("SREM", dependenciesSet, jobKey) == 1 then
|
100
|
-
moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet,
|
101
|
-
parentKey, parentData['id'], timestamp)
|
102
|
-
if opts['idof'] then
|
103
|
-
local failedSet = parentKey .. ":failed"
|
104
|
-
rcall("HSET", failedSet, jobKey, failedReason)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
78
|
+
moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
|
109
79
|
|
110
80
|
removeJobsOnFail(ARGV[5], failedKey, jobId, opts, timestamp)
|
111
81
|
|
@@ -273,8 +273,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
|
273
273
|
end
|
274
274
|
end
|
275
275
|
local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
|
276
|
-
local
|
277
|
-
if
|
276
|
+
local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
|
277
|
+
if doNotHavePendingDependencies then
|
278
278
|
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
279
279
|
end
|
280
280
|
end
|
@@ -229,8 +229,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
|
229
229
|
end
|
230
230
|
end
|
231
231
|
local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
|
232
|
-
local
|
233
|
-
if
|
232
|
+
local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
|
233
|
+
if doNotHavePendingDependencies then
|
234
234
|
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
235
235
|
end
|
236
236
|
end
|
@@ -266,8 +266,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
|
266
266
|
end
|
267
267
|
end
|
268
268
|
local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
|
269
|
-
local
|
270
|
-
if
|
269
|
+
local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
|
270
|
+
if doNotHavePendingDependencies then
|
271
271
|
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
272
272
|
end
|
273
273
|
end
|
@@ -239,8 +239,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
|
239
239
|
end
|
240
240
|
end
|
241
241
|
local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
|
242
|
-
local
|
243
|
-
if
|
242
|
+
local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
|
243
|
+
if doNotHavePendingDependencies then
|
244
244
|
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
245
245
|
end
|
246
246
|
end
|
@@ -178,8 +178,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
|
178
178
|
end
|
179
179
|
end
|
180
180
|
local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
|
181
|
-
local
|
182
|
-
if
|
181
|
+
local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
|
182
|
+
if doNotHavePendingDependencies then
|
183
183
|
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
184
184
|
end
|
185
185
|
end
|
@@ -365,7 +365,9 @@ local function removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestam
|
|
365
365
|
end
|
366
366
|
end
|
367
367
|
end
|
368
|
-
local
|
368
|
+
local moveParentToFailedIfNeeded
|
369
|
+
local moveChildFromDependenciesIfNeeded
|
370
|
+
moveParentToFailedIfNeeded = function (parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
|
369
371
|
if rcall("EXISTS", parentKey) == 1 then
|
370
372
|
local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
|
371
373
|
local parentDelayedKey = parentQueueKey .. ":delayed"
|
@@ -393,34 +395,7 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
|
|
393
395
|
failedReason, "prev", prevState)
|
394
396
|
local jobAttributes = rcall("HMGET", parentKey, "parent", "deid", "opts")
|
395
397
|
removeDeduplicationKeyIfNeeded(parentQueueKey .. ":", jobAttributes[2])
|
396
|
-
|
397
|
-
local parentData = cjson.decode(jobAttributes[1])
|
398
|
-
local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
399
|
-
local grandParentUnsuccesssful = grandParentKey .. ":unsuccessful"
|
400
|
-
rcall("ZADD", grandParentUnsuccesssful, timestamp, parentKey)
|
401
|
-
if parentData['fpof'] then
|
402
|
-
moveParentToFailedIfNeeded(
|
403
|
-
parentData['queueKey'],
|
404
|
-
parentData['queueKey'] .. ':' .. parentData['id'],
|
405
|
-
parentData['id'],
|
406
|
-
parentKey,
|
407
|
-
timestamp
|
408
|
-
)
|
409
|
-
elseif parentData['cpof'] then
|
410
|
-
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
411
|
-
elseif parentData['idof'] or parentData['rdof'] then
|
412
|
-
local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
413
|
-
local grandParentDependenciesSet = grandParentKey .. ":dependencies"
|
414
|
-
if rcall("SREM", grandParentDependenciesSet, parentKey) == 1 then
|
415
|
-
moveParentToWaitIfNeeded(parentData['queueKey'], grandParentDependenciesSet,
|
416
|
-
grandParentKey, parentData['id'], timestamp)
|
417
|
-
if parentData['idof'] then
|
418
|
-
local grandParentFailedSet = grandParentKey .. ":failed"
|
419
|
-
rcall("HSET", grandParentFailedSet, parentKey, failedReason)
|
420
|
-
end
|
421
|
-
end
|
422
|
-
end
|
423
|
-
end
|
398
|
+
moveChildFromDependenciesIfNeeded(jobAttributes[1], parentKey, failedReason, timestamp)
|
424
399
|
local parentRawOpts = jobAttributes[3]
|
425
400
|
local parentOpts = cjson.decode(parentRawOpts)
|
426
401
|
removeJobsOnFail(parentQueuePrefix, parentFailedKey, parentId, parentOpts, timestamp)
|
@@ -433,6 +408,41 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
|
|
433
408
|
end
|
434
409
|
end
|
435
410
|
end
|
411
|
+
moveChildFromDependenciesIfNeeded = function (rawParentData, childKey, failedReason, timestamp)
|
412
|
+
if rawParentData then
|
413
|
+
local parentData = cjson.decode(rawParentData)
|
414
|
+
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
415
|
+
local parentDependenciesChildrenKey = parentKey .. ":dependencies"
|
416
|
+
if parentData['fpof'] then
|
417
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
418
|
+
local parentUnsuccesssfulChildrenKey = parentKey .. ":unsuccessful"
|
419
|
+
rcall("ZADD", parentUnsuccesssfulChildrenKey, timestamp, childKey)
|
420
|
+
moveParentToFailedIfNeeded(
|
421
|
+
parentData['queueKey'],
|
422
|
+
parentKey,
|
423
|
+
parentData['id'],
|
424
|
+
childKey,
|
425
|
+
timestamp
|
426
|
+
)
|
427
|
+
end
|
428
|
+
elseif parentData['cpof'] then
|
429
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
430
|
+
local parentFailedChildrenKey = parentKey .. ":failed"
|
431
|
+
rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
|
432
|
+
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
433
|
+
end
|
434
|
+
elseif parentData['idof'] or parentData['rdof'] then
|
435
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
436
|
+
moveParentToWaitIfNeeded(parentData['queueKey'], parentDependenciesChildrenKey,
|
437
|
+
parentKey, parentData['id'], timestamp)
|
438
|
+
if parentData['idof'] then
|
439
|
+
local parentFailedChildrenKey = parentKey .. ":failed"
|
440
|
+
rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
|
441
|
+
end
|
442
|
+
end
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
436
446
|
--[[
|
437
447
|
Function to trim events, default 10000.
|
438
448
|
]]
|
@@ -507,35 +517,7 @@ if (#stalling > 0) then
|
|
507
517
|
rcall("HMSET", jobKey, "failedReason", failedReason, "finishedOn", timestamp)
|
508
518
|
rcall("XADD", eventStreamKey, "*", "event", "failed", "jobId", jobId, 'prev', 'active',
|
509
519
|
'failedReason', failedReason)
|
510
|
-
|
511
|
-
if opts['fpof'] or opts['cpof'] then
|
512
|
-
local parentData = cjson.decode(rawParentData)
|
513
|
-
-- TODO: need to remove this job from dependencies set in next breaking change
|
514
|
-
-- no for now as it would imply a breaking change
|
515
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
516
|
-
local unsuccesssfulSet = parentKey .. ":unsuccessful"
|
517
|
-
rcall("ZADD", unsuccesssfulSet, timestamp, jobKey)
|
518
|
-
if opts['fpof'] then
|
519
|
-
moveParentToFailedIfNeeded(parentData['queueKey'],
|
520
|
-
parentData['queueKey'] .. ':' .. parentData['id'], parentData['id'], jobKey,
|
521
|
-
timestamp)
|
522
|
-
elseif opts['cpof'] then
|
523
|
-
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
524
|
-
end
|
525
|
-
elseif opts['idof'] or opts['rdof'] then
|
526
|
-
local parentData = cjson.decode(rawParentData)
|
527
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
528
|
-
local dependenciesSet = parentKey .. ":dependencies"
|
529
|
-
if rcall("SREM", dependenciesSet, jobKey) == 1 then
|
530
|
-
moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet, parentKey,
|
531
|
-
parentData['id'], timestamp)
|
532
|
-
if opts['idof'] then
|
533
|
-
local failedSet = parentKey .. ":failed"
|
534
|
-
rcall("HSET", failedSet, jobKey, failedReason)
|
535
|
-
end
|
536
|
-
end
|
537
|
-
end
|
538
|
-
end
|
520
|
+
moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
|
539
521
|
removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestamp)
|
540
522
|
table.insert(failed, jobId)
|
541
523
|
else
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG
|
1
|
+
{"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6hBf,CAAC;AACW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
|
@@ -274,8 +274,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
|
274
274
|
end
|
275
275
|
end
|
276
276
|
local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
|
277
|
-
local
|
278
|
-
if
|
277
|
+
local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
|
278
|
+
if doNotHavePendingDependencies then
|
279
279
|
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
280
280
|
end
|
281
281
|
end
|
@@ -461,7 +461,9 @@ local function removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestam
|
|
461
461
|
end
|
462
462
|
end
|
463
463
|
end
|
464
|
-
local
|
464
|
+
local moveParentToFailedIfNeeded
|
465
|
+
local moveChildFromDependenciesIfNeeded
|
466
|
+
moveParentToFailedIfNeeded = function (parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
|
465
467
|
if rcall("EXISTS", parentKey) == 1 then
|
466
468
|
local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
|
467
469
|
local parentDelayedKey = parentQueueKey .. ":delayed"
|
@@ -489,34 +491,7 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
|
|
489
491
|
failedReason, "prev", prevState)
|
490
492
|
local jobAttributes = rcall("HMGET", parentKey, "parent", "deid", "opts")
|
491
493
|
removeDeduplicationKeyIfNeeded(parentQueueKey .. ":", jobAttributes[2])
|
492
|
-
|
493
|
-
local parentData = cjson.decode(jobAttributes[1])
|
494
|
-
local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
495
|
-
local grandParentUnsuccesssful = grandParentKey .. ":unsuccessful"
|
496
|
-
rcall("ZADD", grandParentUnsuccesssful, timestamp, parentKey)
|
497
|
-
if parentData['fpof'] then
|
498
|
-
moveParentToFailedIfNeeded(
|
499
|
-
parentData['queueKey'],
|
500
|
-
parentData['queueKey'] .. ':' .. parentData['id'],
|
501
|
-
parentData['id'],
|
502
|
-
parentKey,
|
503
|
-
timestamp
|
504
|
-
)
|
505
|
-
elseif parentData['cpof'] then
|
506
|
-
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
507
|
-
elseif parentData['idof'] or parentData['rdof'] then
|
508
|
-
local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
509
|
-
local grandParentDependenciesSet = grandParentKey .. ":dependencies"
|
510
|
-
if rcall("SREM", grandParentDependenciesSet, parentKey) == 1 then
|
511
|
-
moveParentToWaitIfNeeded(parentData['queueKey'], grandParentDependenciesSet,
|
512
|
-
grandParentKey, parentData['id'], timestamp)
|
513
|
-
if parentData['idof'] then
|
514
|
-
local grandParentFailedSet = grandParentKey .. ":failed"
|
515
|
-
rcall("HSET", grandParentFailedSet, parentKey, failedReason)
|
516
|
-
end
|
517
|
-
end
|
518
|
-
end
|
519
|
-
end
|
494
|
+
moveChildFromDependenciesIfNeeded(jobAttributes[1], parentKey, failedReason, timestamp)
|
520
495
|
local parentRawOpts = jobAttributes[3]
|
521
496
|
local parentOpts = cjson.decode(parentRawOpts)
|
522
497
|
removeJobsOnFail(parentQueuePrefix, parentFailedKey, parentId, parentOpts, timestamp)
|
@@ -529,6 +504,41 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
|
|
529
504
|
end
|
530
505
|
end
|
531
506
|
end
|
507
|
+
moveChildFromDependenciesIfNeeded = function (rawParentData, childKey, failedReason, timestamp)
|
508
|
+
if rawParentData then
|
509
|
+
local parentData = cjson.decode(rawParentData)
|
510
|
+
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
511
|
+
local parentDependenciesChildrenKey = parentKey .. ":dependencies"
|
512
|
+
if parentData['fpof'] then
|
513
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
514
|
+
local parentUnsuccesssfulChildrenKey = parentKey .. ":unsuccessful"
|
515
|
+
rcall("ZADD", parentUnsuccesssfulChildrenKey, timestamp, childKey)
|
516
|
+
moveParentToFailedIfNeeded(
|
517
|
+
parentData['queueKey'],
|
518
|
+
parentKey,
|
519
|
+
parentData['id'],
|
520
|
+
childKey,
|
521
|
+
timestamp
|
522
|
+
)
|
523
|
+
end
|
524
|
+
elseif parentData['cpof'] then
|
525
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
526
|
+
local parentFailedChildrenKey = parentKey .. ":failed"
|
527
|
+
rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
|
528
|
+
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
529
|
+
end
|
530
|
+
elseif parentData['idof'] or parentData['rdof'] then
|
531
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
532
|
+
moveParentToWaitIfNeeded(parentData['queueKey'], parentDependenciesChildrenKey,
|
533
|
+
parentKey, parentData['id'], timestamp)
|
534
|
+
if parentData['idof'] then
|
535
|
+
local parentFailedChildrenKey = parentKey .. ":failed"
|
536
|
+
rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
|
537
|
+
end
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
532
542
|
--[[
|
533
543
|
Function to move job from wait state to active.
|
534
544
|
Input:
|
@@ -685,7 +695,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
|
|
685
695
|
local parentKey = jobAttributes[1] or ""
|
686
696
|
local parentId = ""
|
687
697
|
local parentQueueKey = ""
|
688
|
-
if jobAttributes[2] then
|
698
|
+
if jobAttributes[2] then -- TODO: need to revisit this logic if it's still needed
|
689
699
|
local jsonDecodedParent = cjson.decode(jobAttributes[2])
|
690
700
|
parentId = jsonDecodedParent['id']
|
691
701
|
parentQueueKey = jsonDecodedParent['queueKey']
|
@@ -720,26 +730,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
|
|
720
730
|
timestamp)
|
721
731
|
end
|
722
732
|
else
|
723
|
-
|
724
|
-
local unsuccesssfulSet = parentKey .. ":unsuccessful"
|
725
|
-
rcall("ZADD", unsuccesssfulSet, timestamp, jobIdKey)
|
726
|
-
if opts['fpof'] then
|
727
|
-
moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
|
728
|
-
elseif opts['cpof'] then
|
729
|
-
local failedSet = parentKey .. ":failed"
|
730
|
-
rcall("HSET", failedSet, jobIdKey, ARGV[4])
|
731
|
-
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
732
|
-
end
|
733
|
-
elseif opts['idof'] or opts['rdof'] then
|
734
|
-
local dependenciesSet = parentKey .. ":dependencies"
|
735
|
-
if rcall("SREM", dependenciesSet, jobIdKey) == 1 then
|
736
|
-
moveParentToWaitIfNeeded(parentQueueKey, dependenciesSet, parentKey, parentId, timestamp)
|
737
|
-
if opts['idof'] then
|
738
|
-
local failedSet = parentKey .. ":failed"
|
739
|
-
rcall("HSET", failedSet, jobIdKey, ARGV[4])
|
740
|
-
end
|
741
|
-
end
|
742
|
-
end
|
733
|
+
moveChildFromDependenciesIfNeeded(jobAttributes[2], jobIdKey, ARGV[4], timestamp)
|
743
734
|
end
|
744
735
|
end
|
745
736
|
local attemptsMade = rcall("HINCRBY", jobIdKey, "atm", 1)
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"moveToFinished-14.js","sourceRoot":"","sources":["../../../src/scripts/moveToFinished-14.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG
|
1
|
+
{"version":3,"file":"moveToFinished-14.js","sourceRoot":"","sources":["../../../src/scripts/moveToFinished-14.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8zBf,CAAC;AACW,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}
|
@@ -175,8 +175,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
|
178
|
-
local
|
179
|
-
if
|
178
|
+
local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
|
179
|
+
if doNotHavePendingDependencies then
|
180
180
|
moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
|
181
181
|
end
|
182
182
|
end
|
@@ -362,7 +362,9 @@ local function removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestam
|
|
362
362
|
end
|
363
363
|
end
|
364
364
|
end
|
365
|
-
local
|
365
|
+
local moveParentToFailedIfNeeded
|
366
|
+
local moveChildFromDependenciesIfNeeded
|
367
|
+
moveParentToFailedIfNeeded = function (parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
|
366
368
|
if rcall("EXISTS", parentKey) == 1 then
|
367
369
|
local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
|
368
370
|
local parentDelayedKey = parentQueueKey .. ":delayed"
|
@@ -390,34 +392,7 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
|
|
390
392
|
failedReason, "prev", prevState)
|
391
393
|
local jobAttributes = rcall("HMGET", parentKey, "parent", "deid", "opts")
|
392
394
|
removeDeduplicationKeyIfNeeded(parentQueueKey .. ":", jobAttributes[2])
|
393
|
-
|
394
|
-
local parentData = cjson.decode(jobAttributes[1])
|
395
|
-
local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
396
|
-
local grandParentUnsuccesssful = grandParentKey .. ":unsuccessful"
|
397
|
-
rcall("ZADD", grandParentUnsuccesssful, timestamp, parentKey)
|
398
|
-
if parentData['fpof'] then
|
399
|
-
moveParentToFailedIfNeeded(
|
400
|
-
parentData['queueKey'],
|
401
|
-
parentData['queueKey'] .. ':' .. parentData['id'],
|
402
|
-
parentData['id'],
|
403
|
-
parentKey,
|
404
|
-
timestamp
|
405
|
-
)
|
406
|
-
elseif parentData['cpof'] then
|
407
|
-
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
408
|
-
elseif parentData['idof'] or parentData['rdof'] then
|
409
|
-
local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
410
|
-
local grandParentDependenciesSet = grandParentKey .. ":dependencies"
|
411
|
-
if rcall("SREM", grandParentDependenciesSet, parentKey) == 1 then
|
412
|
-
moveParentToWaitIfNeeded(parentData['queueKey'], grandParentDependenciesSet,
|
413
|
-
grandParentKey, parentData['id'], timestamp)
|
414
|
-
if parentData['idof'] then
|
415
|
-
local grandParentFailedSet = grandParentKey .. ":failed"
|
416
|
-
rcall("HSET", grandParentFailedSet, parentKey, failedReason)
|
417
|
-
end
|
418
|
-
end
|
419
|
-
end
|
420
|
-
end
|
395
|
+
moveChildFromDependenciesIfNeeded(jobAttributes[1], parentKey, failedReason, timestamp)
|
421
396
|
local parentRawOpts = jobAttributes[3]
|
422
397
|
local parentOpts = cjson.decode(parentRawOpts)
|
423
398
|
removeJobsOnFail(parentQueuePrefix, parentFailedKey, parentId, parentOpts, timestamp)
|
@@ -430,6 +405,41 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
|
|
430
405
|
end
|
431
406
|
end
|
432
407
|
end
|
408
|
+
moveChildFromDependenciesIfNeeded = function (rawParentData, childKey, failedReason, timestamp)
|
409
|
+
if rawParentData then
|
410
|
+
local parentData = cjson.decode(rawParentData)
|
411
|
+
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
412
|
+
local parentDependenciesChildrenKey = parentKey .. ":dependencies"
|
413
|
+
if parentData['fpof'] then
|
414
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
415
|
+
local parentUnsuccesssfulChildrenKey = parentKey .. ":unsuccessful"
|
416
|
+
rcall("ZADD", parentUnsuccesssfulChildrenKey, timestamp, childKey)
|
417
|
+
moveParentToFailedIfNeeded(
|
418
|
+
parentData['queueKey'],
|
419
|
+
parentKey,
|
420
|
+
parentData['id'],
|
421
|
+
childKey,
|
422
|
+
timestamp
|
423
|
+
)
|
424
|
+
end
|
425
|
+
elseif parentData['cpof'] then
|
426
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
427
|
+
local parentFailedChildrenKey = parentKey .. ":failed"
|
428
|
+
rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
|
429
|
+
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
430
|
+
end
|
431
|
+
elseif parentData['idof'] or parentData['rdof'] then
|
432
|
+
if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
|
433
|
+
moveParentToWaitIfNeeded(parentData['queueKey'], parentDependenciesChildrenKey,
|
434
|
+
parentKey, parentData['id'], timestamp)
|
435
|
+
if parentData['idof'] then
|
436
|
+
local parentFailedChildrenKey = parentKey .. ":failed"
|
437
|
+
rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
end
|
442
|
+
end
|
433
443
|
local function removeLock(jobKey, stalledKey, token, jobId)
|
434
444
|
if token ~= "0" then
|
435
445
|
local lockKey = jobKey .. ':lock'
|
@@ -472,37 +482,7 @@ if rcall("EXISTS", jobKey) == 1 then
|
|
472
482
|
local rawParentData = jobAttributes[1]
|
473
483
|
local rawOpts = jobAttributes[3]
|
474
484
|
local opts = cjson.decode(rawOpts)
|
475
|
-
|
476
|
-
if opts['fpof'] or opts['cpof'] then
|
477
|
-
local parentData = cjson.decode(rawParentData)
|
478
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
479
|
-
local parentUnsuccesssful = parentKey .. ":unsuccessful"
|
480
|
-
rcall("ZADD", parentUnsuccesssful, timestamp, jobKey)
|
481
|
-
if opts['fpof'] then
|
482
|
-
moveParentToFailedIfNeeded(
|
483
|
-
parentData['queueKey'],
|
484
|
-
parentData['queueKey'] .. ':' .. parentData['id'],
|
485
|
-
parentData['id'],
|
486
|
-
jobKey,
|
487
|
-
timestamp
|
488
|
-
)
|
489
|
-
elseif opts['cpof'] then
|
490
|
-
moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
|
491
|
-
end
|
492
|
-
elseif opts['idof'] or opts['rdof'] then
|
493
|
-
local parentData = cjson.decode(rawParentData)
|
494
|
-
local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
|
495
|
-
local dependenciesSet = parentKey .. ":dependencies"
|
496
|
-
if rcall("SREM", dependenciesSet, jobKey) == 1 then
|
497
|
-
moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet,
|
498
|
-
parentKey, parentData['id'], timestamp)
|
499
|
-
if opts['idof'] then
|
500
|
-
local failedSet = parentKey .. ":failed"
|
501
|
-
rcall("HSET", failedSet, jobKey, failedReason)
|
502
|
-
end
|
503
|
-
end
|
504
|
-
end
|
505
|
-
end
|
485
|
+
moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
|
506
486
|
removeJobsOnFail(ARGV[5], failedKey, jobId, opts, timestamp)
|
507
487
|
return 0
|
508
488
|
else
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"moveToWaitingChildren-8.js","sourceRoot":"","sources":["../../../src/scripts/moveToWaitingChildren-8.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG
|
1
|
+
{"version":3,"file":"moveToWaitingChildren-8.js","sourceRoot":"","sources":["../../../src/scripts/moveToWaitingChildren-8.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ff,CAAC;AACW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
|