Skip to content

Commit 5191f8c

Browse files
committed
fix: blocked groups (try 2)
1 parent 0df0730 commit 5191f8c

5 files changed

Lines changed: 11 additions & 8 deletions

File tree

src/lua/complete-and-reserve-next-with-metadata.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,4 @@ if nextHead and #nextHead >= 2 then
174174
redis.call("ZADD", readyKey, nextScore, groupId)
175175
end
176176

177-
return id .. "|||" .. groupId .. "|||" .. payload .. "|||" .. attempts .. "|||" .. maxAttempts .. "|||" .. seq .. "|||" .. enq .. "|||" .. orderMs .. "|||" .. score .. "|||" .. deadline
177+
return id .. "||GROUPMQ||" .. groupId .. "||GROUPMQ||" .. payload .. "||GROUPMQ||" .. attempts .. "||GROUPMQ||" .. maxAttempts .. "||GROUPMQ||" .. seq .. "||GROUPMQ||" .. enq .. "||GROUPMQ||" .. orderMs .. "||GROUPMQ||" .. score .. "||GROUPMQ||" .. deadline

src/lua/reserve-atomic.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,4 @@ if nextHead and #nextHead >= 2 then
111111
redis.call("ZADD", readyKey, nextScore, groupId)
112112
end
113113

114-
return id .. "|||" .. groupId .. "|||" .. payload .. "|||" .. attempts .. "|||" .. maxAttempts .. "|||" .. seq .. "|||" .. enq .. "|||" .. orderMs .. "|||" .. score .. "|||" .. deadline
114+
return id .. "||GROUPMQ||" .. groupId .. "||GROUPMQ||" .. payload .. "||GROUPMQ||" .. attempts .. "||GROUPMQ||" .. maxAttempts .. "||GROUPMQ||" .. seq .. "||GROUPMQ||" .. enq .. "||GROUPMQ||" .. orderMs .. "||GROUPMQ||" .. score .. "||GROUPMQ||" .. deadline

src/lua/reserve-batch.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ for i = 1, #groups, 2 do
116116
redis.call("ZADD", readyKey, nextScore, gid)
117117
end
118118

119-
table.insert(out, id .. "|||" .. groupId .. "|||" .. payload .. "|||" .. attempts .. "|||" .. maxAttempts .. "|||" .. seq .. "|||" .. enq .. "|||" .. orderMs .. "|||" .. score .. "|||" .. deadline)
119+
table.insert(out, id .. "||GROUPMQ||" .. groupId .. "||GROUPMQ||" .. payload .. "||GROUPMQ||" .. attempts .. "||GROUPMQ||" .. maxAttempts .. "||GROUPMQ||" .. seq .. "||GROUPMQ||" .. enq .. "||GROUPMQ||" .. orderMs .. "||GROUPMQ||" .. score .. "||GROUPMQ||" .. deadline)
120120
table.insert(processedGroups, gid)
121121
end
122122
end

src/lua/reserve.lua

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ if (not groups or #groups == 0) or shouldCheckStalled then
5656
local headScore = tonumber(head[2])
5757
redis.call("ZADD", readyKey, headScore, gid)
5858
end
59+
-- Remove from group active list (BullMQ-style) - CRITICAL to unblock the group
60+
local groupActiveKey = ns .. ":g:" .. gid .. ":active"
61+
redis.call("LREM", groupActiveKey, 1, jobId)
5962
redis.call("DEL", ns .. ":lock:" .. gid)
6063
redis.call("DEL", procKey)
6164
redis.call("ZREM", processingKey, jobId)
@@ -165,6 +168,6 @@ if nextHead and #nextHead >= 2 then
165168
redis.call("ZADD", readyKey, nextScore, chosenGid)
166169
end
167170

168-
return id .. "|||" .. groupId .. "|||" .. payload .. "|||" .. attempts .. "|||" .. maxAttempts .. "|||" .. seq .. "|||" .. enq .. "|||" .. orderMs .. "|||" .. score .. "|||" .. deadline
171+
return id .. "||GROUPMQ||" .. groupId .. "||GROUPMQ||" .. payload .. "||GROUPMQ||" .. attempts .. "||GROUPMQ||" .. maxAttempts .. "||GROUPMQ||" .. seq .. "||GROUPMQ||" .. enq .. "||GROUPMQ||" .. orderMs .. "||GROUPMQ||" .. score .. "||GROUPMQ||" .. deadline
169172

170173

src/queue.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ export class Queue<T = any> {
717717

718718
if (!raw) return null;
719719

720-
const parts = raw.split('|||');
720+
const parts = raw.split('||GROUPMQ||');
721721
if (parts.length !== 10) return null;
722722

723723
let data: T;
@@ -857,7 +857,7 @@ export class Queue<T = any> {
857857
}
858858

859859
// Parse the result (same format as reserve methods)
860-
const parts = result.split('|||');
860+
const parts = result.split('||GROUPMQ||');
861861
if (parts.length !== 10) {
862862
this.logger.error(
863863
'Queue completeAndReserveNextWithMetadata: unexpected result format:',
@@ -1503,7 +1503,7 @@ export class Queue<T = any> {
15031503
if (!result) return null;
15041504

15051505
// Parse the delimited string response (same format as regular reserve)
1506-
const parts = result.split('|||');
1506+
const parts = result.split('||GROUPMQ||');
15071507
if (parts.length < 10) return null;
15081508

15091509
const [
@@ -1549,7 +1549,7 @@ export class Queue<T = any> {
15491549
const out: Array<ReservedJob<T>> = [];
15501550
for (const r of results || []) {
15511551
if (!r) continue;
1552-
const parts = r.split('|||');
1552+
const parts = r.split('||GROUPMQ||');
15531553
if (parts.length !== 10) continue;
15541554
out.push({
15551555
id: parts[0],

0 commit comments

Comments
 (0)