From eb0384c22548544b64998acd7b1724da668d7115 Mon Sep 17 00:00:00 2001 From: Zhengchao An Date: Mon, 24 Aug 2026 09:33:27 +0800 Subject: [PATCH] test(app): distinguish usage overlay from quota floor (#6479) test(app): preserve delete quota floor assertion --- rustfs/src/app/object_usecase.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/rustfs/src/app/object_usecase.rs b/rustfs/src/app/object_usecase.rs index 94da99818..af687d674 100644 --- a/rustfs/src/app/object_usecase.rs +++ b/rustfs/src/app/object_usecase.rs @@ -66,7 +66,7 @@ use super::storage_api::object_usecase::contract::namespace::NamespaceLocking; use super::storage_api::object_usecase::contract::object::{ObjectIO as _, ObjectOperations as _}; use super::storage_api::object_usecase::contract::range::HTTPRangeSpec; use super::storage_api::object_usecase::data_usage::{ - quota_object_size, record_bucket_delete_marker_memory, record_bucket_object_delete_memory, + apply_bucket_usage_memory_overlay, quota_object_size, record_bucket_delete_marker_memory, record_bucket_object_delete_memory, record_bucket_object_version_write_memory, record_bucket_object_write_memory, record_bucket_object_write_unknown_previous_memory, }; @@ -18074,9 +18074,15 @@ mod tests { #[tokio::test] #[serial_test::serial] - async fn compressed_delete_requests_restore_usage_baseline() { + async fn compressed_delete_requests_update_observed_usage_without_releasing_quota_floor() { use crate::app::storage_api::test::contract::bucket::{BucketOperations as _, DeleteBucketOptions, MakeBucketOptions}; + async fn observed_bucket_usage(bucket: &str) -> Option { + let mut usage = rustfs_data_usage::DataUsageInfo::default(); + apply_bucket_usage_memory_overlay(&mut usage).await; + usage.buckets_usage.get(bucket).map(|value| value.size) + } + let store = crate::app::gating_test_env::shared_gating_ecstore().await; if current_app_context().is_none() { crate::app::runtime_sources::install_test_app_context(Arc::clone(&store)).await; @@ -18132,10 +18138,15 @@ mod tests { .await .expect("single compressed delete should succeed"); assert_eq!( - crate::app::storage_api::test::data_usage::get_bucket_usage_memory(&bucket).await, + observed_bucket_usage(&bucket).await, Some(1_000), "single delete must subtract the logical accounting size" ); + assert_eq!( + crate::app::storage_api::test::data_usage::get_bucket_usage_memory(&bucket).await, + Some(2_000), + "quota must retain the pre-delete floor until scanner reconciliation" + ); let mut batch_req = build_request( DeleteObjectsInput::builder() @@ -18161,10 +18172,15 @@ mod tests { .await .expect("batch compressed delete should succeed"); assert_eq!( - crate::app::storage_api::test::data_usage::get_bucket_usage_memory(&bucket).await, + observed_bucket_usage(&bucket).await, Some(0), "batch delete must subtract the committed logical accounting size" ); + assert_eq!( + crate::app::storage_api::test::data_usage::get_bucket_usage_memory(&bucket).await, + Some(2_000), + "quota must retain both pending deletes until scanner reconciliation" + ); store .delete_bucket(