Merge pull request 'Issue 059 — the broker credential names the hub, not the broker's node' (#50) from issue/059-broker-address-review into main
This commit was merged in pull request #50.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
---
|
||||
status: located
|
||||
opened: 2026-09-17
|
||||
located-in:
|
||||
- mesh-controller
|
||||
fixed-by:
|
||||
amended-design:
|
||||
---
|
||||
|
||||
# 059 — The broker credential names the hub, not the node holding the broker
|
||||
|
||||
## Symptom
|
||||
|
||||
An adversarial review of the issue-055 fix (`brokerReachableAt`) found the cross-node broker
|
||||
address is computed from the wrong facts. No live failure yet — every current mesh has the broker
|
||||
on the hub — but each is a wrong invariant that fails exactly when the topology stops being the
|
||||
simple one:
|
||||
|
||||
1. **The helper returns the hub's overlay name for any on-overlay node, but nothing ties the
|
||||
broker to the hub.** The broker lives wherever the module holding the `mesh-broker` seat is
|
||||
assigned; hub-ness is a separate operator declaration — and the overlay design actively pushes
|
||||
them apart (the hub must be publicly dialable; a natural topology is hub-on-a-relay,
|
||||
foundation at home). In that mesh every issued credential dials a relay where no broker
|
||||
listens.
|
||||
2. **"On the overlay" is tested as "has an overlay address."** The codebase itself defines
|
||||
membership as *resolved the networking module* — "not 'has an address'… it is what resolved
|
||||
the module" — and excludes address-only nodes from every peer list. A node placed but not yet
|
||||
given networking is sealed an overlay URL it cannot route.
|
||||
3. **A credential issued before `overlay place` keeps the public URL for ever**, and nothing says
|
||||
so; the remedy (re-issue + push) works but is undocumented. The sibling of issue 057's
|
||||
ordering gap.
|
||||
4. **A portless `MESH_BROKER_ADDRESS` silently disables the fix** — `SplitHostPort` fails and the
|
||||
helper falls back to the public address without a word. The port should default to 5671, or
|
||||
the address should be refused at genesis.
|
||||
5. **Two hubs are never refused.** A second `overlay place --hub` leaves both flagged; the pick is
|
||||
then order-dependent. `ErrNotOneHub` exists and nothing returns it.
|
||||
|
||||
One review claim is recorded here as **disputed**: that the from-mesh forward rule could not have
|
||||
been the 055 failure because the broker port is opened from anywhere. The live measurements during
|
||||
055 (nftables counters; a cross-node probe of the amqps port flipping CLOSED→OPEN exactly when the
|
||||
broker module's `listens` gained the port) say the forward chain was the gate for published
|
||||
container ports. The code-reading and the wire disagree; the wire was measured.
|
||||
|
||||
## Why it matters
|
||||
|
||||
The 055 fix is correct for every mesh that exists, and wrong by construction for the first mesh
|
||||
whose hub is not its control-node — which the overlay design itself recommends for a home mesh
|
||||
behind NAT. Credentials are sealed and long-lived, so the failure arrives long after the decision
|
||||
that caused it, on the first module pushed to a node that joined the reshaped mesh.
|
||||
|
||||
## Open questions
|
||||
|
||||
- Should the broker address resolve from the `mesh-broker` seat's assignment (falling back to the
|
||||
hub only when nothing holds the seat — genesis), and should membership use the same
|
||||
resolved-networking test the peer graph uses?
|
||||
- Where does the stale-credential remedy live: a warning from `overlay place`, an automatic
|
||||
re-issue at the next push, or documentation?
|
||||
- Should a second `--hub` be refused outright (`ErrNotOneHub` finally thrown)?
|
||||
Reference in New Issue
Block a user