diff --git a/scripts/run_scanner_heal_evidence_case.sh b/scripts/run_scanner_heal_evidence_case.sh index 65a7ca82e..561748839 100755 --- a/scripts/run_scanner_heal_evidence_case.sh +++ b/scripts/run_scanner_heal_evidence_case.sh @@ -349,7 +349,11 @@ trap cleanup_tmp EXIT BUILD_FEATURES="${RUSTFS_BUILD_FEATURES:-}" TARGET_DIR="${CARGO_TARGET_DIR:-$ROOT/target}" +if [[ "$TARGET_DIR" != /* ]]; then + TARGET_DIR="$ROOT/$TARGET_DIR" +fi DEBUG_DIR="$TARGET_DIR/debug" +SERVER_BINARY="$DEBUG_DIR/rustfs" if [[ "${RUSTFS_SCANNER_HEAL_SKIP_CLEAN:-0}" != "1" ]]; then cargo clean -p rustfs fi @@ -365,7 +369,7 @@ cargo nextest list --profile "$PROFILE" -p e2e_test -E "$TEST_FILTER" --message- TEST_BINARY="$(test_binary_from_listing "$LISTING_TMP" "$CASE_ID")" export RUSTFS_E2E_EXPECTED_FEATURES="${RUSTFS_E2E_EXPECTED_FEATURES:-default}" -"$PYTHON_BIN" "$ROOT/scripts/check_test_wiring.py" --begin-scanner-heal "$RUN_DIR" "$DEBUG_DIR/rustfs" "$TEST_BINARY" +"$PYTHON_BIN" "$ROOT/scripts/check_test_wiring.py" --begin-scanner-heal "$RUN_DIR" "$SERVER_BINARY" "$TEST_BINARY" cp "$LISTING_TMP" "$RUN_DIR/listing.json" export RUSTFS_E2E_LOG_DIR="${RUSTFS_E2E_LOG_DIR:-$RUN_DIR/e2e-logs}" export RUSTFS_HEAL_CHAOS_LOG_DIR="${RUSTFS_HEAL_CHAOS_LOG_DIR:-$RUSTFS_E2E_LOG_DIR}" diff --git a/scripts/test_diagnose_scanner_enumeration_restart.py b/scripts/test_diagnose_scanner_enumeration_restart.py index 7ca76a368..ad4886110 100644 --- a/scripts/test_diagnose_scanner_enumeration_restart.py +++ b/scripts/test_diagnose_scanner_enumeration_restart.py @@ -150,6 +150,33 @@ class ReportTests(unittest.TestCase): raw_page_index_indexed_entries=2) self.assertFalse(replays_raw_window(previous, indexed)) + def test_object_only_completion_round_is_not_a_raw_window_replay(self): + previous = self.report() + previous.update(round=0, pid=123, raw_entries=0, raw_name_bytes=0, + raw_first_entry=None, raw_last_entry=None, + raw_page_index_parent="bucket", + raw_page_index_complete=True, + raw_page_index_committed_entries=4, + raw_page_index_indexed_entries=4, + objects_before=2, objects_processed=2, + objects_retained=4, versions_retained=4, + bytes_retained=4, snapshot_complete=False, + outcome="partial") + current = self.report() + current.update(round=1, pid=124, raw_entries=0, raw_name_bytes=0, + raw_first_entry=None, raw_last_entry=None, + raw_page_index_parent=None, + raw_page_index_complete=False, + raw_page_index_committed_entries=0, + raw_page_index_indexed_entries=0, + objects_before=4, objects_processed=1, + objects_retained=4, versions_retained=4, + bytes_retained=4, snapshot_complete=True, + outcome="complete") + + self.assertFalse(replays_raw_window(previous, current)) + validate_recoverable_quantum([previous, current], objects=4, budget=16, require_converged=True) + def test_recoverable_quantum_rejects_replayed_raw_window(self): previous = self.report() previous.update(objects_retained=0, versions_retained=0, bytes_retained=0,