From 2d58eea7025d17d49ff032505bf3592c44020f99 Mon Sep 17 00:00:00 2001 From: houseme Date: Wed, 14 Jan 2026 19:21:51 +0800 Subject: [PATCH] fix: exclude matching key from ListObjects results when using marker/startAfter (#1506) --- crates/ecstore/src/store.rs | 18 ++++++++---------- crates/ecstore/src/store_list_objects.rs | 13 ++++++------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/crates/ecstore/src/store.rs b/crates/ecstore/src/store.rs index 4fcc45b7..7f5e7369 100644 --- a/crates/ecstore/src/store.rs +++ b/crates/ecstore/src/store.rs @@ -1825,16 +1825,16 @@ impl StorageAPI for ECStore { if self.is_suspended(pool.pool_idx).await { continue; } - match pool + return match pool .list_object_parts(bucket, object, upload_id, part_number_marker, max_parts, opts) .await { - Ok(res) => return Ok(res), + Ok(res) => Ok(res), Err(err) => { if is_err_invalid_upload_id(&err) { continue; } - return Err(err); + Err(err) } }; } @@ -2204,7 +2204,7 @@ impl StorageAPI for ECStore { async fn delete_object_version(&self, bucket: &str, object: &str, fi: &FileInfo, force_del_marker: bool) -> Result<()> { check_del_obj_args(bucket, object)?; - let object = rustfs_utils::path::encode_dir_object(object); + let object = encode_dir_object(object); if self.single_pool() { return self.pools[0] @@ -2324,17 +2324,15 @@ impl StorageAPI for ECStore { // No pool returned a nil error, return the first non 'not found' error for (index, err) in errs.iter().enumerate() { - match err { + return match err { Some(err) => { if is_err_object_not_found(err) || is_err_version_not_found(err) { continue; } - return Ok((ress.remove(index), Some(err.clone()))); + Ok((ress.remove(index), Some(err.clone()))) } - None => { - return Ok((ress.remove(index), None)); - } - } + None => Ok((ress.remove(index), None)), + }; } // At this stage, all errors are 'not found' diff --git a/crates/ecstore/src/store_list_objects.rs b/crates/ecstore/src/store_list_objects.rs index ff10fc41..aae98d48 100644 --- a/crates/ecstore/src/store_list_objects.rs +++ b/crates/ecstore/src/store_list_objects.rs @@ -410,13 +410,13 @@ impl ECStore { ..Default::default() }; - let mut list_result = match self.list_path(&opts).await { - Ok(res) => res, - Err(err) => MetaCacheEntriesSortedResult { + let mut list_result = self + .list_path(&opts) + .await + .unwrap_or_else(|err| MetaCacheEntriesSortedResult { err: Some(err.into()), ..Default::default() - }, - }; + }); if let Some(err) = list_result.err.clone() && err != rustfs_filemeta::Error::Unexpected @@ -988,7 +988,7 @@ async fn gather_results( } if let Some(marker) = &opts.marker - && &entry.name < marker + && &entry.name <= marker { continue; } @@ -1476,7 +1476,6 @@ mod test { // use crate::error::Error; // use crate::metacache::writer::MetacacheReader; // use crate::set_disk::SetDisks; - // use crate::store::ECStore; // use crate::store_list_objects::ListPathOptions; // use crate::store_list_objects::WalkOptions; // use crate::store_list_objects::WalkVersionsSortOrder;