A backup the node agent interrupted runs again, and a held module keeps the build it runs (issue 1289) #189

Merged
mesh-tools merged 2 commits from fix/held-backup into main 2026-10-31 16:33:55 +00:00
Member

Issue 1289 (R4c of design 47): its delivery is held by postgres on the control node.

The fault (live since 2026-10-31 ~01:30): postgres's repeat backup (the operator's "again") was interrupted by the node-engine's own restart. The held have was written from an empty running entry, so it lost the build and composition postgres runs; a have naming no build counts as inside the node's own composition, so postgres was composed from the indexer's manifest without its handed and refused ("its own secret reader is handed to the provisioner and the module is not: nothing would fill it"). And an interrupted backup was never run again: the node waited for a new want, the assigner for a new failure.

The fix (node agent only): a held have names the build and composition the module runs (readHave when running has none); a backup ended by the agent's own stop is marked BackupInterrupted and, at the next start, runs again and the module applies, unless the want says skip. Every other held cause still waits for the operator's answer. The rule for what is inside the node's own composition is unchanged (main's).

Quick fix vs thorough fix: quick: a new backup ask by hand, which would leave the next interrupted backup stuck the same way. Thorough (chosen): the cause fixed where it lives, in the node agent.

Tests (folded into existing tests, no new Test functions): the held have names what runs; an interrupted backup with "again" or no answer is backed up again and applied; a real failure stays held; end to end, a backup blocked until the agent stops leaves a held have naming the old build with BackupInterrupted. Each failed before the fix. gofmt, go vet (with and without -tags integration) and go test pass; the new case passes 5 runs with -race.

Left for later (noted on issue 1289): mesh-sdk's refusal should say "composed from a manifest without its build"; the assigner could skip asking for a BackupInterrupted have.

Reviewed-by: rev-heldbackup@shanks at 76c7ddfc52

https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL

Issue 1289 (R4c of design 47): its delivery is held by postgres on the control node. **The fault (live since 2026-10-31 ~01:30):** postgres's repeat backup (the operator's "again") was interrupted by the node-engine's own restart. The held have was written from an empty `running` entry, so it lost the build and composition postgres runs; a have naming no build counts as inside the node's own composition, so postgres was composed from the indexer's manifest without its `handed` and refused ("its own secret reader is handed to the provisioner and the module is not: nothing would fill it"). And an interrupted backup was never run again: the node waited for a new want, the assigner for a new failure. **The fix (node agent only):** a held have names the build and composition the module runs (`readHave` when `running` has none); a backup ended by the agent's own stop is marked `BackupInterrupted` and, at the next start, runs again and the module applies, unless the want says skip. Every other held cause still waits for the operator's answer. The rule for what is inside the node's own composition is unchanged (main's). **Quick fix vs thorough fix:** quick: a new backup ask by hand, which would leave the next interrupted backup stuck the same way. Thorough (chosen): the cause fixed where it lives, in the node agent. **Tests** (folded into existing tests, no new Test functions): the held have names what runs; an interrupted backup with "again" or no answer is backed up again and applied; a real failure stays held; end to end, a backup blocked until the agent stops leaves a held have naming the old build with `BackupInterrupted`. Each failed before the fix. gofmt, go vet (with and without -tags integration) and go test pass; the new case passes 5 runs with -race. Left for later (noted on issue 1289): mesh-sdk's refusal should say "composed from a manifest without its build"; the assigner could skip asking for a `BackupInterrupted` have. Reviewed-by: rev-heldbackup@shanks at 76c7ddfc52271fe534730d0a473893ab6f1fef1a https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
mesh-tools added 2 commits 2026-10-31 15:39:13 +00:00
On novox (2026-10-31) postgres's repeat backup was interrupted by the node-engine's
restart: its held have named no build, so the node's own composition took postgres in
and was refused for its secret reader, and nothing ran the backup again. Issue 1289
(R4c, its delivery held).

- A held have names what runs: read from the module's have before backing-up when
  the agent has no running entry, as the not-composed mark does.
- A have in any phase but running that names nothing is not run inside the node's own.
- A backup interrupted by the agent's stop is no failure: the next start backs the
  module up again and applies while the want asks a backup. A real failure stays
  held for the operator's answer.

Quick fix: a new backup ask by hand. Thorough, chosen: the fault fixed where it lives
in the node agent, so every data module's interrupted backup resumes by itself.

Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Keep main's rule for which haves run inside the node's own composition
mesh/delivery merged: source.main moved to novox/mesh-host@ffa63d25a066
mesh/check being carried to 76c7ddfc5227 on ffa63d25a066 | from a4713e2d28d7
76c7ddfc52
Review round 1: a have naming no build in a phase but running is also written for a
module that runs inside the node's own (waiting for a yes), so taking it out would
drop its resources before the yes. The fp the held have now keeps already fixes
postgres (issue 1289); a test drives an interrupted backup end to end.

Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Author
Member

Delivery novox/mesh-host@76c7ddfc5227 — merged since 2026-10-31T16:33:57Z

Source — source.main moved to novox/mesh-host@ffa63d25a0. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.

Transitions

  • 2026-10-31 15:39 (new) → proposed (announced): novox/mesh-host#189's head announced
  • 2026-10-31 15:39 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
  • 2026-10-31 16:33 ready → merged (merged): on the trunk its modules follow: merged there

The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-host@76c7ddfc5227` — **merged** since 2026-10-31T16:33:57Z **Source** — source.main moved to novox/mesh-host@ffa63d25a066. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Transitions** - 2026-10-31 15:39 (new) → proposed (announced): novox/mesh-host#189's head announced - 2026-10-31 15:39 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false) - 2026-10-31 16:33 ready → merged (merged): on the trunk its modules follow: merged there The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
mesh-tools merged commit ffa63d25a0 into main 2026-10-31 16:33:55 +00:00
mesh-tools deleted branch fix/held-backup 2026-10-31 16:33:55 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-host#189