docs(mesh): rig seed + Phase 1 documentation
- docker-dev seed: AkkaPort = 4053 on all six ClusterNode rows, so a freshly seeded rig matches a migrated one. GrpcPort left null. - config-db-schema.md: both columns, why AkkaPort is NOT NULL/4053 and GrpcPort is nullable, the unenforced duplication + its reconciler, and Enabled's new second meaning as the deploy path's expected-ack set. - Configuration.md: Cluster:Port / PublicHostname now flag that they are stored twice, with the "update the row too" instruction and why the drift is silent. - design doc §7: Phase 1 marked done, plus a "Phase 1 as shipped" note recording both deviations rather than leaving the sketch reading as what happened. - program plan: Phase 1 marked done; AdminUI node edit explicitly deferred. - CLAUDE.md: the deploy-path behaviour change and its three consequences. Claude-Session: https://claude.ai/code/session_01GASWkNEi68FSCtvr6rLoEW
This commit is contained in:
@@ -148,6 +148,8 @@ CREATE TABLE dbo.ClusterNode (
|
||||
Host nvarchar(255) NOT NULL,
|
||||
OpcUaPort int NOT NULL DEFAULT 4840,
|
||||
DashboardPort int NOT NULL DEFAULT 8081,
|
||||
AkkaPort int NOT NULL DEFAULT 4053,
|
||||
GrpcPort int NULL,
|
||||
ApplicationUri nvarchar(256) NOT NULL,
|
||||
ServiceLevelBase tinyint NOT NULL DEFAULT 200,
|
||||
DriverConfigOverridesJson nvarchar(max) NULL CHECK (DriverConfigOverridesJson IS NULL OR ISJSON(DriverConfigOverridesJson) = 1),
|
||||
@@ -167,6 +169,32 @@ CREATE UNIQUE INDEX UX_ClusterNode_Primary_Per_Cluster
|
||||
WHERE RedundancyRole = 'Primary';
|
||||
```
|
||||
|
||||
#### `AkkaPort` / `GrpcPort` — central's dial targets (per-cluster mesh Phase 1)
|
||||
|
||||
These are **the addresses central dials**, not the node's own binding configuration. The node binds
|
||||
from `Cluster:Port` in its own appsettings; these columns duplicate that value for a reader that
|
||||
cannot see the node's config. Today central shares a gossip ring with every node and does not need
|
||||
them — [per-cluster mesh Phase 2](../plans/2026-07-21-per-cluster-mesh-design.md) splits the fleet
|
||||
into one mesh per `Cluster`, after which `Host` + `AkkaPort` is how central builds its ClusterClient
|
||||
contact points, and `GrpcPort` is the Phase 5 telemetry stream.
|
||||
|
||||
`AkkaPort` is `NOT NULL DEFAULT 4053` because every node listens on a remoting port — `0` is never a
|
||||
truthful value, and rows predating the column must migrate to something real. `GrpcPort` is nullable
|
||||
with **no** default because nothing listens on it until Phase 5, and a non-null default would assert
|
||||
a port that does not exist.
|
||||
|
||||
**The duplication against `Cluster:Port` is not enforced by the schema.** A node that binds 4054 while
|
||||
its row says 4053 is unreachable from central in Phase 2, and the symptom there is a silent absence of
|
||||
acks rather than an error. `ClusterNodeAddressReconcilerActor` (an admin-role singleton) compares the
|
||||
rows against observed cluster membership and logs an Error on mismatch. It reads membership rather
|
||||
than having each driver node assert its own row, because Phase 4 removes the driver nodes' ConfigDb
|
||||
connection entirely.
|
||||
|
||||
`Enabled` also gained a second meaning in Phase 1: it is the **expected-ack set** for a deployment.
|
||||
`ConfigPublishCoordinator` no longer derives that set from cluster membership, so an enabled row whose
|
||||
node is down now fails the deployment at the apply deadline instead of letting it seal green without
|
||||
that node. Set `Enabled = 0` for a node taken down for maintenance.
|
||||
|
||||
`DriverConfigOverridesJson` shape:
|
||||
|
||||
```jsonc
|
||||
|
||||
Reference in New Issue
Block a user