From a45951260a59fecde4e057b0c9e078a0a2cf830f Mon Sep 17 00:00:00 2001 From: cxymds Date: Tue, 1 Sep 2026 16:05:04 +0800 Subject: [PATCH] test(ecstore): stabilize activation race capacity (#6989) --- crates/ecstore/src/core/pools.rs | 44 ------------------- .../ecstore/src/services/rebalance/control.rs | 32 +++++--------- 2 files changed, 11 insertions(+), 65 deletions(-) diff --git a/crates/ecstore/src/core/pools.rs b/crates/ecstore/src/core/pools.rs index d91923ac5..d69648af7 100644 --- a/crates/ecstore/src/core/pools.rs +++ b/crates/ecstore/src/core/pools.rs @@ -7369,51 +7369,15 @@ impl DecommissionPoolCapacityInfo { physical_used, } } - - #[cfg(test)] - fn from_logical(pool_index: usize, space: PoolSpaceInfo) -> Self { - Self { - pool_index, - space, - layout: DecommissionErasureLayout { data: 1, parity: 0 }, - physical_free: space.free, - physical_total: space.total, - physical_used: space.used, - } - } } -#[cfg(test)] -type DecommissionSpaceInfoOverrides = std::sync::Mutex>>; - #[cfg(test)] type DecommissionCapacityInfoOverrides = std::sync::Mutex>>>; -#[cfg(test)] -static DECOMMISSION_SPACE_INFO_OVERRIDES: std::sync::OnceLock = std::sync::OnceLock::new(); - #[cfg(test)] static DECOMMISSION_CAPACITY_INFO_OVERRIDES: std::sync::OnceLock = std::sync::OnceLock::new(); -#[cfg(test)] -pub(crate) fn set_decommission_space_info_override_for_test(store_id: uuid::Uuid, space_infos: Vec<(usize, PoolSpaceInfo)>) { - DECOMMISSION_SPACE_INFO_OVERRIDES - .get_or_init(|| std::sync::Mutex::new(HashMap::new())) - .lock() - .expect("decommission space info override should not be poisoned") - .insert(store_id, space_infos); -} - -#[cfg(test)] -fn take_decommission_space_info_override_for_test(store_id: uuid::Uuid) -> Option> { - DECOMMISSION_SPACE_INFO_OVERRIDES - .get_or_init(|| std::sync::Mutex::new(HashMap::new())) - .lock() - .expect("decommission space info override should not be poisoned") - .remove(&store_id) -} - #[cfg(test)] pub(crate) fn set_decommission_capacity_info_overrides_for_test( store_id: uuid::Uuid, @@ -9156,14 +9120,6 @@ impl ECStore { return Ok(capacity_infos); } - #[cfg(test)] - if let Some(space_infos) = take_decommission_space_info_override_for_test(self.id) { - return Ok(space_infos - .into_iter() - .map(|(pool_index, space)| DecommissionPoolCapacityInfo::from_logical(pool_index, space)) - .collect()); - } - let mut capacity_infos = Vec::with_capacity(self.pools.len()); for idx in 0..self.pools.len() { capacity_infos.push(self.get_decommission_pool_capacity_info(idx).await?); diff --git a/crates/ecstore/src/services/rebalance/control.rs b/crates/ecstore/src/services/rebalance/control.rs index b351ebbdb..1f95f4f31 100644 --- a/crates/ecstore/src/services/rebalance/control.rs +++ b/crates/ecstore/src/services/rebalance/control.rs @@ -1329,8 +1329,9 @@ mod tests { use super::*; use crate::config::com::delete_config; use crate::core::pools::{ - POOL_META_NAME, PoolActivationDurableSaveBarrier, PoolActivationStartKind, PoolActivationStartProbe, PoolMetaWriteState, - persist_pool_meta_identity_for_startup, + DecommissionErasureLayout, DecommissionPoolCapacityInfo, POOL_META_NAME, PoolActivationDurableSaveBarrier, + PoolActivationStartKind, PoolActivationStartProbe, PoolMetaWriteState, persist_pool_meta_identity_for_startup, + set_decommission_capacity_info_overrides_for_test, }; use crate::object_api::NamespaceLockFence; use crate::set_disk::{PutObjectCommitBarrier, PutObjectCommitPause, hermetic_set_disks_isolated}; @@ -1751,26 +1752,15 @@ mod tests { ]; set_rebalance_disk_stats_override_for_test(rebalance_store.id, disk_stats.clone()); set_rebalance_disk_stats_override_for_test(decommission_store.id, disk_stats); - crate::core::pools::set_decommission_space_info_override_for_test( + let layout = DecommissionErasureLayout { data: 1, parity: 0 }; + let capacity_snapshot = vec![ + DecommissionPoolCapacityInfo::for_test(0, layout, 0, 100, 100), + DecommissionPoolCapacityInfo::for_test(1, layout, 200, 200, 0), + ]; + // Decommission start samples capacity before and inside its durable activation fence. + set_decommission_capacity_info_overrides_for_test( decommission_store.id, - vec![ - ( - 0, - crate::core::pools::PoolSpaceInfo { - free: 0, - total: 100, - used: 100, - }, - ), - ( - 1, - crate::core::pools::PoolSpaceInfo { - free: 200, - total: 200, - used: 0, - }, - ), - ], + vec![capacity_snapshot.clone(), capacity_snapshot], ); let (first_object, competing_object, competing_kind) = match paused_kind { PoolActivationStartKind::Rebalance => {