tidaldb/docs/ops/stress-test-p4-regression.md
jx12n 95461d3cf8 feat(m11): Raft leader election over WAL stream (m11p4)
Kind-3 term markers in the WAL stream, STREAM-relative vote frontiers,
heartbeat-only divergence detection + quarantine, and fenced promote.
Elections converge in 0.6–1.0s; zero acked-write loss across all kill points.
Closes G5 (leaderless recovery) from the v0.9 wave.
2026-06-11 23:30:24 -06:00

65 lines
2.4 KiB
Markdown
Raw 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.

# Stress test regression — p4 (m11p4) (2026-06-11)
Live 3-StatefulSet k3s cluster, m11p4 image (`sha256:86dd59c4...`). Fresh
deployment over existing PVCs (no reset needed — m11p4 WAL reader accepts m11p3
segments as implicit v0). All 3 pods Running, lag=0 at test start.
---
## Catch-up self-healing validation
Validates the m11p4 fix: failed/missed catch-up pulls now retry on a 30s timer
rather than waiting for the next push event.
**Procedure:**
1. Confirmed baseline lag=0 on all 3 nodes.
2. Killed tidaldb-eu-west-0; wrote 500 events to leader (ack=leader) while pod
was down. Pod restarted via StatefulSet (fast restart).
3. Stopped all writes with eu-west at lag=2,035,769.
4. Polled `/cluster/status` every 10s — zero writes issued.
**Result:**
| t+ | eu-west lag |
|---|---|
| 0s (write-stop) | 2,035,769 |
| 10s | **0** |
eu-west caught up to lag=0 within 10s of pod start with no new writes to the
cluster. Prior to m11p4, this scenario left the follower stuck indefinitely
(the 2026-06-11 p3 rollout incident: both followers stuck at lag=136507 until
the cluster received new writes).
**Verdict: timer-triggered catch-up CONFIRMED.**
---
## Throughput regression (p3 gate re-check)
`tidal-stress` open-loop, `--ack quorum`, `--mix writes`, `peach-100k` ramp,
60s/stage, 20k corpus, 100k users, `--stop-on-knee`.
| Stage | Target rps | Signal ok/s | Error rate | p99 write | Max lag | Pass |
|---|---|---|---|---|---|---|
| 1 | 50 | 50 | 0.00% | 35 ms | 0 | ✓ |
| 2 | 150 | 150 | 0.00% | 35 ms | 0 | ✓ |
| 3 | 400 | 400 | 0.00% | 37 ms | 0 | ✓ |
| 4 | 800 | 800 | 0.00% | 43 ms | 8 | ✓ |
| 5 | 1,500 | 1,499 | 0.04% | 41 ms | 0 | ✓ |
| **6** | **3,000** | **2,975** | **0.82%** | **49 ms** | **27** | **✓ highest** |
| 7 ⚠ | 5,000 | 4,411 | 11.76% | 164 ms | 24 | ✗ knee |
No 503 quorum timeouts at any stage.
### Regression verdict
| Metric | T2-A (m11p3) | Regression (m11p4) | Delta | Result |
|---|---|---|---|---|
| Quorum signal-writes/s | 2,980/s | **2,975/s** | 0.2% | **✓ no regression** |
| Write p99 at stage 6 | 49 ms | **49 ms** | 0 | **✓ no regression** |
| Error rate at stage 6 | 0.67% | **0.82%** | +0.15% | **✓ within gate (<1%)** |
| Capacity knee | stage 7 (5k) | **stage 7 (5k)** | none | ** no regression** |
| Lag at stage 6 | 23 events | **27 events** | +4 | ** within gate (≤2s)** |
**p3 gate (≥1,000/s quorum, p99 ≤50ms, error <1%) holds through m11p4.**