test(filemeta): cover legacy delete marker decoding (#2333)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: houseme <housemecn@gmail.com>
Co-authored-by: heihutu <heihutu@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
安正超
2026-03-31 22:08:45 +08:00
committed by GitHub
parent 8893de1cad
commit bd36cf3588
5 changed files with 102 additions and 20 deletions
+44
View File
@@ -2966,6 +2966,38 @@ mod tests {
assert!(fi.uses_legacy_checksum);
}
#[test]
fn legacy_meta_v2_delete_marker_decodes_into_delete_fileinfo_via_struct() {
let version_id = sample_version_id();
let mod_time = sample_mod_time();
let version = LegacyMetaV2Version {
version_type: LegacyMetaV2VersionType::DeleteMarker,
object: None,
delete_marker: Some(LegacyMetaV2DeleteMarker {
version_id: version_id.as_bytes().to_vec(),
mod_time: Some(mod_time),
meta_sys: HashMap::from([("x-minio-internal".to_string(), b"present".to_vec())]),
}),
write_version: 7,
};
let decoded = FileMetaVersion::try_from(version).unwrap();
assert_eq!(decoded.version_type, VersionType::Delete);
assert!(decoded.uses_legacy_checksum);
assert!(decoded.object.is_none());
let delete_marker = decoded.delete_marker.as_ref().expect("delete marker should be decoded");
assert_eq!(delete_marker.version_id, Some(version_id));
assert_eq!(delete_marker.mod_time, Some(mod_time));
let fi = decoded.into_fileinfo("bucket", "deleted.txt", true);
assert!(fi.deleted);
assert_eq!(fi.version_id, Some(version_id));
assert_eq!(fi.mod_time, Some(mod_time));
assert_eq!(fi.metadata.get("x-minio-internal").map(String::as_str), Some("present"));
}
#[test]
fn legacy_meta_v2_delete_marker_rejects_invalid_uuid_bytes() {
let payload = LegacyDeleteVersionFixture {
@@ -2983,4 +3015,16 @@ mod tests {
let err = FileMetaVersion::try_from(encoded.as_slice()).expect_err("invalid legacy delete marker UUID must fail");
assert!(err.to_string().contains("legacy version_id must be 16 bytes"));
}
#[test]
fn legacy_meta_v2_delete_marker_rejects_invalid_uuid_bytes_via_struct() {
let err = MetaDeleteMarker::try_from(LegacyMetaV2DeleteMarker {
version_id: vec![1, 2, 3],
mod_time: Some(sample_mod_time()),
meta_sys: HashMap::new(),
})
.expect_err("invalid legacy delete-marker version ids should be rejected");
assert!(err.to_string().contains("legacy version_id must be 16 bytes"));
}
}
+17 -9
View File
@@ -37,18 +37,22 @@ pub fn record_capacity_current_bytes(used_bytes: u64) {
/// Record capacity update completion.
#[inline(always)]
pub fn record_capacity_update_completed(source: &str, duration: Duration, used_bytes: u64, is_estimated: bool) {
counter!("rustfs.capacity.update.total", "source" => source.to_string()).increment(1);
histogram!("rustfs.capacity.update.duration.seconds", "source" => source.to_string()).record(duration.as_secs_f64());
histogram!("rustfs.capacity.update.bytes", "source" => source.to_string()).record(used_bytes as f64);
counter!("rustfs.capacity.update.estimated.total", "source" => source.to_string(), "estimated" => is_estimated.to_string())
.increment(1);
pub fn record_capacity_update_completed(source: &'static str, duration: Duration, used_bytes: u64, is_estimated: bool) {
counter!("rustfs.capacity.update.total", "source" => source).increment(1);
histogram!("rustfs.capacity.update.duration.seconds", "source" => source).record(duration.as_secs_f64());
histogram!("rustfs.capacity.update.bytes", "source" => source).record(used_bytes as f64);
counter!(
"rustfs.capacity.update.estimated.total",
"source" => source,
"estimated" => if is_estimated { "true" } else { "false" }
)
.increment(1);
}
/// Record failed capacity update.
#[inline(always)]
pub fn record_capacity_update_failed(source: &str) {
counter!("rustfs.capacity.update.failures", "source" => source.to_string()).increment(1);
pub fn record_capacity_update_failed(source: &'static str) {
counter!("rustfs.capacity.update.failures", "source" => source).increment(1);
}
/// Record capacity write activity.
@@ -88,5 +92,9 @@ pub fn record_capacity_dynamic_timeout(timeout: Duration) {
#[inline(always)]
pub fn record_capacity_scan_sampling(sampled_count: usize, estimated: bool) {
histogram!("rustfs.capacity.scan.sampled.count").record(sampled_count as f64);
counter!("rustfs.capacity.scan.estimated.total", "estimated" => estimated.to_string()).increment(1);
counter!(
"rustfs.capacity.scan.estimated.total",
"estimated" => if estimated { "true" } else { "false" }
)
.increment(1);
}
+7 -4
View File
@@ -164,7 +164,7 @@ impl EventName {
"s3:ObjectRemoved:DeleteMarkerCreated" => Ok(EventName::ObjectRemovedDeleteMarkerCreated),
"s3:ObjectRemoved:NoOP" => Ok(EventName::ObjectRemovedNoOP),
"s3:ObjectRemoved:DeleteAllVersions" => Ok(EventName::ObjectRemovedDeleteAllVersions),
"s3:LifecycleDelMarkerExpiration:Delete" => Ok(EventName::LifecycleExpirationDeleteMarkerCreated),
"s3:LifecycleDelMarkerExpiration:Delete" => Ok(EventName::LifecycleDelMarkerExpirationDelete),
"s3:LifecycleExpiration:*" => Ok(EventName::LifecycleExpirationAll),
"s3:LifecycleExpiration:Delete" => Ok(EventName::LifecycleExpirationDelete),
"s3:LifecycleExpiration:DeleteMarkerCreated" => Ok(EventName::LifecycleExpirationDeleteMarkerCreated),
@@ -178,7 +178,7 @@ impl EventName {
"s3:ObjectRestore:Post" => Ok(EventName::ObjectRestorePost),
"s3:ObjectRestore:Completed" => Ok(EventName::ObjectRestoreCompleted),
"s3:ObjectTransition:Failed" => Ok(EventName::ObjectTransitionFailed),
"s3:ObjectTransition:Complete" => Ok(EventName::LifecycleTransition),
"s3:ObjectTransition:Complete" => Ok(EventName::ObjectTransitionComplete),
"s3:ObjectTransition:*" => Ok(EventName::ObjectTransitionAll),
"s3:LifecycleTransition" => Ok(EventName::LifecycleTransition),
"s3:IntelligentTiering" => Ok(EventName::IntelligentTiering),
@@ -650,10 +650,13 @@ mod tests {
EventName::parse("s3:ObjectCreated:DeleteTagging").unwrap(),
EventName::ObjectTaggingDelete
);
assert_eq!(EventName::parse("s3:ObjectTransition:Complete").unwrap(), EventName::LifecycleTransition);
assert_eq!(
EventName::parse("s3:ObjectTransition:Complete").unwrap(),
EventName::ObjectTransitionComplete
);
assert_eq!(
EventName::parse("s3:LifecycleDelMarkerExpiration:Delete").unwrap(),
EventName::LifecycleExpirationDeleteMarkerCreated
EventName::LifecycleDelMarkerExpirationDelete
);
}