bullmq 5.15.0 → 5.16.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.
Files changed (99) hide show
  1. package/dist/cjs/classes/job-scheduler.js +140 -0
  2. package/dist/cjs/classes/job-scheduler.js.map +1 -0
  3. package/dist/cjs/classes/job.js +1 -1
  4. package/dist/cjs/classes/job.js.map +1 -1
  5. package/dist/cjs/classes/queue.js +64 -0
  6. package/dist/cjs/classes/queue.js.map +1 -1
  7. package/dist/cjs/classes/repeat.js +9 -10
  8. package/dist/cjs/classes/repeat.js.map +1 -1
  9. package/dist/cjs/classes/scripts.js +45 -39
  10. package/dist/cjs/classes/scripts.js.map +1 -1
  11. package/dist/cjs/classes/worker.js +23 -4
  12. package/dist/cjs/classes/worker.js.map +1 -1
  13. package/dist/cjs/commands/addJobScheduler-2.lua +75 -0
  14. package/dist/cjs/commands/{cleanJobsInSet-2.lua → cleanJobsInSet-3.lua} +6 -5
  15. package/dist/cjs/commands/drain-5.lua +41 -0
  16. package/dist/cjs/commands/includes/cleanSet.lua +50 -29
  17. package/dist/cjs/commands/includes/removeZSetJobs.lua +13 -1
  18. package/dist/cjs/commands/moveStalledJobsToWait-9.lua +2 -4
  19. package/dist/cjs/commands/removeJob-2.lua +17 -9
  20. package/dist/cjs/commands/removeJobScheduler-3.lua +43 -0
  21. package/dist/cjs/enums/error-code.js +1 -0
  22. package/dist/cjs/enums/error-code.js.map +1 -1
  23. package/dist/cjs/scripts/addJobScheduler-2.js +223 -0
  24. package/dist/cjs/scripts/addJobScheduler-2.js.map +1 -0
  25. package/dist/cjs/scripts/{cleanJobsInSet-2.js → cleanJobsInSet-3.js} +57 -35
  26. package/dist/cjs/scripts/{cleanJobsInSet-2.js.map → cleanJobsInSet-3.js.map} +1 -1
  27. package/dist/cjs/scripts/{drain-4.js → drain-5.js} +28 -7
  28. package/dist/cjs/scripts/drain-5.js.map +1 -0
  29. package/dist/cjs/scripts/index.js +4 -2
  30. package/dist/cjs/scripts/index.js.map +1 -1
  31. package/dist/cjs/scripts/moveStalledJobsToWait-9.js +2 -3
  32. package/dist/cjs/scripts/moveStalledJobsToWait-9.js.map +1 -1
  33. package/dist/cjs/scripts/obliterate-2.js +11 -1
  34. package/dist/cjs/scripts/obliterate-2.js.map +1 -1
  35. package/dist/cjs/scripts/removeJob-2.js +16 -9
  36. package/dist/cjs/scripts/removeJob-2.js.map +1 -1
  37. package/dist/cjs/scripts/removeJobScheduler-3.js +49 -0
  38. package/dist/cjs/scripts/removeJobScheduler-3.js.map +1 -0
  39. package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
  40. package/dist/cjs/utils.js +25 -1
  41. package/dist/cjs/utils.js.map +1 -1
  42. package/dist/esm/classes/job-scheduler.d.ts +30 -0
  43. package/dist/esm/classes/job-scheduler.js +135 -0
  44. package/dist/esm/classes/job-scheduler.js.map +1 -0
  45. package/dist/esm/classes/job.d.ts +1 -1
  46. package/dist/esm/classes/job.js +2 -2
  47. package/dist/esm/classes/job.js.map +1 -1
  48. package/dist/esm/classes/queue.d.ts +47 -0
  49. package/dist/esm/classes/queue.js +64 -0
  50. package/dist/esm/classes/queue.js.map +1 -1
  51. package/dist/esm/classes/repeat.js +9 -10
  52. package/dist/esm/classes/repeat.js.map +1 -1
  53. package/dist/esm/classes/scripts.d.ts +3 -7
  54. package/dist/esm/classes/scripts.js +46 -40
  55. package/dist/esm/classes/scripts.js.map +1 -1
  56. package/dist/esm/classes/worker.d.ts +3 -0
  57. package/dist/esm/classes/worker.js +23 -4
  58. package/dist/esm/classes/worker.js.map +1 -1
  59. package/dist/esm/commands/addJobScheduler-2.lua +75 -0
  60. package/dist/esm/commands/{cleanJobsInSet-2.lua → cleanJobsInSet-3.lua} +6 -5
  61. package/dist/esm/commands/drain-5.lua +41 -0
  62. package/dist/esm/commands/includes/cleanSet.lua +50 -29
  63. package/dist/esm/commands/includes/removeZSetJobs.lua +13 -1
  64. package/dist/esm/commands/moveStalledJobsToWait-9.lua +2 -4
  65. package/dist/esm/commands/removeJob-2.lua +17 -9
  66. package/dist/esm/commands/removeJobScheduler-3.lua +43 -0
  67. package/dist/esm/enums/error-code.d.ts +2 -1
  68. package/dist/esm/enums/error-code.js +1 -0
  69. package/dist/esm/enums/error-code.js.map +1 -1
  70. package/dist/esm/scripts/addJobScheduler-2.d.ts +5 -0
  71. package/dist/esm/scripts/addJobScheduler-2.js +220 -0
  72. package/dist/esm/scripts/addJobScheduler-2.js.map +1 -0
  73. package/dist/esm/scripts/{cleanJobsInSet-2.js → cleanJobsInSet-3.js} +57 -35
  74. package/dist/esm/scripts/{cleanJobsInSet-2.js.map → cleanJobsInSet-3.js.map} +1 -1
  75. package/dist/esm/scripts/{drain-4.js → drain-5.js} +28 -7
  76. package/dist/esm/scripts/drain-5.js.map +1 -0
  77. package/dist/esm/scripts/index.d.ts +4 -2
  78. package/dist/esm/scripts/index.js +4 -2
  79. package/dist/esm/scripts/index.js.map +1 -1
  80. package/dist/esm/scripts/moveStalledJobsToWait-9.js +2 -3
  81. package/dist/esm/scripts/moveStalledJobsToWait-9.js.map +1 -1
  82. package/dist/esm/scripts/obliterate-2.js +11 -1
  83. package/dist/esm/scripts/obliterate-2.js.map +1 -1
  84. package/dist/esm/scripts/removeJob-2.js +16 -9
  85. package/dist/esm/scripts/removeJob-2.js.map +1 -1
  86. package/dist/esm/scripts/removeJobScheduler-3.d.ts +5 -0
  87. package/dist/esm/scripts/removeJobScheduler-3.js +46 -0
  88. package/dist/esm/scripts/removeJobScheduler-3.js.map +1 -0
  89. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  90. package/dist/esm/utils.d.ts +7 -0
  91. package/dist/esm/utils.js +23 -0
  92. package/dist/esm/utils.js.map +1 -1
  93. package/package.json +1 -1
  94. package/dist/cjs/commands/drain-4.lua +0 -26
  95. package/dist/cjs/scripts/drain-4.js.map +0 -1
  96. package/dist/esm/commands/drain-4.lua +0 -26
  97. package/dist/esm/scripts/drain-4.js.map +0 -1
  98. /package/dist/esm/scripts/{cleanJobsInSet-2.d.ts → cleanJobsInSet-3.d.ts} +0 -0
  99. /package/dist/esm/scripts/{drain-4.d.ts → drain-5.d.ts} +0 -0
@@ -3,6 +3,7 @@ const content = `--[[
3
3
  Input:
4
4
  KEYS[1] set key,
5
5
  KEYS[2] events stream key
6
+ KEYS[3] job schedulers key
6
7
  ARGV[1] jobKey prefix
7
8
  ARGV[2] timestamp
8
9
  ARGV[3] limit the number of jobs to be removed. 0 is unlimited
@@ -234,7 +235,7 @@ end
234
235
  --[[
235
236
  Function to clean job set.
236
237
  Returns jobIds and deleted count number.
237
- ]]
238
+ ]]
238
239
  -- Includes
239
240
  --[[
240
241
  Function to loop in batches.
@@ -265,54 +266,75 @@ local function getJobsInZset(zsetKey, rangeEnd, limit)
265
266
  return rcall("ZRANGEBYSCORE", zsetKey, 0, rangeEnd)
266
267
  end
267
268
  end
268
- local function cleanSet(setKey, jobKeyPrefix, rangeEnd, timestamp, limit, attributes, isFinished)
269
- local jobs = getJobsInZset(setKey, rangeEnd, limit)
270
- local deleted = {}
271
- local deletedCount = 0
272
- local jobTS
273
- for i, job in ipairs(jobs) do
274
- if limit > 0 and deletedCount >= limit then
275
- break
269
+ local function isJobSchedulerJob(jobId, jobSchedulersKey)
270
+ if jobSchedulersKey then
271
+ local jobSchedulerId = jobId:match("repeat:(.*):%d+")
272
+ if jobSchedulerId then
273
+ return rcall("ZSCORE", jobSchedulersKey, jobSchedulerId)
274
+ end
276
275
  end
277
- local jobKey = jobKeyPrefix .. job
278
- if isFinished then
279
- removeJob(job, true, jobKeyPrefix, true --[[remove debounce key]])
280
- deletedCount = deletedCount + 1
281
- table.insert(deleted, job)
282
- else
283
- -- * finishedOn says when the job was completed, but it isn't set unless the job has actually completed
284
- jobTS = getTimestamp(jobKey, attributes)
285
- if (not jobTS or jobTS <= timestamp) then
286
- removeJob(job, true, jobKeyPrefix, true --[[remove debounce key]])
287
- deletedCount = deletedCount + 1
288
- table.insert(deleted, job)
289
- end
276
+ return false
277
+ end
278
+ local function cleanSet(
279
+ setKey,
280
+ jobKeyPrefix,
281
+ rangeEnd,
282
+ timestamp,
283
+ limit,
284
+ attributes,
285
+ isFinished,
286
+ jobSchedulersKey)
287
+ local jobs = getJobsInZset(setKey, rangeEnd, limit)
288
+ local deleted = {}
289
+ local deletedCount = 0
290
+ local jobTS
291
+ for i, job in ipairs(jobs) do
292
+ if limit > 0 and deletedCount >= limit then
293
+ break
294
+ end
295
+ -- Extract a Job Scheduler Id from jobId ("repeat:job-scheduler-id:millis")
296
+ -- and check if it is in the scheduled jobs
297
+ if not isJobSchedulerJob(job, jobSchedulersKey) then
298
+ local jobKey = jobKeyPrefix .. job
299
+ if isFinished then
300
+ removeJob(job, true, jobKeyPrefix, true --[[remove debounce key]] )
301
+ deletedCount = deletedCount + 1
302
+ table.insert(deleted, job)
303
+ else
304
+ -- * finishedOn says when the job was completed, but it isn't set unless the job has actually completed
305
+ jobTS = getTimestamp(jobKey, attributes)
306
+ if (not jobTS or jobTS <= timestamp) then
307
+ removeJob(job, true, jobKeyPrefix, true --[[remove debounce key]] )
308
+ deletedCount = deletedCount + 1
309
+ table.insert(deleted, job)
310
+ end
311
+ end
312
+ end
290
313
  end
291
- end
292
- if(#deleted > 0) then
293
- for from, to in batches(#deleted, 7000) do
294
- rcall("ZREM", setKey, unpack(deleted, from, to))
314
+ if (#deleted > 0) then
315
+ for from, to in batches(#deleted, 7000) do
316
+ rcall("ZREM", setKey, unpack(deleted, from, to))
317
+ end
295
318
  end
296
- end
297
- return {deleted, deletedCount}
319
+ return {deleted, deletedCount}
298
320
  end
299
321
  local result
300
322
  if ARGV[4] == "active" then
301
- result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], false)
323
+ result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], false --[[ hasFinished ]])
302
324
  elseif ARGV[4] == "delayed" then
303
325
  rangeEnd = "+inf"
304
326
  result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
305
- {"processedOn", "timestamp"}, false)
327
+ {"processedOn", "timestamp"}, false --[[ hasFinished ]], KEYS[3])
306
328
  elseif ARGV[4] == "prioritized" then
307
329
  rangeEnd = "+inf"
308
330
  result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
309
- {"timestamp"}, false)
331
+ {"timestamp"}, false --[[ hasFinished ]])
310
332
  elseif ARGV[4] == "wait" or ARGV[4] == "paused" then
311
- result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], true)
333
+ result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], true --[[ hasFinished ]])
312
334
  else
313
335
  rangeEnd = ARGV[2]
314
336
  result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
315
- {"finishedOn"}, true)
337
+ {"finishedOn"}, true --[[ hasFinished ]])
316
338
  end
317
339
  rcall("XADD", KEYS[2], "*", "event", "cleaned", "count", result[2])
318
340
  return result[1]
@@ -320,6 +342,6 @@ return result[1]
320
342
  export const cleanJobsInSet = {
321
343
  name: 'cleanJobsInSet',
322
344
  content,
323
- keys: 2,
345
+ keys: 3,
324
346
  };
325
- //# sourceMappingURL=cleanJobsInSet-2.js.map
347
+ //# sourceMappingURL=cleanJobsInSet-3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanJobsInSet-2.js","sourceRoot":"","sources":["../../../src/scripts/cleanJobsInSet-2.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Tf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"cleanJobsInSet-3.js","sourceRoot":"","sources":["../../../src/scripts/cleanJobsInSet-3.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoVf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -6,6 +6,7 @@ const content = `--[[
6
6
  KEYS[2] 'paused'
7
7
  KEYS[3] 'delayed'
8
8
  KEYS[4] 'prioritized'
9
+ KEYS[5] 'jobschedulers' (repeat)
9
10
  ARGV[1] queue key prefix
10
11
  ]]
11
12
  local rcall = redis.call
@@ -209,8 +210,18 @@ end
209
210
  local function getZSetItems(keyName, max)
210
211
  return rcall('ZRANGE', keyName, 0, max - 1)
211
212
  end
212
- local function removeZSetJobs(keyName, hard, baseKey, max)
213
+ local function removeZSetJobs(keyName, hard, baseKey, max, jobsToIgnore)
213
214
  local jobs = getZSetItems(keyName, max)
215
+ -- filter out jobs to ignore
216
+ if jobsToIgnore then
217
+ local filteredJobs = {}
218
+ for i = 1, #jobs do
219
+ if not jobsToIgnore[jobs[i]] then
220
+ table.insert(filteredJobs, jobs[i])
221
+ end
222
+ end
223
+ jobs = filteredJobs
224
+ end
214
225
  local count = removeJobs(jobs, hard, baseKey, max)
215
226
  if(#jobs > 0) then
216
227
  for from, to in batches(#jobs, 7000) do
@@ -219,16 +230,26 @@ local function removeZSetJobs(keyName, hard, baseKey, max)
219
230
  end
220
231
  return count
221
232
  end
222
- removeListJobs(KEYS[1], true, queueBaseKey, 0) --wait
223
- removeListJobs(KEYS[2], true, queueBaseKey, 0) --paused
233
+ removeListJobs(KEYS[1], true, queueBaseKey, 0) -- wait
234
+ removeListJobs(KEYS[2], true, queueBaseKey, 0) -- paused
224
235
  if KEYS[3] ~= "" then
225
- removeZSetJobs(KEYS[3], true, queueBaseKey, 0) --delayed
236
+ -- We must not remove delayed jobs if they are associated to a job scheduler.
237
+ local scheduledJobs = {}
238
+ local jobSchedulers = rcall("ZRANGE", KEYS[5], 0, -1, "WITHSCORES")
239
+ -- For every job scheduler, get the current delayed job id.
240
+ for i = 1, #jobSchedulers, 2 do
241
+ local jobSchedulerId = jobSchedulers[i]
242
+ local jobSchedulerMillis = jobSchedulers[i + 1]
243
+ local delayedJobId = "repeat:" .. jobSchedulerId .. ":" .. jobSchedulerMillis
244
+ scheduledJobs[delayedJobId] = true
245
+ end
246
+ removeZSetJobs(KEYS[3], true, queueBaseKey, 0, scheduledJobs) -- delayed
226
247
  end
227
- removeZSetJobs(KEYS[4], true, queueBaseKey, 0) --prioritized
248
+ removeZSetJobs(KEYS[4], true, queueBaseKey, 0) -- prioritized
228
249
  `;
229
250
  export const drain = {
230
251
  name: 'drain',
231
252
  content,
232
- keys: 4,
253
+ keys: 5,
233
254
  };
234
- //# sourceMappingURL=drain-4.js.map
255
+ //# sourceMappingURL=drain-5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drain-5.js","sourceRoot":"","sources":["../../../src/scripts/drain-5.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwPf,CAAC;AACF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,OAAO;IACb,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './addDelayedJob-6';
2
+ export * from './addJobScheduler-2';
2
3
  export * from './addLog-2';
3
4
  export * from './addParentJob-4';
4
5
  export * from './addPrioritizedJob-8';
@@ -6,8 +7,8 @@ export * from './addRepeatableJob-2';
6
7
  export * from './addStandardJob-8';
7
8
  export * from './changeDelay-4';
8
9
  export * from './changePriority-7';
9
- export * from './cleanJobsInSet-2';
10
- export * from './drain-4';
10
+ export * from './cleanJobsInSet-3';
11
+ export * from './drain-5';
11
12
  export * from './extendLock-2';
12
13
  export * from './getCounts-1';
13
14
  export * from './getCountsPerPriority-4';
@@ -32,6 +33,7 @@ export * from './promote-9';
32
33
  export * from './releaseLock-1';
33
34
  export * from './removeChildDependency-1';
34
35
  export * from './removeJob-2';
36
+ export * from './removeJobScheduler-3';
35
37
  export * from './removeRepeatable-3';
36
38
  export * from './reprocessJob-8';
37
39
  export * from './retryJob-11';
@@ -1,4 +1,5 @@
1
1
  export * from './addDelayedJob-6';
2
+ export * from './addJobScheduler-2';
2
3
  export * from './addLog-2';
3
4
  export * from './addParentJob-4';
4
5
  export * from './addPrioritizedJob-8';
@@ -6,8 +7,8 @@ export * from './addRepeatableJob-2';
6
7
  export * from './addStandardJob-8';
7
8
  export * from './changeDelay-4';
8
9
  export * from './changePriority-7';
9
- export * from './cleanJobsInSet-2';
10
- export * from './drain-4';
10
+ export * from './cleanJobsInSet-3';
11
+ export * from './drain-5';
11
12
  export * from './extendLock-2';
12
13
  export * from './getCounts-1';
13
14
  export * from './getCountsPerPriority-4';
@@ -32,6 +33,7 @@ export * from './promote-9';
32
33
  export * from './releaseLock-1';
33
34
  export * from './removeChildDependency-1';
34
35
  export * from './removeJob-2';
36
+ export * from './removeJobScheduler-3';
35
37
  export * from './removeRepeatable-3';
36
38
  export * from './reprocessJob-8';
37
39
  export * from './retryJob-11';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scripts/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scripts/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC"}
@@ -390,7 +390,7 @@ local metaKey = KEYS[6]
390
390
  local pausedKey = KEYS[7]
391
391
  local markerKey = KEYS[8]
392
392
  local eventStreamKey = KEYS[9]
393
- local maxStalledJobCount = ARGV[1]
393
+ local maxStalledJobCount = tonumber(ARGV[1])
394
394
  local queueKeyPrefix = ARGV[2]
395
395
  local timestamp = ARGV[3]
396
396
  local maxCheckTime = ARGV[4]
@@ -404,7 +404,6 @@ local stalled = {}
404
404
  local failed = {}
405
405
  if (#stalling > 0) then
406
406
  rcall('DEL', stalledKey)
407
- local MAX_STALLED_JOB_COUNT = tonumber(maxStalledJobCount)
408
407
  -- Remove from active list
409
408
  for i, jobId in ipairs(stalling) do
410
409
  -- Markers in waitlist DEPRECATED in v5: Remove in v6.
@@ -421,7 +420,7 @@ if (#stalling > 0) then
421
420
  -- If this job has been stalled too many times, such as if it crashes the worker, then fail it.
422
421
  local stalledCount =
423
422
  rcall("HINCRBY", jobKey, "stalledCounter", 1)
424
- if (stalledCount > MAX_STALLED_JOB_COUNT) then
423
+ if (stalledCount > maxStalledJobCount) then
425
424
  local jobAttributes = rcall("HMGET", jobKey, "opts", "parent", "deid")
426
425
  local rawOpts = jobAttributes[1]
427
426
  local rawParentData = jobAttributes[2]
@@ -1 +1 @@
1
- {"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4fS,CAAC;AAC1B,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA2fS,CAAC;AAC1B,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -215,8 +215,18 @@ end
215
215
  local function getZSetItems(keyName, max)
216
216
  return rcall('ZRANGE', keyName, 0, max - 1)
217
217
  end
218
- local function removeZSetJobs(keyName, hard, baseKey, max)
218
+ local function removeZSetJobs(keyName, hard, baseKey, max, jobsToIgnore)
219
219
  local jobs = getZSetItems(keyName, max)
220
+ -- filter out jobs to ignore
221
+ if jobsToIgnore then
222
+ local filteredJobs = {}
223
+ for i = 1, #jobs do
224
+ if not jobsToIgnore[jobs[i]] then
225
+ table.insert(filteredJobs, jobs[i])
226
+ end
227
+ end
228
+ jobs = filteredJobs
229
+ end
220
230
  local count = removeJobs(jobs, hard, baseKey, max)
221
231
  if(#jobs > 0) then
222
232
  for from, to in batches(#jobs, 7000) do
@@ -1 +1 @@
1
- {"version":3,"file":"obliterate-2.js","sourceRoot":"","sources":["../../../src/scripts/obliterate-2.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmTf,CAAC;AACF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,YAAY;IAClB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"obliterate-2.js","sourceRoot":"","sources":["../../../src/scripts/obliterate-2.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Tf,CAAC;AACF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,YAAY;IAClB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -225,20 +225,20 @@ local function removeParentDependencyKey(jobKey, hard, parentKey, baseKey, debou
225
225
  end
226
226
  return false
227
227
  end
228
- local function removeJob( prefix, jobId, parentKey, removeChildren)
228
+ local function removeJob(prefix, jobId, parentKey, removeChildren)
229
229
  local jobKey = prefix .. jobId;
230
230
  removeParentDependencyKey(jobKey, false, parentKey, nil)
231
231
  if removeChildren == "1" then
232
232
  -- Check if this job has children
233
233
  -- If so, we are going to try to remove the children recursively in deep first way because
234
234
  -- if some job is locked we must exit with and error.
235
- --local countProcessed = rcall("HLEN", jobKey .. ":processed")
235
+ -- local countProcessed = rcall("HLEN", jobKey .. ":processed")
236
236
  local processed = rcall("HGETALL", jobKey .. ":processed")
237
237
  if (#processed > 0) then
238
238
  for i = 1, #processed, 2 do
239
239
  local childJobId = getJobIdFromKey(processed[i])
240
240
  local childJobPrefix = getJobKeyPrefix(processed[i], childJobId)
241
- removeJob( childJobPrefix, childJobId, jobKey, removeChildren )
241
+ removeJob(childJobPrefix, childJobId, jobKey, removeChildren)
242
242
  end
243
243
  end
244
244
  local dependencies = rcall("SMEMBERS", jobKey .. ":dependencies")
@@ -247,7 +247,7 @@ local function removeJob( prefix, jobId, parentKey, removeChildren)
247
247
  -- We need to get the jobId for this job.
248
248
  local childJobId = getJobIdFromKey(childJobKey)
249
249
  local childJobPrefix = getJobKeyPrefix(childJobKey, childJobId)
250
- removeJob( childJobPrefix, childJobId, jobKey, removeChildren )
250
+ removeJob(childJobPrefix, childJobId, jobKey, removeChildren)
251
251
  end
252
252
  end
253
253
  local failed = rcall("HGETALL", jobKey .. ":failed")
@@ -255,7 +255,7 @@ local function removeJob( prefix, jobId, parentKey, removeChildren)
255
255
  for i = 1, #failed, 2 do
256
256
  local childJobId = getJobIdFromKey(failed[i])
257
257
  local childJobPrefix = getJobKeyPrefix(failed[i], childJobId)
258
- removeJob( childJobPrefix, childJobId, jobKey, removeChildren )
258
+ removeJob(childJobPrefix, childJobId, jobKey, removeChildren)
259
259
  end
260
260
  end
261
261
  end
@@ -263,13 +263,20 @@ local function removeJob( prefix, jobId, parentKey, removeChildren)
263
263
  removeDebounceKey(prefix, jobKey)
264
264
  if removeJobKeys(jobKey) > 0 then
265
265
  local maxEvents = getOrSetMaxEvents(KEYS[2])
266
- rcall("XADD", prefix .. "events", "MAXLEN", "~", maxEvents, "*", "event", "removed",
267
- "jobId", jobId, "prev", prev)
266
+ rcall("XADD", prefix .. "events", "MAXLEN", "~", maxEvents, "*", "event", "removed", "jobId", jobId, "prev",
267
+ prev)
268
268
  end
269
269
  end
270
270
  local prefix = KEYS[1]
271
- if not isLocked(prefix, ARGV[1], ARGV[2]) then
272
- removeJob(prefix, ARGV[1], nil, ARGV[2])
271
+ local jobId = ARGV[1]
272
+ local shouldRemoveChildren = ARGV[2]
273
+ local jobKey = prefix .. jobId
274
+ -- Check if the job belongs to a job scheduler and it is in delayed state.
275
+ if rcall("ZSCORE", prefix .. "delayed", jobId) and rcall("HGET", jobKey, "rjk") then
276
+ return -8 -- Return error code as the job is part of a job scheduler and is in delayed state.
277
+ end
278
+ if not isLocked(prefix, jobId, shouldRemoveChildren) then
279
+ removeJob(prefix, jobId, nil, shouldRemoveChildren)
273
280
  return 1
274
281
  end
275
282
  return 0
@@ -1 +1 @@
1
- {"version":3,"file":"removeJob-2.js","sourceRoot":"","sources":["../../../src/scripts/removeJob-2.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmRf,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,WAAW;IACjB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"removeJob-2.js","sourceRoot":"","sources":["../../../src/scripts/removeJob-2.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Rf,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,WAAW;IACjB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const removeJobScheduler: {
2
+ name: string;
3
+ content: string;
4
+ keys: number;
5
+ };
@@ -0,0 +1,46 @@
1
+ const content = `--[[
2
+ Removes a repeatable job
3
+ Input:
4
+ KEYS[1] job schedulers key
5
+ KEYS[2] delayed jobs key
6
+ KEYS[3] events key
7
+ ARGV[1] job scheduler id
8
+ ARGV[2] prefix key
9
+ Output:
10
+ 0 - OK
11
+ 1 - Missing repeat job
12
+ Events:
13
+ 'removed'
14
+ ]]
15
+ local rcall = redis.call
16
+ -- Includes
17
+ --[[
18
+ Function to remove job keys.
19
+ ]]
20
+ local function removeJobKeys(jobKey)
21
+ return rcall("DEL", jobKey, jobKey .. ':logs',
22
+ jobKey .. ':dependencies', jobKey .. ':processed', jobKey .. ':failed')
23
+ end
24
+ local jobSchedulerId = ARGV[1]
25
+ local prefix = ARGV[2]
26
+ local millis = rcall("ZSCORE", KEYS[1], jobSchedulerId)
27
+ if millis then
28
+ -- Delete next programmed job.
29
+ local delayedJobId = "repeat:" .. jobSchedulerId .. ":" .. millis
30
+ if(rcall("ZREM", KEYS[2], delayedJobId) == 1) then
31
+ removeJobKeys(prefix .. delayedJobId)
32
+ rcall("XADD", KEYS[3], "*", "event", "removed", "jobId", delayedJobId, "prev", "delayed")
33
+ end
34
+ end
35
+ if(rcall("ZREM", KEYS[1], jobSchedulerId) == 1) then
36
+ rcall("DEL", KEYS[1] .. ":" .. jobSchedulerId)
37
+ return 0
38
+ end
39
+ return 1
40
+ `;
41
+ export const removeJobScheduler = {
42
+ name: 'removeJobScheduler',
43
+ content,
44
+ keys: 3,
45
+ };
46
+ //# sourceMappingURL=removeJobScheduler-3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeJobScheduler-3.js","sourceRoot":"","sources":["../../../src/scripts/removeJobScheduler-3.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCf,CAAC;AACF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,oBAAoB;IAC1B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}