From cb52adcbf798d3d2f009874f46dc5d476073bd8c Mon Sep 17 00:00:00 2001 From: discord9 Date: Fri, 21 Aug 2026 17:58:22 +0800 Subject: [PATCH] fix(object-store): make removed-entry lister test portable (#8752) (cherry picked from commit 4e43c279ff29e9071394f85b90b874906115d29f) Signed-off-by: discord9 --- src/object-store/src/secure_fs.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/object-store/src/secure_fs.rs b/src/object-store/src/secure_fs.rs index cb58f6b2ad7..d793dee6e3b 100644 --- a/src/object-store/src/secure_fs.rs +++ b/src/object-store/src/secure_fs.rs @@ -622,6 +622,14 @@ mod tests { assert!(operator.list("file/").await.unwrap().is_empty()); } + // On Windows, `std::fs::DirEntry` is a snapshot taken by + // `FindFirstFileW`: `file_type()` and `metadata()` keep returning the + // cached data even after the file is removed, so `read_list_entry` + // may return `Some` with the stale entry. On platforms where metadata + // is fetched from the live filesystem (e.g. Unix `lstat` returns + // `ENOENT` after removal), `read_list_entry` returns `None` instead. + // The strong assertion is Unix-specific; the portable part still + // verifies the call succeeds and yields the expected path. #[test] fn test_lister_skips_entry_removed_during_iteration() { let temp_dir = create_temp_dir("secure_fs_lister_removed_entry"); @@ -632,7 +640,14 @@ mod tests { let entry = read_dir.next().unwrap().unwrap(); std::fs::remove_file(path).unwrap(); - assert!(read_list_entry(entry, "").unwrap().is_none()); + let result = read_list_entry(entry, "").unwrap(); + + if let Some(entry) = &result { + assert_eq!("removed", entry.path()); + } + + #[cfg(not(windows))] + assert!(result.is_none()); } #[tokio::test]