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"); + } + } }