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 69df53fcda94e1..2f0f323e64bcf8 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 @@ -517,14 +517,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; @@ -640,6 +644,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;