From 3c336d0dbcde06d3e7a1d527ebc4f2f03f1e812f Mon Sep 17 00:00:00 2001 From: mazhengxuan Date: Fri, 31 Jul 2026 19:24:08 +0800 Subject: [PATCH] HBASE-30303: Fix balancing for regions assigned through RSGroup fallback --- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 12 +++++++++--- .../hadoop/hbase/rsgroup/TestRSGroupsFallback.java | 3 +++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java index 0b012eb9234c..288357dc8c9a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java @@ -322,12 +322,18 @@ private List filterServers(Set
servers, List on } catch (IOException exp) { LOG.debug("RSGroup information null for region of table " + tableName, exp); } + List candidateServers = Collections.emptyList(); + if (targetRSGInfo != null) { + List onlineServers = Lists.newArrayList(clusterLoad.keySet()); + candidateServers = filterOfflineServers(targetRSGInfo, onlineServers); + if (isFallbackEnabled() && candidateServers.isEmpty()) { + candidateServers = getFallBackCandidates(onlineServers); + } + } for (Map.Entry> serverRegionMap : clusterLoad.entrySet()) { ServerName currentHostServer = serverRegionMap.getKey(); List regionInfoList = serverRegionMap.getValue(); - if ( - targetRSGInfo == null || !targetRSGInfo.containsServer(currentHostServer.getAddress()) - ) { + if (!candidateServers.contains(currentHostServer)) { regionInfoList.forEach(regionInfo -> { regionPlansForMisplacedRegions.add(new RegionPlan(regionInfo, currentHostServer, null)); }); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java index ab1ed04fcf79..c7ee1b313376 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsFallback.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.rsgroup; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; @@ -93,10 +94,12 @@ public void testFallback() throws Exception { // server of test group crash, regions move to default group crashRsInGroup(groupName); assertRegionsInGroup(tableName, RSGroupInfo.DEFAULT_GROUP); + assertEquals(0, MASTER.balance().getMovesCalculated()); // server of default group crash, regions move to any other group crashRsInGroup(RSGroupInfo.DEFAULT_GROUP); assertRegionsInGroup(tableName, FALLBACK_GROUP); + assertEquals(0, MASTER.balance().getMovesCalculated()); // add a new server to default group, regions move to default group TEST_UTIL.getMiniHBaseCluster().startRegionServerAndWait(60000);