diff --git a/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudTabletRebalancer.java b/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudTabletRebalancer.java index 82d29f3d701f68..baf1479a6d24c8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudTabletRebalancer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/catalog/CloudTabletRebalancer.java @@ -512,14 +512,18 @@ protected void runAfterCatalogReady() { return; } - statRouteInfo(); - migrateTabletsForSmoothUpgrade(); - statRouteInfo(); + try { + statRouteInfo(); + migrateTabletsForSmoothUpgrade(); + statRouteInfo(); - indexBalanced = true; - tableBalanced = true; + indexBalanced = true; + tableBalanced = true; - performBalancing(); + performBalancing(); + } finally { + releaseSchedulingIndexes(); + } checkDecommissionState(clusterToBes); inited = true; @@ -635,6 +639,15 @@ private void performBalancing() { } } + private void releaseSchedulingIndexes() { + // These indexes are no longer used after balancing. Replace their top-level maps instead of clearing + // every entry so the complete tablet membership graphs can become collectible without an O(N) traversal. + partitionToTablets = new ConcurrentHashMap<>(); + futurePartitionToTablets = new ConcurrentHashMap<>(); + beToTabletsInTable = new ConcurrentHashMap<>(); + futureBeToTabletsInTable = new ConcurrentHashMap<>(); + } + private boolean balanceAllPartitionsByPhase(ActiveSchedulePhase phase) { // Reuse existing "balanced" flags as a per-phase signal. indexBalanced = true;