This is an automated email from the ASF dual-hosted git repository.
wchevreuil pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-3 by this push:
new bce9650ee1d HBASE-29453 : NPE on CacheAwareLoadBalancer.balanceTable
(#7263)
bce9650ee1d is described below
commit bce9650ee1de9e83ef7f0b107b01f317b1355e51
Author: Dev Hingu <[email protected]>
AuthorDate: Thu Sep 4 14:17:35 2025 +0530
HBASE-29453 : NPE on CacheAwareLoadBalancer.balanceTable (#7263)
Signed-off-by: Chandra Kambham <[email protected]>
Signed-off-by: Pankaj Kumar <[email protected]>
Signed-off-by: Wellington Chevreuil <[email protected]>
---
.../master/balancer/CacheAwareLoadBalancer.java | 3 ++
.../balancer/TestCacheAwareLoadBalancer.java | 40 ++++++++++++++++++++++
2 files changed, 43 insertions(+)
diff --git
a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.java
b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.java
index 87d9a10a229..30e4b5212bf 100644
---
a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CacheAwareLoadBalancer.java
+++
b/hbase-balancer/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 893eeda945e..916dbcf2947 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;
@@ -548,4 +550,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");
+ }
+ }
}