This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new b6444e1deff HBASE-29453 NPE on CacheAwareLoadBalancer.balanceTable
(#7263) (#7272)
b6444e1deff is described below
commit b6444e1deff029dd44d57ad591e7d4cf0b73d455
Author: Wellington Ramos Chevreuil <[email protected]>
AuthorDate: Sat Sep 6 15:33:02 2025 +0100
HBASE-29453 NPE on CacheAwareLoadBalancer.balanceTable (#7263) (#7272)
Signed-off-by: Chandra Kambham <[email protected]>
Signed-off-by: Pankaj Kumar <[email protected]>
Signed-off-by: Wellington Chevreuil <[email protected]>
Co-authored-by: Dev Hingu <[email protected]>
---
.../master/balancer/CacheAwareLoadBalancer.java | 3 ++
.../balancer/TestCacheAwareLoadBalancer.java | 40 ++++++++++++++++++++++
2 files changed, 43 insertions(+)
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.java
index a3fc4d6ac6e..df0adc98fe6 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.java
@@ -207,6 +207,9 @@ public class CacheAwareLoadBalancer extends
StochasticLoadBalancer {
final Map<String, Pair<ServerName, Float>> snapshot = new HashMap<>();
snapshot.putAll(this.regionCacheRatioOnOldServerMap);
List<RegionPlan> plans = super.balanceTable(tableName, loadOfOneTable);
+ if (plans == null) {
+ return plans;
+ }
plans.sort((p1, p2) -> {
Pair<ServerName, Float> pair1 = snapshot.get(p1.getRegionName());
Float ratio1 =
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestCacheAwareLoadBalancer.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestCacheAwareLoadBalancer.java
index 3840c5b4122..335a719a1f9 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestCacheAwareLoadBalancer.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestCacheAwareLoadBalancer.java
@@ -19,7 +19,9 @@ package org.apache.hadoop.hbase.master.balancer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -559,4 +561,42 @@ public class TestCacheAwareLoadBalancer extends
BalancerTestBase {
assertEquals(5, targetServers.get(server1).size());
assertTrue(targetServers.get(server1).containsAll(oldCachedRegions));
}
+
+ @Test
+ public void testBalancerNotThrowNPEWhenBalancerPlansIsNull() throws
Exception {
+ Map<ServerName, List<RegionInfo>> clusterState = new HashMap<>();
+ ServerName server0 = servers.get(0);
+ ServerName server1 = servers.get(1);
+ ServerName server2 = servers.get(2);
+
+ List<RegionInfo> regionsOnServer0 = randomRegions(5);
+ List<RegionInfo> regionsOnServer1 = randomRegions(5);
+ List<RegionInfo> regionsOnServer2 = randomRegions(5);
+
+ clusterState.put(server0, regionsOnServer0);
+ clusterState.put(server1, regionsOnServer1);
+ clusterState.put(server2, regionsOnServer2);
+
+ // Mock cluster metrics
+ Map<ServerName, ServerMetrics> serverMetricsMap = new TreeMap<>();
+ serverMetricsMap.put(server0,
mockServerMetricsWithRegionCacheInfo(server0, regionsOnServer0,
+ 0.0f, new ArrayList<>(), 0, 10));
+ serverMetricsMap.put(server1,
mockServerMetricsWithRegionCacheInfo(server1, regionsOnServer1,
+ 0.0f, new ArrayList<>(), 0, 10));
+ serverMetricsMap.put(server2,
mockServerMetricsWithRegionCacheInfo(server2, regionsOnServer2,
+ 0.0f, new ArrayList<>(), 0, 10));
+
+ ClusterMetrics clusterMetrics = mock(ClusterMetrics.class);
+ when(clusterMetrics.getLiveServerMetrics()).thenReturn(serverMetricsMap);
+ loadBalancer.updateClusterMetrics(clusterMetrics);
+
+ Map<TableName, Map<ServerName, List<RegionInfo>>> LoadOfAllTable =
+ (Map) mockClusterServersWithTables(clusterState);
+ try {
+ List<RegionPlan> plans = loadBalancer.balanceCluster(LoadOfAllTable);
+ assertNull(plans);
+ } catch (NullPointerException npe) {
+ fail("NPE should not be thrown");
+ }
+ }
}