Skip to content

Flaky simtest: test_repeated_node_crash blob-existence check fails deterministically per binary layout (0.75 != 1.0) #3609

Description

@halfprice

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions