tidaldb/docs/planning/milestone-8/phase-10/OVERVIEW.md
jx12n 8a0950260f feat(m8p10): multi-process cluster mode — scatter-gather, reconcile relay, chaos/UAT suites
Splits monolithic cluster.rs into tidal-server/src/cluster/ modules. Adds redeliver-missed
relay, bounded HLC drift, lag tracking, and reconcile idempotence. Five new tier-3 test suites
(chaos, lifecycle, multiproc, region, routes, runbook) all green. Docs, CHANGELOG, and ROADMAP
updated with G4/G5/G6 known gaps.
2026-06-10 14:07:33 -06:00

92 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 10: Multi-Node UAT (m8p10)
## Delivers
True multi-process cluster mode — each `tidal-server cluster --region <name>` process owns
exactly ONE region and peers with sibling processes over real gRPC — plus the tier-3 chaos
suite that the ROADMAP defines for this phase: multi-process UAT of all 5 original M8 UAT
scenario steps, real network-partition injection, clock-skew simulation, rolling upgrade,
cluster-runbook verification, and the performance assertions (replication < 2s p99,
failover < 10s, reconciliation < 100ms over localhost).
The single-process cluster mode (m8p8) is retained unchanged as the dev/demo default; the
multi-process mode is additive, selected by the new `--region` flag.
## Dependencies
- m8p7 (gRPC transport, `tidal-net`) COMPLETE
- m8p8 (multi-node `tidal-server`, cluster routes) COMPLETE
- m8p9 (cross-node scatter-gather queries) COMPLETE
- Engine primitives: `Transport` trait, `spawn_receiver`/`start_replication`,
`ReplicationState`, `ReplicationLagGauge`, `ReconciliationEngine`/`StateSnapshot`,
`Hlc`, `encode_batch`, `redeliver_missed` invariants all shipped (m8p1p6)
## Research References
- `docs/specs/14-scale-architecture.md` §7 (query routing, deadlines), §9 (replication SLA)
- `docs/planning/ROADMAP.md` "Phase 10: Multi-Node UAT (m8p10)" the authoritative spec
- `docs/planning/ROADMAP.md` Milestone 8 "UAT Scenario" (the original 5 steps)
- `docs/runbooks/cluster.md` the operations that must verify against the real cluster
- `tidal/src/testing/cluster.rs` + `cluster_transport.rs` the load-bearing relay
invariants (seqno atomicity/rollback, `single_event_payload`, `redeliver_missed`
destination contract) that the production relay must inherit, not duplicate
## Acceptance Criteria (Phase Level)
From ROADMAP Phase 10 (verbatim):
- [ ] 3-process cluster starts, seeds data, and passes all 5 original M8 UAT scenario steps over gRPC
- [ ] Network partition between two followers: writes continue on leader; heal restores convergence with no data loss
- [ ] Rolling upgrade: mixed-version window produces no errors or data corruption
- [ ] Every cluster runbook operation works against the real cluster
- [ ] Performance: replication < 2s, failover < 10s, reconciliation < 100ms (all over localhost)
## Task Execution Order
| Task | Title | Complexity | Depends on |
|------|-------|------------|------------|
| 01 | Engine relay module, HLC clock offset, StateSnapshot wire serde | L | |
| 02 | Single-region cluster mode (`--region`, `RegionClusterState`) | XL | 01 |
| 03 | Cross-process routes: forwarding, promote fan-out, status aggregation, reconcile, sharded | XL | 02 |
| 04 | Multi-process harness + UAT steps 1/2/5 + perf assertions | L | 03 |
| 05 | TCP-proxy partition injection + UAT steps 3/4 + reconcile timing | L | 04 |
| 06 | Clock-skew and rolling-upgrade scenarios | M | 04 |
| 07 | Runbook-verification suite + docs/ROADMAP/CHANGELOG updates | M | 04, 05, 06 |
## Module Location
- Engine: `tidal/src/replication/relay.rs` (new), `tidal/src/replication/crdt/hlc.rs`,
`tidal/src/replication/reconcile.rs`, `tidal/src/db/builder.rs`,
`tidal/src/db/replication_ops.rs`
- Server: `tidal-server/src/cluster/` (split from `cluster.rs` per the tracked
Maintainability-S follow-up: `topology.rs`, `transport.rs`, `state.rs`, `node.rs`,
`routes.rs`, `forward.rs`)
- Tests: `tidal-server/tests/cluster_multiproc.rs`, `cluster_chaos.rs`,
`cluster_runbook.rs` (all `#![cfg(feature = "cluster-e2e")]`)
- Docs: `docs/runbooks/cluster.md`, `docs/runbooks/kubernetes.md`,
`docs/planning/ROADMAP.md`, `CHANGELOG.md`
## Notes
- **Partition injection mechanism.** The ROADMAP spec allows iptables/pfctl *or*
proxy-based injection ("toxiproxy or similar"). We implement an in-harness TCP relay
proxy: peers connect through real TCP relays the test controls; severing a relay is a
real network partition (connections die, gRPC ships fail, circuit breaker opens) with no
root privileges and identical behavior on macOS/Linux. iptables/pfctl require root and
are not portable to dev machines; the proxy approach is the spec-sanctioned alternative.
- **Write-durability contract unchanged.** 204 = leader durability (storage + WAL fsync).
A quorum-ack write contract is NOT in this phase's ROADMAP acceptance criteria; the
runbook §8 text that loosely tied it to m8p10 is updated in task 07 to track it as a
post-M8 follow-up. Scope decision recorded here so it is explicit, not silent.
- **Default read region in multi-process mode is the LOCAL region** (each process serves
its own replica); `?region=` forwards to the owning process. Single-process mode keeps
leader-default. Documented in the runbook rewrite.
- **G3 (Knuth vs Jump Consistent Hash unification) is not a prerequisite**: both routing
tiers remain internally consistent (engine `ShardRouter` is the single router for
`/sharded/*` writes and reads). G3 stays open as an m8p9 gap.
- **Experimental gate retained** for both cluster modes (multi-process is new; quorum-ack
and automatic failure detection remain future work). The WARN text differentiates the
modes honestly.
- Tier-3 suites stay behind the existing `cluster-e2e` feature so the default test run
stays fast.