177 lines
4.6 KiB
JSON
177 lines
4.6 KiB
JSON
{
|
|
"planPath": "archreview/plans/PLAN-01-cluster-host-failover.md",
|
|
"tasks": [
|
|
{
|
|
"id": 1,
|
|
"subject": "Task 1: Enable the SBR downing provider in BuildHocon",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 2,
|
|
"subject": "Task 2: Raise the cluster-leave CoordinatedShutdown phase timeout above the drain budget",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
1
|
|
]
|
|
},
|
|
{
|
|
"id": 3,
|
|
"subject": "Task 3: Two-node in-process cluster fixture (the reusable failover rig)",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
1
|
|
]
|
|
},
|
|
{
|
|
"id": 4,
|
|
"subject": "Task 4: SBR behavioral proof \u2014 DELIVERED as younger-node-crash (SBR downs it, oldest keeps singleton); the planned oldest-crash 'singleton migration' is impossible under 2-node keep-oldest \u2014 see master-tracker follow-up",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
3
|
|
]
|
|
},
|
|
{
|
|
"id": 5,
|
|
"subject": "Task 5: ClusterActivityEvaluator \u2014 single oldest-member \"active node\" definition",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 6,
|
|
"subject": "Task 6: Rewire ActiveNodeGate, AkkaClusterNodeProvider and Primary labels onto the evaluator",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
5
|
|
]
|
|
},
|
|
{
|
|
"id": 7,
|
|
"subject": "Task 7: Oldest-based /health/active check + require DB reachability for Active",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
5
|
|
]
|
|
},
|
|
{
|
|
"id": 8,
|
|
"subject": "Task 8: Divergence proof \u2014 restarted first node must NOT become active again",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
3,
|
|
6
|
|
]
|
|
},
|
|
{
|
|
"id": 9,
|
|
"subject": "Task 9: CentralSingletonRegistrar helper (manager + drain task + proxy)",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
2
|
|
]
|
|
},
|
|
{
|
|
"id": 10,
|
|
"subject": "Task 10: Route all seven central singletons through the registrar (adds missing outbox/ingest drains)",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
9
|
|
]
|
|
},
|
|
{
|
|
"id": 11,
|
|
"subject": "Task 11: SiteHealthReportAck message + ack semantics in the communication actors",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 12,
|
|
"subject": "Task 12: Acked async health-report transport so counter-restore actually fires",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
11
|
|
]
|
|
},
|
|
{
|
|
"id": 13,
|
|
"subject": "Task 13: Metrics-staleness signal + status-transition timestamps in the aggregator",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 14,
|
|
"subject": "Task 14: Surface metrics-stale + offline-since on the Health dashboard",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
13
|
|
]
|
|
},
|
|
{
|
|
"id": 15,
|
|
"subject": "Task 15: Fix the metrics-port seed in appsettings.Site.json + close the validator gap",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 16,
|
|
"subject": "Task 16: Single-node installs \u2014 explicit AllowSingleNodeCluster instead of phantom seeds",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 17,
|
|
"subject": "Task 17: stop_grace_period for all app containers (both topologies)",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 18,
|
|
"subject": "Task 18: Evict deleted sites from the health aggregator",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
13
|
|
]
|
|
},
|
|
{
|
|
"id": 19,
|
|
"subject": "Task 19: Rate-limit dead-letter warnings",
|
|
"status": "completed",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": 20,
|
|
"subject": "Task 20: Down-if-alone recovery \u2014 exit on unexpected ActorSystem termination + service restart actions",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
10
|
|
]
|
|
},
|
|
{
|
|
"id": 21,
|
|
"subject": "Task 21: Docker failover drill script (manual/CI kill test against the real topology)",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
1,
|
|
17
|
|
]
|
|
},
|
|
{
|
|
"id": 22,
|
|
"subject": "Task 22: Reconcile REQ-HOST-6 (Akka.Hosting) with the hand-rolled bootstrap",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
1
|
|
]
|
|
},
|
|
{
|
|
"id": 23,
|
|
"subject": "Task 23: Docs & deploy-config cleanup batch (Traefik doc, NodeName overlays, TLS roadmap note)",
|
|
"status": "completed",
|
|
"blockedBy": [
|
|
7,
|
|
16
|
|
]
|
|
}
|
|
],
|
|
"lastUpdated": "2026-07-08"
|
|
} |