Queue/shedulerarea fix - #233
Open
suryendudas wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Fixed a bug in recoverStaleLeases() (apps/backend/src/queue/queue.service.ts) where jobs whose worker lease expired were unconditionally reset to 'queued', with no check against maxAttempts. fail() enforces that cap, but only runs when a worker catches an error — a payload that crashes the worker outright (uncaught exception, OOM, kill) never reaches fail(), so recoverStaleLeases() was the only backstop, and it bypassed the cap entirely. A single "poison pill" job could crash a worker, get reclaimed, crash another worker, and repeat indefinitely.
recoverStaleLeases() now splits stale jobs into two groups using a $expr comparison between attempts and maxAttempts: jobs with attempts remaining are requeued as before, and jobs that already used their last attempt are now marked 'failed' with a clear error message, matching what fail() would have done.
Also updated the state-machine comment in job.model.ts to document the lease-expiry transition (previously undocumented), and added a regression test simulating the poison-pill scenario.
Related issue
Type of change
Area affected
/admin/*)/community— posts, comments, auto-answer)CI verification
cd apps/backend && npx tsc --noEmitexits 0cd apps/backend && npx vitest run— all tests passcd apps/frontend && npx tsc --noEmitexits 0cd apps/frontend && npx vitest run— all tests passpnpm run lint— 0 errors (152 warnings is the baseline)main, no merge commitsNotes for reviewer
Regression test added specifically for this fix: "poison-pill regression" in queue.service.test.ts, simulating a worker that crashes (not a caught error) after using its last attempt. Could not run the test suite in my dev sandbox (no network access to mongodb-memory-server's binary download) — please confirm it passes in your environment before merging.