Hardware scenarios (all PASS on m01/m02, 25Gbps RoCE): - I-V3 auto-failover: 43/43 (create→write→kill→promote→verify IO) - I-R8 rebuild-rejoin: 58/58 (failover→write→restart→1GB rebuild in 2s→verify data) - Fast rejoin: 43/43 (kill replica→3s→restart→recovery→data verified) Performance: V2 RF=1 = 46,666 IOPS vs V1.5 RF=1 = 47,233 IOPS (-1.2%, noise) New test scenarios: - v2-rebuild-rejoin.yaml: full failover→rebuild→second failover→data integrity - v2-fast-rejoin-catchup.yaml: replica kill→fast restart→recovery - v2-rebuild-failure-retry.yaml: kill during rebuild→restart→data verified - rf1-perf-compare.yaml: RF=1 perf baseline for V1.5 vs V2 comparison Design documents: - protocol-anti-patterns.md: 7 anti-patterns with cases from SeaweedFS/Ceph/DRBD - smartwal-design-memo.md: extent-first write algorithm research (BlueStore/ZFS/DRBD) - smartwal-prototype-spec.md: prototype spec with 16/16 crash tests PASS - v3-clean-recovery-draft.md: V3 semantic cleanup principles - v2-integration-matrix.md: 25-row integration coverage map - v2-acceptance-evidence.md: gap analysis for remaining work SmartWAL prototype (16/16 tests PASS): - smartwal.go, smartwal_record.go, smartwal_recovery.go: core implementation - smartwal_test.go: 9 single-node crash tests - smartwal_repl_test.go: 7 two-node replication crash tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7.6 KiB
V2 Acceptance Evidence Map
Date: 2026-04-09 Status: active
Purpose
This note maps the current V2 evidence across three layers:
- protocol/simulation proof
weed/component and server proof- real-hardware operational proof
It is intentionally not another scenario backlog. Its goal is to answer:
- what is already proven
- where the proof lives
- what is still missing enough that it should drive next work
1. Protocol And Simulation Coverage
Primary design references:
sw-block/design/v2-acceptance-criteria.mdsw-block/design/v2_scenarios.md
Current state:
A1throughA12are defined at the protocol/design layer inv2-acceptance-criteria.md.v2_scenarios.mdcurrently marksS1throughS20as covered indistsimand related model/protocol tests.- This means the broad semantic matrix is already mostly closed at the simulation layer.
What this proves:
- committed-prefix and lineage rules are modeled
- stale epoch and stale traffic rejection are modeled
- failover, restart, partition, and mixed-state rules are modeled
- restart-during-catchup and restart-during-rebuild are modeled
What this does not prove by itself:
- real
weed/runtime integration - real
BlockVoldata installation and WAL replay behavior - control-plane convergence latency on real heartbeat paths
- operational comparisons between
V1,V1.5, andV2
2. weed Runtime And Component Coverage
These tests provide engine-to-runtime and storage/backend proof beyond the pure protocol layer.
Component-Level Proof
Relevant paths:
weed/storage/blockvol/test/component/rebuild_failover_rejoin_test.goweed/storage/blockvol/test/component/rebuild_matrix_gaps_test.goweed/storage/blockvol/test/component/fast_rejoin_catchup_test.goweed/storage/blockvol/test/component/rebuild_e2e_test.goweed/storage/blockvol/test/component/rebuild_realistic_test.go
Current high-value coverage:
- failover -> old primary rejoins -> rebuild -> data converges
- stale replica restart beyond retained WAL -> rebuild
- connection drop mid-base -> partial rebuild fails closed -> fresh rebuild converges
- quick rejoin with retained WAL -> catch-up chosen instead of rebuild
- rebuild transport and realistic volume rebuild cases
New explicit complement added in this pass:
TestFastRejoinCatchUp_FailoverRejoinUsesRetainedWAL- proves the old primary can return after failover and still use bounded catch-up when retained WAL covers the gap
- proves the real shipper catch-up path converges without starting rebuild
Server-Level Recovery Proof
Relevant path:
weed/server/block_recovery_test.go
Current high-value coverage:
- live-path catch-up planning and execution
- fact-driven escalation from catch-up to rebuild
- probe-driven rebuild session installation
- command-driven rebuild start on the live path
- fail-closed behavior when no fresh
start_rebuildcommand exists
New explicit retry-stability proof added in this pass:
TestP16B_RunRebuild_ExecutionFailureAllowsFreshRetry- proves a rebuild execution failure does not wedge the sender/runtime
- proves a fresh rebuild session can be installed afterward
- proves the second rebuild can still reach
InSync
3. Integration And Scenario Evidence
Relevant paths:
weed/storage/blockvol/testrunner/scenarios/internal/v2-fast-rejoin-catchup.yamlweed/storage/blockvol/testrunner/scenarios/internal/v2-rebuild-failure-retry.yamlweed/storage/blockvol/testrunner/scenarios/internal/v2-rebuild-rejoin.yaml
Current status:
v2-rebuild-rejoin.yamlis the full real-system rebuild-rejoin story.v2-fast-rejoin-catchup.yamlnow asserts that rejoin converges via catch-up and that no remote rebuild start was sent.v2-rebuild-failure-retry.yamlnow asserts that the retry path includes more than one rebuild attempt, instead of only checking the final data state.
Why these matter:
- they bridge the gap between narrow unit/component tests and real multi-process orchestration
- they expose heartbeat, assignment, probe, and retry timing effects that protocol tests do not see
4. Real-Hardware Evidence
Current proved run:
v2-rebuild-rejoin
Observed result:
- full lifecycle passed end-to-end on real hardware
- create -> write -> failover -> write more -> old primary rejoin -> rebuild -> verify
- rebuilt replica preserved both the pre-failover and post-failover checkpoints
Important interpretation:
- the data-plane rebuild itself was fast
- the larger wall-clock recovery time was dominated by control-plane cadence: heartbeat propagation, assignment refresh, probe timing, and master-visible healthy convergence
So the current real-hardware result proves:
- the primary-direct remote rebuild route works
- the replica-side install path works
- data continuity survives the full failover/rejoin cycle
It does not yet fully characterize:
- control-plane latency breakdown as an explicit acceptance artifact
- fast-rejoin catch-up on real hardware as distinct from rebuild-rejoin
- RF=3 multi-replica operational behavior on hardware
5. Remaining Meaningful Gaps
These are the remaining gaps worth prioritizing. They are not generic matrix expansion.
Gap 1: Operational Catch-Up After Failover
Needed:
- explicit real integration evidence for old-primary quick return after failover where retained WAL is still sufficient
Why it matters:
- it is the natural complement to rebuild-rejoin
- it proves the system does not over-escalate to rebuild when bounded replay is enough
Current state:
- component proof exists
- scenario proof now exists at the testrunner level
- hardware-grade acceptance evidence for this exact path is still worth collecting
Gap 2: Control-Plane Convergence Visibility
Needed:
- explicit breakdown for restart -> first heartbeat
- assignment refresh -> probe start
- probe start -> session accepted
- session completed -> master healthy observed
Why it matters:
- current operational latency is dominated by control-plane cadence, not data transfer
- optimization work should target measured convergence phases, not the rebuild data plane blindly
Gap 3: V1 / V1.5 / V2 Operational Comparisons
Still called out by v2_scenarios.md:
- changed-address restart
- same-address transient outage
- slow reassignment recovery
Why it matters:
- these are operational regressions/improvements, not just protocol semantics
- they explain why V2 is better, not only that V2 is internally consistent
Gap 4: RF=3 Operational Recovery Evidence
Needed:
- targeted proof that the same recovery rules hold when more than one replica exists
- especially for one stale replica, one healthy replica, and one active primary during rejoin/rebuild
Why it matters:
- many current proofs are strongest in RF=2
- the design explicitly supports RF=3 and per-replica recovery facts
6. Recommended Next Evidence Work
Order:
- collect one hardware-grade fast-rejoin catch-up run
- add explicit control-plane latency timestamps to recovery scenarios
- add the highest-value
V1/V1.5/V2operational comparison cases - add one RF=3 recovery acceptance slice before broadening anything else
7. Bottom Line
Current position:
- protocol matrix: broadly covered
weedruntime/component proof: strong and improving- real-hardware rebuild-rejoin proof: achieved
So the next work should focus on:
- the fast-rejoin catch-up operational path
- control-plane convergence evidence
- a small set of operational comparison cases
The project does not currently need a broad new matrix. It needs sharper proof on the remaining operational edges.