This is an automated email from the ASF dual-hosted git repository.

wchevreuil pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new bcf320d7a5f HBASE-29453 : NPE on CacheAwareLoadBalancer.balanceTable 
(#7263)
bcf320d7a5f is described below

commit bcf320d7a5fbc013344fee8743af22206706153b
Author: Dev Hingu <dhi...@cloudera.com>
AuthorDate: Thu Sep 4 14:17:35 2025 +0530

    HBASE-29453 : NPE on CacheAwareLoadBalancer.balanceTable (#7263)
    
    Signed-off-by: Chandra Kambham <chan...@apache.org>
    Signed-off-by: Pankaj Kumar <pankajku...@apache.org>
    Signed-off-by: Wellington Chevreuil <wchevre...@apache.org>
---
 .../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");
+    }
+  }
 }

Reply via email to