fix: exclude matching key from ListObjects results when using marker/startAfter (#1506)

This commit is contained in:
houseme
2026-01-14 19:21:51 +08:00
committed by GitHub
parent 109ca7a100
commit 2d58eea702
2 changed files with 14 additions and 17 deletions

View File

@@ -1825,16 +1825,16 @@ impl StorageAPI for ECStore {
if self.is_suspended(pool.pool_idx).await { if self.is_suspended(pool.pool_idx).await {
continue; continue;
} }
match pool return match pool
.list_object_parts(bucket, object, upload_id, part_number_marker, max_parts, opts) .list_object_parts(bucket, object, upload_id, part_number_marker, max_parts, opts)
.await .await
{ {
Ok(res) => return Ok(res), Ok(res) => Ok(res),
Err(err) => { Err(err) => {
if is_err_invalid_upload_id(&err) { if is_err_invalid_upload_id(&err) {
continue; 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<()> { async fn delete_object_version(&self, bucket: &str, object: &str, fi: &FileInfo, force_del_marker: bool) -> Result<()> {
check_del_obj_args(bucket, object)?; 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() { if self.single_pool() {
return self.pools[0] 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 // No pool returned a nil error, return the first non 'not found' error
for (index, err) in errs.iter().enumerate() { for (index, err) in errs.iter().enumerate() {
match err { return match err {
Some(err) => { Some(err) => {
if is_err_object_not_found(err) || is_err_version_not_found(err) { if is_err_object_not_found(err) || is_err_version_not_found(err) {
continue; continue;
} }
return Ok((ress.remove(index), Some(err.clone()))); Ok((ress.remove(index), Some(err.clone())))
} }
None => { None => Ok((ress.remove(index), None)),
return Ok((ress.remove(index), None)); };
}
}
} }
// At this stage, all errors are 'not found' // At this stage, all errors are 'not found'

View File

@@ -410,13 +410,13 @@ impl ECStore {
..Default::default() ..Default::default()
}; };
let mut list_result = match self.list_path(&opts).await { let mut list_result = self
Ok(res) => res, .list_path(&opts)
Err(err) => MetaCacheEntriesSortedResult { .await
.unwrap_or_else(|err| MetaCacheEntriesSortedResult {
err: Some(err.into()), err: Some(err.into()),
..Default::default() ..Default::default()
}, });
};
if let Some(err) = list_result.err.clone() if let Some(err) = list_result.err.clone()
&& err != rustfs_filemeta::Error::Unexpected && err != rustfs_filemeta::Error::Unexpected
@@ -988,7 +988,7 @@ async fn gather_results(
} }
if let Some(marker) = &opts.marker if let Some(marker) = &opts.marker
&& &entry.name < marker && &entry.name <= marker
{ {
continue; continue;
} }
@@ -1476,7 +1476,6 @@ mod test {
// use crate::error::Error; // use crate::error::Error;
// use crate::metacache::writer::MetacacheReader; // use crate::metacache::writer::MetacacheReader;
// use crate::set_disk::SetDisks; // use crate::set_disk::SetDisks;
// use crate::store::ECStore;
// use crate::store_list_objects::ListPathOptions; // use crate::store_list_objects::ListPathOptions;
// use crate::store_list_objects::WalkOptions; // use crate::store_list_objects::WalkOptions;
// use crate::store_list_objects::WalkVersionsSortOrder; // use crate::store_list_objects::WalkVersionsSortOrder;