# nextest configuration for RustFS. # # Serialize two known load-sensitive / global-state-sharing ecstore test groups # so the full parallel nextest suite stops producing spurious failures # (backlog #937). These tests pass in isolation but flake under the loaded # parallel run for two distinct reasons: # # * store::bucket::tests::bucket_delete_* share process/global state (disk # registry, lock client) and race make_bucket into InsufficientWriteQuorum # when run concurrently with other ecstore tests. # * bucket_lifecycle_ops::tests::concurrent_resend_same_part_commits_one_generation # asserts a lock-acquire correctness property whose serialized cross-disk # commits exceed the (already max'd, 60s) acquire deadline only when the # suite saturates disk I/O. # # serial_test's #[serial] attribute does NOT serialize these across runs: # nextest executes each test in its own process, where the in-process # serial_test mutex has no effect. A nextest test-group with max-threads = 1 is # the mechanism that actually serializes across nextest's process boundary. # # --------------------------------------------------------------------------- # Profiles # --------------------------------------------------------------------------- # The `default` profile is what local `cargo nextest run` uses. It NEVER # retries: a red test locally means a real failure to investigate, not noise to # paper over. The `ci` profile (below) is the strict CI gate: global # retries = 0 so a new race's first occurrence is never masked, plus a # narrowly-scoped quarantine list (retries = 2) for tests with a tracked OPEN # flake issue. Flake policy lives in docs/testing/README.md. [test-groups] ecstore-serial-flaky = { max-threads = 1 } # --- default profile (local): serialize the flaky groups, never retry -------- [[profile.default.overrides]] filter = 'package(rustfs-ecstore) & (test(concurrent_resend_same_part_commits_one_generation) | test(/^store::bucket::tests::bucket_delete_(mark_delete_marks|purge_removes|default_s3_delete)/))' test-group = 'ecstore-serial-flaky' # --------------------------------------------------------------------------- # ci profile — the strict CI gate (ci.yml `cargo nextest run --profile ci`) # --------------------------------------------------------------------------- [profile.ci] # Strict: a new race must fail on its first occurrence, never be retried away. retries = 0 # Report every failure in one run instead of bailing on the first. fail-fast = false [profile.ci.junit] # Emitted to target/nextest/ci/junit.xml; uploaded as a CI artifact. # Tests that pass only after a quarantine retry are marked `flaky` here — that # marker is the observable signal the flake policy is built around. path = "junit.xml" # =========================================================================== # QUARANTINE — flaky tests granted retries = 2 under the ci profile ONLY. # # RULES (enforced by review, see docs/testing/README.md): # * Every entry MUST link exactly one OPEN issue tracking the flake. # * An entry stays until the issue is fixed (test made robust) or the test is # deleted — 30-day policy. No entry may exist without a live issue link. # # Each entry also re-declares the `ecstore-serial-flaky` test-group so the # serialization holds under the ci profile (nextest evaluates a named # profile's own overrides list, not the default profile's). # =========================================================================== # QUARANTINE: OPEN backlog#937 — concurrent_resend lock-acquire deadline flakes # under saturated disk I/O in the full parallel suite. [[profile.ci.overrides]] filter = 'package(rustfs-ecstore) & test(concurrent_resend_same_part_commits_one_generation)' test-group = 'ecstore-serial-flaky' retries = 2 # QUARANTINE: OPEN backlog#937 — store::bucket::tests::bucket_delete_* race # make_bucket into InsufficientWriteQuorum via shared global state under load. [[profile.ci.overrides]] filter = 'package(rustfs-ecstore) & test(/^store::bucket::tests::bucket_delete_(mark_delete_marks|purge_removes|default_s3_delete)/)' test-group = 'ecstore-serial-flaky' retries = 2 # QUARANTINE: OPEN rustfs#4690 — walk_dir stall-budget accounting test depends # on producer/consumer timing windows that stretch past the budget on loaded # CI runners (regression test for rustfs#4644; failed on a zero-Rust-diff PR). [[profile.ci.overrides]] filter = 'package(rustfs-ecstore) & test(walk_dir_does_not_charge_consumer_backpressure_to_the_stall_budget)' retries = 2 # --------------------------------------------------------------------------- # e2e-smoke profile — PR smoke subset of the e2e_test crate (backlog#1149 ci-4) # --------------------------------------------------------------------------- # PR smoke subset of the e2e_test crate (backlog#1149 ci-4). This profile is # the single wiring mechanism for e2e tests in CI: other suites join by # extending this filter (or a sibling profile), never by adding ad-hoc e2e # jobs to ci.yml. Admission criteria (see crates/e2e_test/README.md): fast, # single-node topology, no external dependencies (no awscurl / Vault / fixed # ports / pre-started server), no #[ignore]. # # Each e2e test spawns its own rustfs server on a random port with an isolated # temp dir (crates/e2e_test/src/common.rs), so the subset is parallel-safe. [profile.e2e-smoke] default-filter = 'package(e2e_test) & test(/^(delete_marker_migration_semantics|version_id_regression|list_objects_v2_pagination|list_object_versions_regression|list_objects_duplicates|list_buckets_double_slash|leading_slash_key|special_chars|create_bucket_region|delete_objects_versioning|head_object_consistency|head_object_range|copy_object_metadata|copy_source_invalid_date|content_encoding|anonymous_access|bucket_policy_check)_test::/)' fail-fast = false