mirror of
https://github.com/rustfs/rustfs.git
synced 2026-01-16 17:20:33 +00:00
fix: exclude matching key from ListObjects results when using marker/startAfter (#1506)
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user