Skip to content

Commit 0cfd448

Browse files
Jimmy-xuzimosteipete
authored andcommitted
fix(delivery-queue): change break to continue to prevent head-of-line blocking
When an entry's backoff exceeds the recovery budget, the code was using break which blocked all subsequent entries from being processed. This caused permanent queue blockage for any installation with a delivery entry at retryCount >= 2. Fix: Changed break to continue so entries whose backoff exceeds the remaining budget are skipped individually rather than blocking the entire loop. Closes #27638
1 parent 27f4ab2 commit 0cfd448

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

src/infra/outbound/delivery-queue.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,11 @@ export async function recoverPendingDeliveries(opts: {
253253
const backoff = computeBackoffMs(entry.retryCount + 1);
254254
if (backoff > 0) {
255255
if (now + backoff >= deadline) {
256-
const deferred = pending.length - recovered - failed - skipped;
257-
opts.log.warn(
258-
`Recovery time budget exceeded — ${deferred} entries deferred to next restart`,
256+
opts.log.info(
257+
`Backoff ${backoff}ms exceeds budget for ${entry.id} — skipping to next entry`,
259258
);
260-
break;
259+
skipped += 1;
260+
continue;
261261
}
262262
opts.log.info(`Waiting ${backoff}ms before retrying delivery ${entry.id}`);
263263
await delayFn(backoff);

src/infra/outbound/outbound.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,12 +394,12 @@ describe("delivery-queue", () => {
394394

395395
expect(deliver).not.toHaveBeenCalled();
396396
expect(delay).not.toHaveBeenCalled();
397-
expect(result).toEqual({ recovered: 0, failed: 0, skipped: 0 });
397+
expect(result).toEqual({ recovered: 0, failed: 0, skipped: 1 });
398398

399399
const remaining = await loadPendingDeliveries(tmpDir);
400400
expect(remaining).toHaveLength(1);
401401

402-
expect(log.warn).toHaveBeenCalledWith(expect.stringContaining("deferred to next restart"));
402+
expect(log.info).toHaveBeenCalledWith(expect.stringContaining("Backoff"));
403403
});
404404

405405
it("returns zeros when queue is empty", async () => {

0 commit comments

Comments
 (0)