A mesh seat may be replicated: the resolver held on two machines (hq ADR 0223) #65

Merged
mesh-admin merged 2 commits from feat/the-mesh-has-two-resolvers into main 2026-10-05 20:48:23 +00:00
Contributor

hq ADR 0223.

  • Seat.Replicated (compiled, never stored, like Needs); only mesh-dns-resolver.
  • Holdings keyed by (seat, node, module): migration 0062. HoldSeat (seat --to) replaces every holder in one transaction; new AddSeatHolder behind seat <name> --add <node>/<module>, refused for a seat held once.
  • checkClaims: every holder on record holds and is never a second claimant; a seat held once with two records is refused, naming it; two claimants with nothing on record are still refused.
  • answeredElsewhere: a machine holding the seat answers its own requirement. HolderAmong returns the first holder in the providers' (name) order.
  • Roster facts get .Holders (seat -> holders, this machine first, then by name); the plan renders it from the holders on record (or the sole claimant) on the private network.
  • seats --json shows replicated.

Tests: two holders compose on both and each lists itself first; a third machine lists both and no public resolver; a holder answers itself; mesh-store still refuses a second holder (and two records); unrecorded claimants of the replicated seat are refused; only the resolver is replicated and survives store rows; one host record per machine (issue 262's missing check); store test for several holders. make check (live Postgres) green with the catalogue branch beside it.

Order: merge and roll out before mesh-catalog's feat/the-mesh-has-two-resolvers (its template reads .Holders, which an older controller cannot render). Against catalogue main, four tests that read the catalogue fail by design (they expect the new resolv-conf); the code itself is safe with the old catalogue.

hq ADR 0223. - `Seat.Replicated` (compiled, never stored, like `Needs`); only `mesh-dns-resolver`. - Holdings keyed by (seat, node, module): migration **0062**. `HoldSeat` (`seat --to`) replaces every holder in one transaction; new `AddSeatHolder` behind `seat <name> --add <node>/<module>`, refused for a seat held once. - `checkClaims`: every holder on record holds and is never a second claimant; a seat held once with two records is refused, naming it; two claimants with nothing on record are still refused. - `answeredElsewhere`: a machine holding the seat answers its own requirement. `HolderAmong` returns the first holder in the providers' (name) order. - Roster facts get `.Holders` (seat -> holders, this machine first, then by name); the plan renders it from the holders on record (or the sole claimant) on the private network. - `seats --json` shows `replicated`. Tests: two holders compose on both and each lists itself first; a third machine lists both and no public resolver; a holder answers itself; `mesh-store` still refuses a second holder (and two records); unrecorded claimants of the replicated seat are refused; only the resolver is replicated and survives store rows; one host record per machine (issue 262's missing check); store test for several holders. `make check` (live Postgres) green with the catalogue branch beside it. **Order:** merge and roll out **before** mesh-catalog's `feat/the-mesh-has-two-resolvers` (its template reads `.Holders`, which an older controller cannot render). Against catalogue main, four tests that read the catalogue fail by design (they expect the new resolv-conf); the code itself is safe with the old catalogue.
jschoubben added 1 commit 2026-10-05 20:45:05 +00:00
musl takes the first reply from any listed nameserver, so a public fallback
beside the mesh's resolver answered NXDOMAIN for mesh names in every Alpine
container (hq ADR 0223). The fix is two mesh resolvers and no public one, which
needs mesh-dns-resolver held on two machines: a seat can now be replicated,
each holder recorded by 'seat <name> --add', checkClaims accepts every holder
on record and still refuses a second holder of any other mesh seat, a holder
answers its own requirement, and a roster fact gives each replicated seat's
holders, this machine first, so resolv-conf can list them. Migration 0062 keys
a holding by seat and assignment.
jschoubben force-pushed feat/the-mesh-has-two-resolvers from 130d20114b to f506fb34ec 2026-10-05 20:45:05 +00:00 Compare
jschoubben added 1 commit 2026-10-05 20:47:46 +00:00
mesh-admin merged commit df9231c734 into main 2026-10-05 20:48:23 +00:00
mesh-admin deleted branch feat/the-mesh-has-two-resolvers 2026-10-05 20:48:23 +00:00
Author
Contributor

Delivery novox/mesh-controller@df9231c73445 — held since 2026-10-06T23:05:28Z

Held for a person: merged without a passing check: only a person decides that it goes on — mesh-delivery.release with why lets it go on.

Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • tier 2: route-proxy
  • ace: receives build-agent, route-proxy
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent, route-proxy
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • route-proxy provides route: its consumers are sent again after it
  • route-proxy keeps data (ADR 0233): what it holds is backed up before it moves

Transitions

  • 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#65 merged; its head was not heard by this owner, so it is made from the forge's word
  • 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on

The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@df9231c73445` — **held** since 2026-10-06T23:05:28Z Held for a person: merged without a passing check: only a person decides that it goes on — `mesh-delivery.release` with why lets it go on. **Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - tier 2: route-proxy - ace: receives build-agent, route-proxy - g14: receives build-agent - novox: receives mesh-controller, build-agent, route-proxy - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - route-proxy provides route: its consumers are sent again after it - route-proxy keeps data (ADR 0233): what it holds is backed up before it moves **Transitions** - 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#65 merged; its head was not heard by this owner, so it is made from the forge's word - 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
This repo is archived. You cannot comment on pull requests.