mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-29 01:29:00 +00:00
e0619e355f
is_all_not_found and is_all_volume_not_found delegated to is_err_bucket_not_found, which matches StorageError::DiskNotFound. When every erasure set in every pool was unreachable, the per-set aggregate DiskNotFound slice was classified as "all not found", so list_merged returned Ok(empty) and walk_result_from_set_errors was fed an availability failure disguised as an empty listing. Clients saw a successful empty ListObjects and mistook a full outage for an empty bucket. Introduce is_err_strict_not_found (FileNotFound / VolumeNotFound / FileVersionNotFound / ObjectNotFound / VersionNotFound, excluding DiskNotFound) for is_all_not_found, mirroring MinIO's isAllNotFound and DiskError::is_all_not_found. Give is_all_volume_not_found its own is_err_strict_volume_not_found (VolumeNotFound / BucketNotFound, minus DiskNotFound) so genuine volume/bucket absence still surfaces while a missing object under an existing volume is not escalated. Add is_all_disk_not_found and a pre-check in walk_result_from_set_errors so an all-offline slice surfaces DiskNotFound instead of being swallowed as an empty listing, while partial outages (a healthy set present) stay tolerated as before. Regression tests cover all-DiskNotFound rejection, genuine not-found acceptance, volume-not-found semantics, partial/empty short-circuit, and the walk full-offline vs partial-offline paths. Co-authored-by: heihutu <heihutu@gmail.com>