From d500661be67dde9ba097f24563ef319e6bbe160c Mon Sep 17 00:00:00 2001 From: Hiroaki KAWAI Date: Sat, 26 Sep 2026 21:28:14 +0900 Subject: [PATCH] fix: skip usage observation metadata recreation --- .../src/scanner_folder/item_actions.rs | 7 ++++- crates/scanner/src/scanner_folder/tests.rs | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/crates/scanner/src/scanner_folder/item_actions.rs b/crates/scanner/src/scanner_folder/item_actions.rs index 23301e420..cc9c725f5 100644 --- a/crates/scanner/src/scanner_folder/item_actions.rs +++ b/crates/scanner/src/scanner_folder/item_actions.rs @@ -1296,9 +1296,14 @@ pub(super) fn classify_get_size_failure(item: &ScannerItem, err: &StorageError) return GetSizeFailureAction::Skip; } + let metadata_object = item.metadata_object_path(); + if is_scanner_owned_usage_observation(&item.bucket, &metadata_object) { + return GetSizeFailureAction::Skip; + } + if is_scanner_metadata_corrupt_error(err) { return GetSizeFailureAction::HealMetadata { - object: item.metadata_object_path(), + object: metadata_object, }; } diff --git a/crates/scanner/src/scanner_folder/tests.rs b/crates/scanner/src/scanner_folder/tests.rs index a940a2eb2..d789c0117 100644 --- a/crates/scanner/src/scanner_folder/tests.rs +++ b/crates/scanner/src/scanner_folder/tests.rs @@ -583,6 +583,32 @@ fn test_classify_get_size_failure_marks_metadata_heal_object_path() { ); } +#[test] +fn test_classify_get_size_failure_skips_scanner_owned_usage_observation() { + let temp_dir = std::env::temp_dir(); + let file_type = std::fs::metadata(&temp_dir) + .expect("temp dir metadata should be readable") + .file_type(); + let item = ScannerItem { + path: temp_dir.join("internal/buckets/.usage.observed.json/xl.meta").to_string_lossy().to_string(), + bucket: crate::RUSTFS_META_BUCKET.to_string(), + prefix: crate::data_usage_define::DATA_USAGE_OBSERVED_OBJ_NAME_PATH.to_string(), + object_name: "xl.meta".to_string(), + file_type, + lifecycle: None, + object_lock: None, + replication: None, + heal_enabled: false, + heal_bitrot: false, + debug: false, + }; + let err = StorageError::other(format!("{}: corrupt metadata", crate::scanner_io::SCANNER_METADATA_CORRUPT_ERROR)); + + let action = classify_get_size_failure(&item, &err); + + assert_eq!(action, GetSizeFailureAction::Skip); +} + #[test] fn test_classify_get_size_failure_records_transient_metadata_error_without_heal() { let temp_dir = std::env::temp_dir();