Skip to content

Prevent stale rescue from overwriting finished jobs - #1373

Open
bgentry wants to merge 1 commit into
masterfrom
bg/fix-stale-job-rescue
Open

Prevent stale rescue from overwriting finished jobs#1373
bgentry wants to merge 1 commit into
masterfrom
bg/fix-stale-job-rescue

Conversation

@bgentry

@bgentry bgentry commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

A worker can complete a job after JobRescuer fetches it but before the rescue update executes. Because rescue updates match only by ID, the stale rescue can overwrite the completed state and change errors, metadata, and timestamps.

Require the job to still be running in the PostgreSQL and SQLite rescue updates. Jobs that have left that state are skipped atomically, while eligible jobs in the same batch are rescued normally.

Add shared driver regression coverage that completes a job between fetch and rescue, then verifies the entire completed row remains unchanged for each rescue outcome. Include an unreleased changelog entry.

Fixes #1302.

A worker can complete a job after the rescuer fetches it but before the
rescue update executes. Updating by ID alone lets that stale snapshot
replace the completed state and mutate errors, metadata, and timestamps.

Require jobs to still be `running` in the PostgreSQL and SQLite rescue
updates so jobs that have left that state are skipped atomically. Preserve
normal rescue behavior for eligible jobs in the same batch.

Add shared driver coverage that completes a job between fetch and rescue,
then checks the entire row remains unchanged for each rescue outcome.

Fixes #1302.
@bgentry
bgentry requested a review from brandur September 8, 2026 00:34
@bgentry
bgentry marked this pull request as ready for review September 8, 2026 00:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JobRescuer can overwrite a job that completed after the stuck-job fetch

1 participant