bullmq 4.16.0 → 5.0.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 (192) hide show
  1. package/dist/cjs/classes/flow-producer.js +3 -10
  2. package/dist/cjs/classes/flow-producer.js.map +1 -1
  3. package/dist/cjs/classes/job.js +21 -11
  4. package/dist/cjs/classes/job.js.map +1 -1
  5. package/dist/cjs/classes/queue-base.js +2 -9
  6. package/dist/cjs/classes/queue-base.js.map +1 -1
  7. package/dist/cjs/classes/queue-events.js +3 -1
  8. package/dist/cjs/classes/queue-events.js.map +1 -1
  9. package/dist/cjs/classes/queue-keys.js +1 -0
  10. package/dist/cjs/classes/queue-keys.js.map +1 -1
  11. package/dist/cjs/classes/redis-connection.js +9 -7
  12. package/dist/cjs/classes/redis-connection.js.map +1 -1
  13. package/dist/cjs/classes/scripts.js +34 -34
  14. package/dist/cjs/classes/scripts.js.map +1 -1
  15. package/dist/cjs/classes/worker.js +41 -37
  16. package/dist/cjs/classes/worker.js.map +1 -1
  17. package/dist/cjs/commands/{addDelayedJob-7.lua → addDelayedJob-6.lua} +18 -22
  18. package/dist/cjs/commands/addParentJob-4.lua +0 -2
  19. package/dist/{esm/commands/addPrioritizedJob-8.lua → cjs/commands/addPrioritizedJob-7.lua} +18 -24
  20. package/dist/cjs/commands/{addStandardJob-6.lua → addStandardJob-7.lua} +6 -2
  21. package/dist/cjs/commands/changePriority-6.lua +57 -0
  22. package/dist/cjs/commands/getCounts-1.lua +1 -0
  23. package/dist/cjs/commands/getRanges-1.lua +1 -0
  24. package/dist/cjs/commands/includes/addDelayMarkerIfNeeded.lua +5 -19
  25. package/dist/cjs/commands/includes/addJobWithPriority.lua +3 -7
  26. package/dist/cjs/commands/includes/checkStalledJobs.lua +1 -1
  27. package/dist/cjs/commands/includes/isQueuePaused.lua +7 -0
  28. package/dist/cjs/commands/includes/moveParentToWaitIfNeeded.lua +39 -30
  29. package/dist/cjs/commands/includes/prepareJobForProcessing.lua +1 -1
  30. package/dist/cjs/commands/includes/promoteDelayedJobs.lua +7 -4
  31. package/dist/{esm/commands/moveToActive-10.lua → cjs/commands/moveToActive-11.lua} +18 -29
  32. package/dist/cjs/commands/moveToDelayed-7.lua +77 -0
  33. package/dist/cjs/commands/{moveToFinished-13.lua → moveToFinished-14.lua} +29 -22
  34. package/dist/cjs/commands/moveToWaitingChildren-4.lua +7 -4
  35. package/dist/cjs/commands/pause-7.lua +41 -0
  36. package/dist/cjs/commands/promote-8.lua +60 -0
  37. package/dist/cjs/commands/{retryJob-9.lua → retryJob-10.lua} +16 -11
  38. package/dist/cjs/scripts/{addDelayedJob-7.js → addDelayedJob-6.js} +77 -88
  39. package/dist/cjs/scripts/{moveToActive-10.js.map → addDelayedJob-6.js.map} +1 -1
  40. package/dist/cjs/scripts/addParentJob-4.js +51 -61
  41. package/dist/cjs/scripts/addParentJob-4.js.map +1 -1
  42. package/dist/cjs/scripts/{addPrioritizedJob-8.js → addPrioritizedJob-7.js} +80 -93
  43. package/dist/cjs/scripts/addPrioritizedJob-7.js.map +1 -0
  44. package/dist/cjs/scripts/{addStandardJob-6.js → addStandardJob-7.js} +58 -63
  45. package/dist/cjs/scripts/addStandardJob-7.js.map +1 -0
  46. package/dist/cjs/scripts/changePriority-6.js +85 -0
  47. package/dist/cjs/scripts/changePriority-6.js.map +1 -0
  48. package/dist/cjs/scripts/getCounts-1.js +1 -0
  49. package/dist/cjs/scripts/getCounts-1.js.map +1 -1
  50. package/dist/cjs/scripts/getRanges-1.js +1 -0
  51. package/dist/cjs/scripts/getRanges-1.js.map +1 -1
  52. package/dist/cjs/scripts/index.js +10 -10
  53. package/dist/cjs/scripts/index.js.map +1 -1
  54. package/dist/cjs/scripts/moveStalledJobsToWait-8.js +1 -0
  55. package/dist/cjs/scripts/moveStalledJobsToWait-8.js.map +1 -1
  56. package/dist/cjs/scripts/{moveToActive-10.js → moveToActive-11.js} +30 -48
  57. package/dist/cjs/scripts/moveToActive-11.js.map +1 -0
  58. package/dist/cjs/scripts/moveToDelayed-7.js +103 -0
  59. package/dist/cjs/scripts/moveToDelayed-7.js.map +1 -0
  60. package/dist/cjs/scripts/{moveToFinished-13.js → moveToFinished-14.js} +89 -88
  61. package/dist/cjs/scripts/{moveToFinished-13.js.map → moveToFinished-14.js.map} +1 -1
  62. package/dist/cjs/scripts/moveToWaitingChildren-4.js +6 -3
  63. package/dist/cjs/scripts/moveToWaitingChildren-4.js.map +1 -1
  64. package/dist/cjs/scripts/pause-7.js +67 -0
  65. package/dist/cjs/scripts/pause-7.js.map +1 -0
  66. package/dist/cjs/scripts/promote-8.js +79 -0
  67. package/dist/cjs/scripts/promote-8.js.map +1 -0
  68. package/dist/cjs/scripts/{retryJob-9.js → retryJob-10.js} +26 -32
  69. package/dist/cjs/scripts/retryJob-10.js.map +1 -0
  70. package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
  71. package/dist/esm/classes/flow-producer.js +3 -10
  72. package/dist/esm/classes/flow-producer.js.map +1 -1
  73. package/dist/esm/classes/job.d.ts +5 -0
  74. package/dist/esm/classes/job.js +21 -11
  75. package/dist/esm/classes/job.js.map +1 -1
  76. package/dist/esm/classes/queue-base.js +2 -9
  77. package/dist/esm/classes/queue-base.js.map +1 -1
  78. package/dist/esm/classes/queue-events.js +3 -1
  79. package/dist/esm/classes/queue-events.js.map +1 -1
  80. package/dist/esm/classes/queue-keys.js +1 -0
  81. package/dist/esm/classes/queue-keys.js.map +1 -1
  82. package/dist/esm/classes/redis-connection.js +9 -7
  83. package/dist/esm/classes/redis-connection.js.map +1 -1
  84. package/dist/esm/classes/scripts.d.ts +4 -4
  85. package/dist/esm/classes/scripts.js +34 -34
  86. package/dist/esm/classes/scripts.js.map +1 -1
  87. package/dist/esm/classes/worker.d.ts +4 -2
  88. package/dist/esm/classes/worker.js +41 -37
  89. package/dist/esm/classes/worker.js.map +1 -1
  90. package/dist/esm/commands/{addDelayedJob-7.lua → addDelayedJob-6.lua} +18 -22
  91. package/dist/esm/commands/addParentJob-4.lua +0 -2
  92. package/dist/{cjs/commands/addPrioritizedJob-8.lua → esm/commands/addPrioritizedJob-7.lua} +18 -24
  93. package/dist/esm/commands/{addStandardJob-6.lua → addStandardJob-7.lua} +6 -2
  94. package/dist/esm/commands/changePriority-6.lua +57 -0
  95. package/dist/esm/commands/getCounts-1.lua +1 -0
  96. package/dist/esm/commands/getRanges-1.lua +1 -0
  97. package/dist/esm/commands/includes/addDelayMarkerIfNeeded.lua +5 -19
  98. package/dist/esm/commands/includes/addJobWithPriority.lua +3 -7
  99. package/dist/esm/commands/includes/checkStalledJobs.lua +1 -1
  100. package/dist/esm/commands/includes/isQueuePaused.lua +7 -0
  101. package/dist/esm/commands/includes/moveParentToWaitIfNeeded.lua +39 -30
  102. package/dist/esm/commands/includes/prepareJobForProcessing.lua +1 -1
  103. package/dist/esm/commands/includes/promoteDelayedJobs.lua +7 -4
  104. package/dist/{cjs/commands/moveToActive-10.lua → esm/commands/moveToActive-11.lua} +18 -29
  105. package/dist/esm/commands/moveToDelayed-7.lua +77 -0
  106. package/dist/esm/commands/{moveToFinished-13.lua → moveToFinished-14.lua} +29 -22
  107. package/dist/esm/commands/moveToWaitingChildren-4.lua +7 -4
  108. package/dist/esm/commands/pause-7.lua +41 -0
  109. package/dist/esm/commands/promote-8.lua +60 -0
  110. package/dist/esm/commands/{retryJob-9.lua → retryJob-10.lua} +16 -11
  111. package/dist/esm/interfaces/job-json.d.ts +4 -1
  112. package/dist/esm/interfaces/minimal-job.d.ts +3 -0
  113. package/dist/esm/interfaces/queue-options.d.ts +1 -1
  114. package/dist/esm/scripts/{addDelayedJob-7.js → addDelayedJob-6.js} +77 -88
  115. package/dist/esm/scripts/{moveToActive-10.js.map → addDelayedJob-6.js.map} +1 -1
  116. package/dist/esm/scripts/addParentJob-4.js +51 -61
  117. package/dist/esm/scripts/addParentJob-4.js.map +1 -1
  118. package/dist/esm/scripts/{addPrioritizedJob-8.js → addPrioritizedJob-7.js} +80 -93
  119. package/dist/esm/scripts/addPrioritizedJob-7.js.map +1 -0
  120. package/dist/esm/scripts/{addStandardJob-6.js → addStandardJob-7.js} +58 -63
  121. package/dist/esm/scripts/addStandardJob-7.js.map +1 -0
  122. package/dist/esm/scripts/changePriority-6.js +82 -0
  123. package/dist/esm/scripts/changePriority-6.js.map +1 -0
  124. package/dist/esm/scripts/getCounts-1.js +1 -0
  125. package/dist/esm/scripts/getCounts-1.js.map +1 -1
  126. package/dist/esm/scripts/getRanges-1.js +1 -0
  127. package/dist/esm/scripts/getRanges-1.js.map +1 -1
  128. package/dist/esm/scripts/index.d.ts +10 -10
  129. package/dist/esm/scripts/index.js +10 -10
  130. package/dist/esm/scripts/index.js.map +1 -1
  131. package/dist/esm/scripts/moveStalledJobsToWait-8.js +1 -0
  132. package/dist/esm/scripts/moveStalledJobsToWait-8.js.map +1 -1
  133. package/dist/esm/scripts/{moveToActive-10.js → moveToActive-11.js} +30 -48
  134. package/dist/esm/scripts/moveToActive-11.js.map +1 -0
  135. package/dist/esm/scripts/moveToDelayed-7.js +100 -0
  136. package/dist/esm/scripts/moveToDelayed-7.js.map +1 -0
  137. package/dist/esm/scripts/{moveToFinished-13.js → moveToFinished-14.js} +89 -88
  138. package/dist/esm/scripts/{moveToFinished-13.js.map → moveToFinished-14.js.map} +1 -1
  139. package/dist/esm/scripts/moveToWaitingChildren-4.js +6 -3
  140. package/dist/esm/scripts/moveToWaitingChildren-4.js.map +1 -1
  141. package/dist/esm/scripts/pause-7.js +64 -0
  142. package/dist/esm/scripts/pause-7.js.map +1 -0
  143. package/dist/esm/scripts/promote-8.js +76 -0
  144. package/dist/esm/scripts/promote-8.js.map +1 -0
  145. package/dist/esm/scripts/{retryJob-9.js → retryJob-10.js} +26 -32
  146. package/dist/esm/scripts/retryJob-10.js.map +1 -0
  147. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  148. package/package.json +1 -1
  149. package/dist/cjs/commands/changePriority-5.lua +0 -52
  150. package/dist/cjs/commands/includes/addPriorityMarkerIfNeeded.lua +0 -12
  151. package/dist/cjs/commands/moveToDelayed-8.lua +0 -72
  152. package/dist/cjs/commands/pause-5.lua +0 -36
  153. package/dist/cjs/commands/promote-7.lua +0 -57
  154. package/dist/cjs/scripts/addDelayedJob-7.js.map +0 -1
  155. package/dist/cjs/scripts/addPrioritizedJob-8.js.map +0 -1
  156. package/dist/cjs/scripts/addStandardJob-6.js.map +0 -1
  157. package/dist/cjs/scripts/changePriority-5.js +0 -87
  158. package/dist/cjs/scripts/changePriority-5.js.map +0 -1
  159. package/dist/cjs/scripts/moveToDelayed-8.js +0 -168
  160. package/dist/cjs/scripts/moveToDelayed-8.js.map +0 -1
  161. package/dist/cjs/scripts/pause-5.js +0 -48
  162. package/dist/cjs/scripts/pause-5.js.map +0 -1
  163. package/dist/cjs/scripts/promote-7.js +0 -87
  164. package/dist/cjs/scripts/promote-7.js.map +0 -1
  165. package/dist/cjs/scripts/retryJob-9.js.map +0 -1
  166. package/dist/esm/commands/changePriority-5.lua +0 -52
  167. package/dist/esm/commands/includes/addPriorityMarkerIfNeeded.lua +0 -12
  168. package/dist/esm/commands/moveToDelayed-8.lua +0 -72
  169. package/dist/esm/commands/pause-5.lua +0 -36
  170. package/dist/esm/commands/promote-7.lua +0 -57
  171. package/dist/esm/scripts/addDelayedJob-7.js.map +0 -1
  172. package/dist/esm/scripts/addPrioritizedJob-8.js.map +0 -1
  173. package/dist/esm/scripts/addStandardJob-6.js.map +0 -1
  174. package/dist/esm/scripts/changePriority-5.js +0 -84
  175. package/dist/esm/scripts/changePriority-5.js.map +0 -1
  176. package/dist/esm/scripts/moveToDelayed-8.js +0 -165
  177. package/dist/esm/scripts/moveToDelayed-8.js.map +0 -1
  178. package/dist/esm/scripts/pause-5.js +0 -45
  179. package/dist/esm/scripts/pause-5.js.map +0 -1
  180. package/dist/esm/scripts/promote-7.js +0 -84
  181. package/dist/esm/scripts/promote-7.js.map +0 -1
  182. package/dist/esm/scripts/retryJob-9.js.map +0 -1
  183. /package/dist/esm/scripts/{addDelayedJob-7.d.ts → addDelayedJob-6.d.ts} +0 -0
  184. /package/dist/esm/scripts/{addPrioritizedJob-8.d.ts → addPrioritizedJob-7.d.ts} +0 -0
  185. /package/dist/esm/scripts/{addStandardJob-6.d.ts → addStandardJob-7.d.ts} +0 -0
  186. /package/dist/esm/scripts/{changePriority-5.d.ts → changePriority-6.d.ts} +0 -0
  187. /package/dist/esm/scripts/{moveToActive-10.d.ts → moveToActive-11.d.ts} +0 -0
  188. /package/dist/esm/scripts/{moveToDelayed-8.d.ts → moveToDelayed-7.d.ts} +0 -0
  189. /package/dist/esm/scripts/{moveToFinished-13.d.ts → moveToFinished-14.d.ts} +0 -0
  190. /package/dist/esm/scripts/{pause-5.d.ts → pause-7.d.ts} +0 -0
  191. /package/dist/esm/scripts/{promote-7.d.ts → promote-8.d.ts} +0 -0
  192. /package/dist/esm/scripts/{retryJob-9.d.ts → retryJob-10.d.ts} +0 -0
@@ -2,15 +2,16 @@
2
2
  Retries a failed job by moving it back to the wait queue.
3
3
 
4
4
  Input:
5
- KEYS[1] 'active',
6
- KEYS[2] 'wait'
7
- KEYS[3] 'paused'
8
- KEYS[4] job key
9
- KEYS[5] 'meta'
10
- KEYS[6] events stream
11
- KEYS[7] delayed key
12
- KEYS[8] prioritized key
13
- KEYS[9] 'pc' priority counter
5
+ KEYS[1] 'active',
6
+ KEYS[2] 'wait'
7
+ KEYS[3] 'paused'
8
+ KEYS[4] job key
9
+ KEYS[5] 'meta'
10
+ KEYS[6] events stream
11
+ KEYS[7] delayed key
12
+ KEYS[8] prioritized key
13
+ KEYS[9] 'pc' priority counter
14
+ KEYS[10] 'marker'
14
15
 
15
16
  ARGV[1] key prefix
16
17
  ARGV[2] timestamp
@@ -34,9 +35,11 @@ local rcall = redis.call
34
35
  --- @include "includes/promoteDelayedJobs"
35
36
 
36
37
  local target, paused = getTargetQueueList(KEYS[5], KEYS[2], KEYS[3])
38
+ local markerKey = KEYS[10]
39
+
37
40
  -- Check if there are delayed jobs that we can move to wait.
38
41
  -- test example: when there are delayed jobs between retries
39
- promoteDelayedJobs(KEYS[7], KEYS[2], target, KEYS[8], KEYS[6], ARGV[1], ARGV[2], paused, KEYS[9])
42
+ promoteDelayedJobs(KEYS[7], markerKey, target, KEYS[8], KEYS[6], ARGV[1], ARGV[2], KEYS[9], paused)
40
43
 
41
44
  if rcall("EXISTS", KEYS[4]) == 1 then
42
45
 
@@ -57,9 +60,11 @@ if rcall("EXISTS", KEYS[4]) == 1 then
57
60
  if priority == 0 then
58
61
  rcall(ARGV[3], target, ARGV[4])
59
62
  else
60
- addJobWithPriority(KEYS[2], KEYS[8], priority, paused, ARGV[4], KEYS[9])
63
+ addJobWithPriority(markerKey, KEYS[8], priority, ARGV[4], KEYS[9], paused)
61
64
  end
62
65
 
66
+ rcall("HINCRBY", KEYS[4], "atm", 1)
67
+
63
68
  local maxEvents = rcall("HGET", KEYS[5], "opts.maxLenEvents") or 10000
64
69
 
65
70
  -- Emit waiting event
@@ -9,13 +9,12 @@ const content = `--[[
9
9
  - adds to delayed zset.
10
10
  - Emits a global event 'delayed' if the job is delayed.
11
11
  Input:
12
- KEYS[1] 'wait',
13
- KEYS[2] 'paused'
14
- KEYS[3] 'meta'
15
- KEYS[4] 'id'
16
- KEYS[5] 'delayed'
17
- KEYS[6] 'completed'
18
- KEYS[7] events stream key
12
+ KEYS[1] 'marker',
13
+ KEYS[2] 'meta'
14
+ KEYS[3] 'id'
15
+ KEYS[4] 'delayed'
16
+ KEYS[5] 'completed'
17
+ KEYS[6] events stream key
19
18
  ARGV[1] msgpacked arguments array
20
19
  [1] key prefix,
21
20
  [2] custom id (use custom instead of one generated automatically)
@@ -32,13 +31,11 @@ const content = `--[[
32
31
  jobId - OK
33
32
  -5 - Missing parent key
34
33
  ]]
35
- local waitKey = KEYS[1]
36
- local pausedKey = KEYS[2]
37
- local metaKey = KEYS[3]
38
- local idKey = KEYS[4]
39
- local delayedKey = KEYS[5]
40
- local completedKey = KEYS[6]
41
- local eventsKey = KEYS[7]
34
+ local metaKey = KEYS[2]
35
+ local idKey = KEYS[3]
36
+ local delayedKey = KEYS[4]
37
+ local completedKey = KEYS[5]
38
+ local eventsKey = KEYS[6]
42
39
  local jobId
43
40
  local jobIdKey
44
41
  local rcall = redis.call
@@ -77,7 +74,7 @@ local function storeJob(eventsKey, jobIdKey, jobId, name, data, opts, timestamp,
77
74
  end
78
75
  --[[
79
76
  Add delay marker if needed.
80
- ]]
77
+ ]]
81
78
  -- Includes
82
79
  --[[
83
80
  Function to return the next delayed job timestamp.
@@ -92,36 +89,20 @@ local function getNextDelayedTimestamp(delayedKey)
92
89
  return nextTimestamp
93
90
  end
94
91
  end
95
- local function addDelayMarkerIfNeeded(targetKey, delayedKey)
96
- local waitLen = rcall("LLEN", targetKey)
97
- if waitLen <= 1 then
92
+ local function addDelayMarkerIfNeeded(markerKey, delayedKey)
98
93
  local nextTimestamp = getNextDelayedTimestamp(delayedKey)
99
94
  if nextTimestamp ~= nil then
100
- -- Check if there is already a marker with older timestamp
101
- -- if there is, we need to replace it.
102
- if waitLen == 1 then
103
- local marker = rcall("LINDEX", targetKey, 0)
104
- local oldTimestamp = tonumber(marker:sub(3))
105
- if oldTimestamp and oldTimestamp > nextTimestamp then
106
- rcall("LSET", targetKey, 0, "0:" .. nextTimestamp)
107
- end
108
- else
109
- -- if there is no marker, then we need to add one
110
- rcall("LPUSH", targetKey, "0:" .. nextTimestamp)
111
- end
95
+ -- Replace the score of the marker with the newest known
96
+ -- next timestamp.
97
+ rcall("ZADD", markerKey, nextTimestamp, "0")
112
98
  end
113
- end
114
99
  end
115
100
  --[[
116
101
  Function to check for the meta.paused key to decide if we are paused or not
117
102
  (since an empty list and !EXISTS are not really the same).
118
103
  ]]
119
- local function getTargetQueueList(queueMetaKey, waitKey, pausedKey)
120
- if rcall("HEXISTS", queueMetaKey, "paused") ~= 1 then
121
- return waitKey, false
122
- else
123
- return pausedKey, true
124
- end
104
+ local function isQueuePaused(queueMetaKey)
105
+ return rcall("HEXISTS", queueMetaKey, "paused") == 1
125
106
  end
126
107
  --[[
127
108
  Validate and move or add dependencies to parent.
@@ -134,56 +115,64 @@ end
134
115
  --[[
135
116
  Function to add job considering priority.
136
117
  ]]
137
- -- Includes
138
- --[[
139
- Function priority marker to wait if needed
140
- in order to wake up our workers and to respect priority
141
- order as much as possible
142
- ]]
143
- local function addPriorityMarkerIfNeeded(waitKey)
144
- local waitLen = rcall("LLEN", waitKey)
145
- if waitLen == 0 then
146
- rcall("LPUSH", waitKey, "0:0")
147
- end
148
- end
149
- local function addJobWithPriority(waitKey, prioritizedKey, priority, paused, jobId, priorityCounterKey)
118
+ local function addJobWithPriority(markerKey, prioritizedKey, priority, jobId, priorityCounterKey, isPaused)
150
119
  local prioCounter = rcall("INCR", priorityCounterKey)
151
120
  local score = priority * 0x100000000 + bit.band(prioCounter, 0xffffffffffff)
152
121
  rcall("ZADD", prioritizedKey, score, jobId)
153
- if not paused then
154
- addPriorityMarkerIfNeeded(waitKey)
122
+ if not isPaused then
123
+ rcall("ZADD", markerKey, 0, "0")
155
124
  end
156
125
  end
157
- local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
158
- local isParentActive = rcall("ZSCORE", parentQueueKey .. ":waiting-children", parentId)
159
- if rcall("SCARD", parentDependenciesKey) == 0 and isParentActive then
160
- rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
161
- local parentWaitKey = parentQueueKey .. ":wait"
162
- local parentTarget, paused = getTargetQueueList(parentQueueKey .. ":meta", parentWaitKey,
163
- parentQueueKey .. ":paused")
164
- local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
165
- local priority = tonumber(jobAttributes[1]) or 0
166
- local delay = tonumber(jobAttributes[2]) or 0
167
- if delay > 0 then
168
- local delayedTimestamp = tonumber(timestamp) + delay
169
- local score = delayedTimestamp * 0x1000
170
- local parentDelayedKey = parentQueueKey .. ":delayed"
171
- rcall("ZADD", parentDelayedKey, score, parentId)
172
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId,
173
- "delay", delayedTimestamp)
174
- addDelayMarkerIfNeeded(parentTarget, parentDelayedKey)
175
- else
176
- if priority == 0 then
177
- rcall("RPUSH", parentTarget, parentId)
178
- else
179
- addJobWithPriority(parentWaitKey, parentQueueKey .. ":prioritized", priority, paused,
180
- parentId, parentQueueKey .. ":pc")
181
- end
182
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId,
183
- "prev", "waiting-children")
184
- end
126
+ --[[
127
+ Function to check for the meta.paused key to decide if we are paused or not
128
+ (since an empty list and !EXISTS are not really the same).
129
+ ]]
130
+ local function getTargetQueueList(queueMetaKey, waitKey, pausedKey)
131
+ if rcall("HEXISTS", queueMetaKey, "paused") ~= 1 then
132
+ return waitKey, false
133
+ else
134
+ return pausedKey, true
185
135
  end
186
136
  end
137
+ local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey,
138
+ parentKey, parentId, timestamp)
139
+ local isParentActive = rcall("ZSCORE",
140
+ parentQueueKey .. ":waiting-children", parentId)
141
+ if rcall("SCARD", parentDependenciesKey) == 0 and isParentActive then
142
+ rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
143
+ local parentWaitKey = parentQueueKey .. ":wait"
144
+ local parentPausedKey = parentQueueKey .. ":paused"
145
+ local parentMetaKey = parentQueueKey .. ":meta"
146
+ local parentMarkerKey = parentQueueKey .. ":marker"
147
+ local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
148
+ local priority = tonumber(jobAttributes[1]) or 0
149
+ local delay = tonumber(jobAttributes[2]) or 0
150
+ if delay > 0 then
151
+ local delayedTimestamp = tonumber(timestamp) + delay
152
+ local score = delayedTimestamp * 0x1000
153
+ local parentDelayedKey = parentQueueKey .. ":delayed"
154
+ rcall("ZADD", parentDelayedKey, score, parentId)
155
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed",
156
+ "jobId", parentId, "delay", delayedTimestamp)
157
+ addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
158
+ else
159
+ if priority == 0 then
160
+ local parentTarget, _paused =
161
+ getTargetQueueList(parentMetaKey, parentWaitKey,
162
+ parentPausedKey)
163
+ rcall("RPUSH", parentTarget, parentId)
164
+ rcall("ZADD", parentMarkerKey, 0, "0")
165
+ else
166
+ local isPaused = isQueuePaused(parentMetaKey)
167
+ addJobWithPriority(parentMarkerKey,
168
+ parentQueueKey .. ":prioritized", priority,
169
+ parentId, parentQueueKey .. ":pc", isPaused)
170
+ end
171
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting",
172
+ "jobId", parentId, "prev", "waiting-children")
173
+ end
174
+ end
175
+ end
187
176
  local function updateParentDepsIfNeeded(parentKey, parentQueueKey, parentDependenciesKey,
188
177
  parentId, jobIdKey, returnvalue, timestamp )
189
178
  local processedSet = parentKey .. ":processed"
@@ -255,13 +244,13 @@ local score = delayedTimestamp * 0x1000 + bit.band(jobCounter, 0xfff)
255
244
  rcall("ZADD", delayedKey, score, jobId)
256
245
  rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "delayed",
257
246
  "jobId", jobId, "delay", delayedTimestamp)
258
- -- If wait list is empty, and this delayed job is the next one to be processed,
259
- -- then we need to signal the workers by adding a dummy job (jobId 0:delay) to the wait list.
260
- local target = getTargetQueueList(metaKey, KEYS[1], KEYS[2])
261
- addDelayMarkerIfNeeded(target, delayedKey)
247
+ -- mark that a delayed job is available
248
+ local isPaused = isQueuePaused(metaKey)
249
+ if not isPaused then
250
+ local markerKey = KEYS[1]
251
+ addDelayMarkerIfNeeded(markerKey, delayedKey)
252
+ end
262
253
  -- Check if this job is a child of another job, if so add it to the parents dependencies
263
- -- TODO: Should not be possible to add a child job to a parent that is not in the "waiting-children" status.
264
- -- fail in this case.
265
254
  if parentDependenciesKey ~= nil then
266
255
  rcall("SADD", parentDependenciesKey, jobIdKey)
267
256
  end
@@ -270,6 +259,6 @@ return jobId .. "" -- convert to string
270
259
  exports.addDelayedJob = {
271
260
  name: 'addDelayedJob',
272
261
  content,
273
- keys: 7,
262
+ keys: 6,
274
263
  };
275
- //# sourceMappingURL=addDelayedJob-7.js.map
264
+ //# sourceMappingURL=addDelayedJob-6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"moveToActive-10.js","sourceRoot":"","sources":["../../../src/scripts/moveToActive-10.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmPf,CAAC;AACW,QAAA,YAAY,GAAG;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}
1
+ {"version":3,"file":"addDelayedJob-6.js","sourceRoot":"","sources":["../../../src/scripts/addDelayedJob-6.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Pf,CAAC;AACW,QAAA,aAAa,GAAG;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -77,7 +77,7 @@ end
77
77
  -- Includes
78
78
  --[[
79
79
  Add delay marker if needed.
80
- ]]
80
+ ]]
81
81
  -- Includes
82
82
  --[[
83
83
  Function to return the next delayed job timestamp.
@@ -92,47 +92,30 @@ local function getNextDelayedTimestamp(delayedKey)
92
92
  return nextTimestamp
93
93
  end
94
94
  end
95
- local function addDelayMarkerIfNeeded(targetKey, delayedKey)
96
- local waitLen = rcall("LLEN", targetKey)
97
- if waitLen <= 1 then
95
+ local function addDelayMarkerIfNeeded(markerKey, delayedKey)
98
96
  local nextTimestamp = getNextDelayedTimestamp(delayedKey)
99
97
  if nextTimestamp ~= nil then
100
- -- Check if there is already a marker with older timestamp
101
- -- if there is, we need to replace it.
102
- if waitLen == 1 then
103
- local marker = rcall("LINDEX", targetKey, 0)
104
- local oldTimestamp = tonumber(marker:sub(3))
105
- if oldTimestamp and oldTimestamp > nextTimestamp then
106
- rcall("LSET", targetKey, 0, "0:" .. nextTimestamp)
107
- end
108
- else
109
- -- if there is no marker, then we need to add one
110
- rcall("LPUSH", targetKey, "0:" .. nextTimestamp)
111
- end
98
+ -- Replace the score of the marker with the newest known
99
+ -- next timestamp.
100
+ rcall("ZADD", markerKey, nextTimestamp, "0")
112
101
  end
113
- end
114
102
  end
115
103
  --[[
116
- Function to add job considering priority.
104
+ Function to check for the meta.paused key to decide if we are paused or not
105
+ (since an empty list and !EXISTS are not really the same).
117
106
  ]]
118
- -- Includes
107
+ local function isQueuePaused(queueMetaKey)
108
+ return rcall("HEXISTS", queueMetaKey, "paused") == 1
109
+ end
119
110
  --[[
120
- Function priority marker to wait if needed
121
- in order to wake up our workers and to respect priority
122
- order as much as possible
111
+ Function to add job considering priority.
123
112
  ]]
124
- local function addPriorityMarkerIfNeeded(waitKey)
125
- local waitLen = rcall("LLEN", waitKey)
126
- if waitLen == 0 then
127
- rcall("LPUSH", waitKey, "0:0")
128
- end
129
- end
130
- local function addJobWithPriority(waitKey, prioritizedKey, priority, paused, jobId, priorityCounterKey)
113
+ local function addJobWithPriority(markerKey, prioritizedKey, priority, jobId, priorityCounterKey, isPaused)
131
114
  local prioCounter = rcall("INCR", priorityCounterKey)
132
115
  local score = priority * 0x100000000 + bit.band(prioCounter, 0xffffffffffff)
133
116
  rcall("ZADD", prioritizedKey, score, jobId)
134
- if not paused then
135
- addPriorityMarkerIfNeeded(waitKey)
117
+ if not isPaused then
118
+ rcall("ZADD", markerKey, 0, "0")
136
119
  end
137
120
  end
138
121
  --[[
@@ -146,35 +129,44 @@ local function getTargetQueueList(queueMetaKey, waitKey, pausedKey)
146
129
  return pausedKey, true
147
130
  end
148
131
  end
149
- local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
150
- local isParentActive = rcall("ZSCORE", parentQueueKey .. ":waiting-children", parentId)
151
- if rcall("SCARD", parentDependenciesKey) == 0 and isParentActive then
152
- rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
153
- local parentWaitKey = parentQueueKey .. ":wait"
154
- local parentTarget, paused = getTargetQueueList(parentQueueKey .. ":meta", parentWaitKey,
155
- parentQueueKey .. ":paused")
156
- local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
157
- local priority = tonumber(jobAttributes[1]) or 0
158
- local delay = tonumber(jobAttributes[2]) or 0
159
- if delay > 0 then
160
- local delayedTimestamp = tonumber(timestamp) + delay
161
- local score = delayedTimestamp * 0x1000
162
- local parentDelayedKey = parentQueueKey .. ":delayed"
163
- rcall("ZADD", parentDelayedKey, score, parentId)
164
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId,
165
- "delay", delayedTimestamp)
166
- addDelayMarkerIfNeeded(parentTarget, parentDelayedKey)
167
- else
168
- if priority == 0 then
169
- rcall("RPUSH", parentTarget, parentId)
170
- else
171
- addJobWithPriority(parentWaitKey, parentQueueKey .. ":prioritized", priority, paused,
172
- parentId, parentQueueKey .. ":pc")
173
- end
174
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId,
175
- "prev", "waiting-children")
132
+ local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey,
133
+ parentKey, parentId, timestamp)
134
+ local isParentActive = rcall("ZSCORE",
135
+ parentQueueKey .. ":waiting-children", parentId)
136
+ if rcall("SCARD", parentDependenciesKey) == 0 and isParentActive then
137
+ rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
138
+ local parentWaitKey = parentQueueKey .. ":wait"
139
+ local parentPausedKey = parentQueueKey .. ":paused"
140
+ local parentMetaKey = parentQueueKey .. ":meta"
141
+ local parentMarkerKey = parentQueueKey .. ":marker"
142
+ local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
143
+ local priority = tonumber(jobAttributes[1]) or 0
144
+ local delay = tonumber(jobAttributes[2]) or 0
145
+ if delay > 0 then
146
+ local delayedTimestamp = tonumber(timestamp) + delay
147
+ local score = delayedTimestamp * 0x1000
148
+ local parentDelayedKey = parentQueueKey .. ":delayed"
149
+ rcall("ZADD", parentDelayedKey, score, parentId)
150
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed",
151
+ "jobId", parentId, "delay", delayedTimestamp)
152
+ addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
153
+ else
154
+ if priority == 0 then
155
+ local parentTarget, _paused =
156
+ getTargetQueueList(parentMetaKey, parentWaitKey,
157
+ parentPausedKey)
158
+ rcall("RPUSH", parentTarget, parentId)
159
+ rcall("ZADD", parentMarkerKey, 0, "0")
160
+ else
161
+ local isPaused = isQueuePaused(parentMetaKey)
162
+ addJobWithPriority(parentMarkerKey,
163
+ parentQueueKey .. ":prioritized", priority,
164
+ parentId, parentQueueKey .. ":pc", isPaused)
165
+ end
166
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting",
167
+ "jobId", parentId, "prev", "waiting-children")
168
+ end
176
169
  end
177
- end
178
170
  end
179
171
  local function updateParentDepsIfNeeded(parentKey, parentQueueKey, parentDependenciesKey,
180
172
  parentId, jobIdKey, returnvalue, timestamp )
@@ -244,8 +236,6 @@ rcall("ZADD", waitChildrenKey, timestamp, jobId)
244
236
  rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event",
245
237
  "waiting-children", "jobId", jobId)
246
238
  -- Check if this job is a child of another job, if so add it to the parents dependencies
247
- -- TODO: Should not be possible to add a child job to a parent that is not in the "waiting-children" status.
248
- -- fail in this case.
249
239
  if parentDependenciesKey ~= nil then
250
240
  rcall("SADD", parentDependenciesKey, jobIdKey)
251
241
  end
@@ -1 +1 @@
1
- {"version":3,"file":"addParentJob-4.js","sourceRoot":"","sources":["../../../src/scripts/addParentJob-4.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyPf,CAAC;AACW,QAAA,YAAY,GAAG;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"addParentJob-4.js","sourceRoot":"","sources":["../../../src/scripts/addParentJob-4.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Of,CAAC;AACW,QAAA,YAAY,GAAG;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}