Compose each machine once per pass, so take-ins of done builds stop colliding and every new build gets its composition and credential (issue 1945)
#460
Merged
mesh-toolsmerged 7 commits from fix/r6-compose-once into main2026-10-25 12:30:32 +00:00
Since the switch to release 6, every take-in of a done build recomposed every machine of its module itself. Dozens ran at once and collided on the compositions' revisions ("wrong last sequence ... key revision mismatch; tried again in 30s"), so new builds (mesh-host 55e07c82 for g14 and shanks) got no composition and no credential, and wants froze on a digest the bucket no longer held (node-tools on shanks and g14).
What changes:
8a3c0cd0: a waiting take-in says why once and is looked at again every 30 s, one follower per module.
0470869f: the digest kept beside a composition follows the composition the bucket holds, read back after writing.
baa8f584 + 8114cee2: one composer per set of stores. A take-in registers its module and asks the composer for its nodes, then the bus holder, then the grants; the composer runs one pass at a time, composing each node asked since the last pass began once, then the grants once. Each caller hears only its own nodes' errors; grants are written whenever any caller asked for them. Every composition of a node holds a per-node lock. The start pass looks at 16 done keys side by side.
f35aa355 + c47a5904 + 3b4cb69e: no request is dropped by a "busy, return at once" guard. Every such guard in cmd/mesh-controller (takeDoneKey, takeDoneKeyAtStart, replaceGiven) leaves a mark when it finds the work running, and the holder reads the mark after letting go and goes round. The other locks block or refuse aloud.
Tests (each failed first): the burst test, the caller hears its pass's failure, TestAWakeDuringATakeInIsTakenAfterIt, TestANodeThatFailsFailsOnlyItsCallers, the digest race test, TestAWakeJustBeforeTheFollowerLetsGoIsTaken, TestAWakeDuringTheStartsTakeInIsTaken, TestAStartHeardDuringAReplacementIsTaken.
Tries: try-1792929772594650167 passed on 3b4cb69e (962 unit, 1618 integration).
Reviewed-by: reviewer-r6m@shanks at 3b4cb69e84
Pushed-by: lead-47@shanks
Since the switch to release 6, every take-in of a done build recomposed every machine of its module itself. Dozens ran at once and collided on the compositions' revisions ("wrong last sequence ... key revision mismatch; tried again in 30s"), so new builds (mesh-host 55e07c82 for g14 and shanks) got no composition and no credential, and wants froze on a digest the bucket no longer held (node-tools on shanks and g14).
What changes:
1. 8a3c0cd0: a waiting take-in says why once and is looked at again every 30 s, one follower per module.
2. 0470869f: the digest kept beside a composition follows the composition the bucket holds, read back after writing.
3. baa8f584 + 8114cee2: one composer per set of stores. A take-in registers its module and asks the composer for its nodes, then the bus holder, then the grants; the composer runs one pass at a time, composing each node asked since the last pass began once, then the grants once. Each caller hears only its own nodes' errors; grants are written whenever any caller asked for them. Every composition of a node holds a per-node lock. The start pass looks at 16 done keys side by side.
4. f35aa355 + c47a5904 + 3b4cb69e: no request is dropped by a "busy, return at once" guard. Every such guard in cmd/mesh-controller (takeDoneKey, takeDoneKeyAtStart, replaceGiven) leaves a mark when it finds the work running, and the holder reads the mark after letting go and goes round. The other locks block or refuse aloud.
Tests (each failed first): the burst test, the caller hears its pass's failure, TestAWakeDuringATakeInIsTakenAfterIt, TestANodeThatFailsFailsOnlyItsCallers, the digest race test, TestAWakeJustBeforeTheFollowerLetsGoIsTaken, TestAWakeDuringTheStartsTakeInIsTaken, TestAStartHeardDuringAReplacementIsTaken.
Tries: try-1792929772594650167 passed on 3b4cb69e (962 unit, 1618 integration).
Reviewed-by: reviewer-r6m@shanks at 3b4cb69e84ddd59759f07342d56fbdd77d6a8ff2
Pushed-by: lead-47@shanks
Deliverynovox/mesh-controller@3b4cb69e84dd — merged since 2026-10-25T12:30:34Z
Source — source.main moved to novox/mesh-controller@af2b0844a1. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-10-25 12:12 (new) → proposed (announced): novox/mesh-controller#460's head announced
2026-10-25 12:19 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
2026-10-25 12:30 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-controller@3b4cb69e84dd` — **merged** since 2026-10-25T12:30:34Z
**Source** — source.main moved to novox/mesh-controller@af2b0844a1fc. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-10-25 12:12 (new) → proposed (announced): novox/mesh-controller#460's head announced
- 2026-10-25 12:19 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
- 2026-10-25 12:30 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: the operator's Approve of this pull request's merge into main is ended: its head 8114cee2af is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head 8114cee2af47 is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Since the switch to release 6, every take-in of a done build recomposed every machine of its module itself. Dozens ran at once and collided on the compositions' revisions ("wrong last sequence ... key revision mismatch; tried again in 30s"), so new builds (mesh-host 55e07c82 for g14 and shanks) got no composition and no credential, and wants froze on a digest the bucket no longer held (node-tools on shanks and g14).
What changes:
8a3c0cd0: a waiting take-in says why once and is looked at again every 30 s, one follower per module.0470869f: the digest kept beside a composition follows the composition the bucket holds, read back after writing.baa8f584+8114cee2: one composer per set of stores. A take-in registers its module and asks the composer for its nodes, then the bus holder, then the grants; the composer runs one pass at a time, composing each node asked since the last pass began once, then the grants once. Each caller hears only its own nodes' errors; grants are written whenever any caller asked for them. Every composition of a node holds a per-node lock. The start pass looks at 16 done keys side by side.f35aa355+c47a5904+3b4cb69e: no request is dropped by a "busy, return at once" guard. Every such guard in cmd/mesh-controller (takeDoneKey, takeDoneKeyAtStart, replaceGiven) leaves a mark when it finds the work running, and the holder reads the mark after letting go and goes round. The other locks block or refuse aloud.Tests (each failed first): the burst test, the caller hears its pass's failure, TestAWakeDuringATakeInIsTakenAfterIt, TestANodeThatFailsFailsOnlyItsCallers, the digest race test, TestAWakeJustBeforeTheFollowerLetsGoIsTaken, TestAWakeDuringTheStartsTakeInIsTaken, TestAStartHeardDuringAReplacementIsTaken.
Tries: try-1792929772594650167 passed on
3b4cb69e(962 unit, 1618 integration).Reviewed-by: reviewer-r6m@shanks at
3b4cb69e84Pushed-by: lead-47@shanks
Delivery
novox/mesh-controller@3b4cb69e84dd— merged since 2026-10-25T12:30:34ZSource — source.main moved to novox/mesh-controller@af2b0844a1. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head
8114cee2afis no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.