mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-15 15:02:04 +00:00
The v1.28.33 rollup + staging fixes were correct but never reached the reporter's case: the upload dedup keys on the content SHA-256 and the lookup matched a previously FAILED job too, so re-uploading the same export.zip returned the dead job's id and replayed its stale failureReason without ever staging or sending again. The dedup now excludes failed rows (short-circuits only on queued/unpacking/parsing/ upserting/done); the same bytes retry cleanly. A redundant staged upload is unlinked on a dedup hit instead of leaking in the staging dir. reconcileOrphanImportJobs no longer unconditionally fails every non-terminal ImportJob at boot: it now checks pg-boss job state plus a progress heartbeat (new import_jobs.updated_at, migration 0242), so a split or multi-worker deployment cannot kill an import running in another worker. The missing-staging message names the separate-container cause explicitly, with a matching note in docs/self-hosting/scaling.md.
13 lines
736 B
SQL
13 lines
736 B
SQL
-- Import-job liveness heartbeat (issue #486 follow-up).
|
|
--
|
|
-- `reconcileOrphanImportJobs` used to flip EVERY non-terminal ImportJob
|
|
-- row to `failed` on any worker boot — killing an import that was still
|
|
-- actively parsing in another worker (multi-replica / rolling deploy).
|
|
-- The reconcile now gates on this heartbeat: a non-terminal row is only
|
|
-- treated as orphaned when its pg-boss job is gone/terminal OR its
|
|
-- heartbeat has gone stale. `@updatedAt` bumps this column on every
|
|
-- write, including each mid-run progress tick, so a live import keeps it
|
|
-- fresh. Existing rows backfill to the ALTER time via the DB default.
|
|
ALTER TABLE "import_jobs"
|
|
ADD COLUMN "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
|