From 7f494da4343e9d5be8b528aa54336f97f7a6e9c4 Mon Sep 17 00:00:00 2001 From: DaxServer Date: Sun, 21 Jun 2026 13:17:12 +0200 Subject: [PATCH 1/2] fix: reset task status to queued on intermediate BullMQ retry attempts Co-Authored-By: Claude Sonnet 4.6 --- backend/src/__tests__/upload.worker.test.ts | 6 +++--- backend/src/workers/upload.worker.ts | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/src/__tests__/upload.worker.test.ts b/backend/src/__tests__/upload.worker.test.ts index 9cc2d8e..5934cd1 100644 --- a/backend/src/__tests__/upload.worker.test.ts +++ b/backend/src/__tests__/upload.worker.test.ts @@ -106,11 +106,11 @@ describe('upload worker — retryable errors escape the processor without a DB u // it calls updateUploadStatus('failed') so the row no longer stays permanently // stuck at 'in_progress'. -describe('upload worker — failed handler skips DB on intermediate BullMQ attempt', () => { +describe('upload worker — failed handler resets status to queued on intermediate BullMQ attempt', () => { it.each([ ['HashLockError', new HashLockError('lock already held')], ['SourceCdnError', new SourceCdnError('cdn network error (ECONNRESET)')], - ])('%s: does not touch the DB when BullMQ will retry', async (_name, error) => { + ])('%s: resets status to queued when BullMQ will retry', async (_name, error) => { const failedHandler = capturedHandlers.get('failed') expect(failedHandler).toBeDefined() @@ -119,7 +119,7 @@ describe('upload worker — failed handler skips DB on intermediate BullMQ attem await failedHandler!(job, error) - expect(mockUpdateStatus).not.toHaveBeenCalled() + expect(mockUpdateStatus).toHaveBeenCalledWith(1, 'queued') expect(mockClearToken).not.toHaveBeenCalled() }) }) diff --git a/backend/src/workers/upload.worker.ts b/backend/src/workers/upload.worker.ts index df863cd..acd21f9 100644 --- a/backend/src/workers/upload.worker.ts +++ b/backend/src/workers/upload.worker.ts @@ -259,6 +259,7 @@ export function createUploadWorker(redis: Redis, deps?: WorkerDeps): Worker Date: Sun, 21 Jun 2026 13:24:00 +0200 Subject: [PATCH 2/2] fix: guard queued status reset in failed handler against DB errors Co-Authored-By: Claude Sonnet 4.6 --- backend/src/__tests__/upload.worker.test.ts | 11 +++++++++++ backend/src/workers/upload.worker.ts | 11 +++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/backend/src/__tests__/upload.worker.test.ts b/backend/src/__tests__/upload.worker.test.ts index 5934cd1..a34659b 100644 --- a/backend/src/__tests__/upload.worker.test.ts +++ b/backend/src/__tests__/upload.worker.test.ts @@ -122,6 +122,17 @@ describe('upload worker — failed handler resets status to queued on intermedia expect(mockUpdateStatus).toHaveBeenCalledWith(1, 'queued') expect(mockClearToken).not.toHaveBeenCalled() }) + + it('swallows DB errors when resetting status to queued so the handler never rejects', async () => { + mockUpdateStatus.mockRejectedValueOnce(new Error('DB connection lost')) + + const failedHandler = capturedHandlers.get('failed') + expect(failedHandler).toBeDefined() + + const job = { ...makeJob(1), attemptsMade: 1, opts: { attempts: 3 } } + + await expect(failedHandler!(job, new SourceCdnError('cdn error'))).resolves.toBeUndefined() + }) }) describe('upload worker — permanent BullMQ failure marks upload as failed in DB', () => { diff --git a/backend/src/workers/upload.worker.ts b/backend/src/workers/upload.worker.ts index acd21f9..3d74c70 100644 --- a/backend/src/workers/upload.worker.ts +++ b/backend/src/workers/upload.worker.ts @@ -253,13 +253,20 @@ export function createUploadWorker(redis: Redis, deps?: WorkerDeps): Worker