diff --git a/ecstore/src/pools.rs b/ecstore/src/pools.rs index e2249dcc..3e868f19 100644 --- a/ecstore/src/pools.rs +++ b/ecstore/src/pools.rs @@ -1284,7 +1284,7 @@ impl SetDisks { } } -fn get_total_usable_capacity(disks: &[madmin::Disk], info: &madmin::StorageInfo) -> usize { +pub fn get_total_usable_capacity(disks: &[madmin::Disk], info: &madmin::StorageInfo) -> usize { let mut capacity = 0; for disk in disks.iter() { if disk.pool_index < 0 || info.backend.standard_sc_data.len() <= disk.pool_index as usize { @@ -1297,7 +1297,7 @@ fn get_total_usable_capacity(disks: &[madmin::Disk], info: &madmin::StorageInfo) capacity } -fn get_total_usable_capacity_free(disks: &[madmin::Disk], info: &madmin::StorageInfo) -> usize { +pub fn get_total_usable_capacity_free(disks: &[madmin::Disk], info: &madmin::StorageInfo) -> usize { let mut capacity = 0; for disk in disks.iter() { if disk.pool_index < 0 || info.backend.standard_sc_data.len() <= disk.pool_index as usize { diff --git a/rustfs/src/admin/handlers.rs b/rustfs/src/admin/handlers.rs index 376c5743..dfeeeb87 100644 --- a/rustfs/src/admin/handlers.rs +++ b/rustfs/src/admin/handlers.rs @@ -13,6 +13,7 @@ use ecstore::heal::heal_ops::new_heal_sequence; use ecstore::metrics_realtime::{collect_local_metrics, CollectMetricsOpts, MetricType}; use ecstore::new_object_layer_fn; use ecstore::peer::is_reserved_or_invalid_bucket; +use ecstore::pools::{get_total_usable_capacity, get_total_usable_capacity_free}; use ecstore::store::is_valid_object_prefix; use ecstore::store_api::BucketOptions; use ecstore::store_api::StorageAPI; @@ -332,11 +333,18 @@ impl Operation for DataUsageInfoHandler { return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())); }; - let info = load_data_usage_from_backend(store).await.map_err(|e| { + let mut info = load_data_usage_from_backend(store.clone()).await.map_err(|e| { error!("load_data_usage_from_backend failed {:?}", e); s3_error!(InternalError, "load_data_usage_from_backend failed") })?; + let sinfo = store.storage_info().await; + info.total_capacity = get_total_usable_capacity(&sinfo.disks, &sinfo) as u64; + info.total_free_capacity = get_total_usable_capacity_free(&sinfo.disks, &sinfo) as u64; + if info.total_capacity > info.total_free_capacity { + info.total_used_capacity = info.total_capacity - info.total_free_capacity; + } + let data = serde_json::to_vec(&info) .map_err(|_e| S3Error::with_message(S3ErrorCode::InternalError, "parse DataUsageInfo failed"))?;