From 01b2623f6695351ff38dab439202df122b9c017b Mon Sep 17 00:00:00 2001 From: weisd Date: Wed, 3 Sep 2025 17:52:31 +0800 Subject: [PATCH] Fix/response (#485) * fix:list_parts response * fix:list_objects skip delete_marker --- crates/ecstore/src/store_list_objects.rs | 2 +- crates/filemeta/src/filemeta.rs | 34 ++++++++++++++++++++++++ crates/filemeta/src/metacache.rs | 4 +-- rustfs/src/storage/ecfs.rs | 5 ++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/crates/ecstore/src/store_list_objects.rs b/crates/ecstore/src/store_list_objects.rs index b028818f7..9922ea3fc 100644 --- a/crates/ecstore/src/store_list_objects.rs +++ b/crates/ecstore/src/store_list_objects.rs @@ -1003,7 +1003,7 @@ async fn gather_results( } } - if !opts.incl_deleted && entry.is_object() && entry.is_latest_delete_marker() && entry.is_object_dir() { + if !opts.incl_deleted && entry.is_object() && entry.is_latest_delete_marker() && !entry.is_object_dir() { continue; } diff --git a/crates/filemeta/src/filemeta.rs b/crates/filemeta/src/filemeta.rs index e0a2f9244..461e007e6 100644 --- a/crates/filemeta/src/filemeta.rs +++ b/crates/filemeta/src/filemeta.rs @@ -112,6 +112,39 @@ impl FileMeta { Ok((&buf[8..], major, minor)) } + // Returns (meta, inline_data) + pub fn is_indexed_meta(buf: &[u8]) -> Result<(&[u8], &[u8])> { + let (buf, major, minor) = Self::check_xl2_v1(buf)?; + if major != 1 || minor < 3 { + return Ok((&[], &[])); + } + + let (mut size_buf, buf) = buf.split_at(5); + + // Get meta data, buf = crc + data + let bin_len = rmp::decode::read_bin_len(&mut size_buf)?; + + if buf.len() < bin_len as usize { + return Ok((&[], &[])); + } + let (meta, buf) = buf.split_at(bin_len as usize); + + if buf.len() < 5 { + return Err(Error::other("insufficient data for CRC")); + } + let (mut crc_buf, inline_data) = buf.split_at(5); + + // crc check + let crc = rmp::decode::read_u32(&mut crc_buf)?; + let meta_crc = xxh64::xxh64(meta, XXHASH_SEED) as u32; + + if crc != meta_crc { + return Err(Error::other("xl file crc check failed")); + } + + Ok((meta, inline_data)) + } + // Fixed u32 pub fn read_bytes_header(buf: &[u8]) -> Result<(u32, &[u8])> { let (mut size_buf, _) = buf.split_at(5); @@ -289,6 +322,7 @@ impl FileMeta { let offset = wr.len(); + // xl header rmp::encode::write_uint8(&mut wr, XL_HEADER_VERSION)?; rmp::encode::write_uint8(&mut wr, XL_META_VERSION)?; diff --git a/crates/filemeta/src/metacache.rs b/crates/filemeta/src/metacache.rs index 73a45c9c2..c4f83e471 100644 --- a/crates/filemeta/src/metacache.rs +++ b/crates/filemeta/src/metacache.rs @@ -112,8 +112,8 @@ impl MetaCacheEntry { return false; } - match FileMeta::check_xl2_v1(&self.metadata) { - Ok((meta, _, _)) => { + match FileMeta::is_indexed_meta(&self.metadata) { + Ok((meta, _inline_data)) => { if !meta.is_empty() { return FileMeta::is_latest_delete_marker(meta); } diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 599d454f9..c810d550d 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -1895,6 +1895,11 @@ impl S3 for FS { }) .collect(), ), + owner: Some(RUSTFS_OWNER.to_owned()), + initiator: Some(Initiator { + id: RUSTFS_OWNER.id.clone(), + display_name: RUSTFS_OWNER.display_name.clone(), + }), ..Default::default() }; Ok(S3Response::new(output))