Symptom
simtest_test_repeated_node_crash fails on CI with:
panicked at crates/walrus-simtest/src/test_utils.rs:555:
assertion left == right failed: left: 0.75, right: 1.0
(BlobInfoConsistencyCheck::check_blob_existence)
Seed 3, WALRUS_GRPC_MIGRATION_LEVEL=0. An Active node was recorded missing 25% of its certified blobs with no in-flight blob sync at some epoch.
Evidence that this is a pre-existing, layout-sensitive race (not a logic regression)
Observed on PR #3605, but bisection shows the failing and passing builds are behaviorally identical:
- PR head and its parent both fail identically (same seed, same test, same 0.75) — 4 CI runs total, including 3 reruns of the same job on different runners.
- The parent differs from an earlier same-day CI-green head only by identifier renames and comment rewrapping (audited token-by-token: no behavior change). Current
main also passes the same job.
- Locally (macOS) the failing commit passes 10/10: seeds 1-8 of the test plus the full
MSIM_TEST_SEED=3 WALRUS_GRPC_MIGRATION_LEVEL=0 cargo simtest simtest --profile simtest suite.
So the outcome is deterministic per (binary, platform) but flips when only symbol names/string literals change — a schedule lottery through binary layout, presumably via a pointer/layout-order-dependent iteration feeding the simulated schedule, interacting with msim's one non-hermetic channel (real RocksDB threads vs virtual time). This also matches the earlier flake-hunting attempt (ci: TEMP stress repeated_node_crash across 500 seeds, June 2026, branch shuo/adopt_new_package_management_test_with_fix).
Hypothesis for the underlying race
The existence check runs only when the node is Active and skips blobs in blob_sync_in_progress. A blob sync that fails and leaves retry scheduling (or is cancelled without marking) leaves its blob missing but absent from the in-progress set while the node is Active — exactly the observed signature. Worth auditing the blob-sync failure/retry path against the consistency check's snapshot ordering.
Repro pointers
Symptom
simtest_test_repeated_node_crashfails on CI with:Seed 3,
WALRUS_GRPC_MIGRATION_LEVEL=0. AnActivenode was recorded missing 25% of its certified blobs with no in-flight blob sync at some epoch.Evidence that this is a pre-existing, layout-sensitive race (not a logic regression)
Observed on PR #3605, but bisection shows the failing and passing builds are behaviorally identical:
mainalso passes the same job.MSIM_TEST_SEED=3 WALRUS_GRPC_MIGRATION_LEVEL=0 cargo simtest simtest --profile simtestsuite.So the outcome is deterministic per (binary, platform) but flips when only symbol names/string literals change — a schedule lottery through binary layout, presumably via a pointer/layout-order-dependent iteration feeding the simulated schedule, interacting with msim's one non-hermetic channel (real RocksDB threads vs virtual time). This also matches the earlier flake-hunting attempt (
ci: TEMP stress repeated_node_crash across 500 seeds, June 2026, branchshuo/adopt_new_package_management_test_with_fix).Hypothesis for the underlying race
The existence check runs only when the node is
Activeand skips blobs inblob_sync_in_progress. A blob sync that fails and leaves retry scheduling (or is cancelled without marking) leaves its blob missing but absent from the in-progress set while the node isActive— exactly the observed signature. Worth auditing the blob-sync failure/retry path against the consistency check's snapshot ordering.Repro pointers