From b94d3a7faec7a7f3a74e925e4fd76340258beab8 Mon Sep 17 00:00:00 2001 From: chenyang Date: Wed, 25 Jul 2018 15:08:52 +0800 Subject: [PATCH] HBASE-20919 fast fail when call rsgroup balancer before initializing to avoid NPE --- .../hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java index a6a57e7e24..dc6b0b3055 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java @@ -76,7 +76,8 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { private ClusterMetrics clusterStatus; private MasterServices masterServices; private volatile RSGroupInfoManager rsGroupInfoManager; - private LoadBalancer internalBalancer; + private volatile LoadBalancer internalBalancer; + private volatile boolean initialized; /** * Used by reflection in {@link org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory}. @@ -117,6 +118,7 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { throw new ConstraintException(RSGroupInfoManager.RSGROUP_TABLE_NAME + " is not online, unable to perform balance"); } + checkInitializedState(); Map> correctedState = correctAssignments(clusterState); List regionPlans = new ArrayList<>(); @@ -156,6 +158,7 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { @Override public Map> roundRobinAssignment( List regions, List servers) throws HBaseIOException { + checkInitializedState(); Map> assignments = Maps.newHashMap(); ListMultimap regionMap = ArrayListMultimap.create(); ListMultimap serverMap = ArrayListMultimap.create(); @@ -183,6 +186,7 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { @Override public Map> retainAssignment( Map regions, List servers) throws HBaseIOException { + checkInitializedState(); try { Map> assignments = new TreeMap<>(); ListMultimap groupToRegion = ArrayListMultimap.create(); @@ -245,6 +249,7 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { @Override public ServerName randomAssignment(RegionInfo region, List servers) throws HBaseIOException { + checkInitializedState(); ListMultimap regionMap = LinkedListMultimap.create(); ListMultimap serverMap = LinkedListMultimap.create(); generateGroupMaps(Lists.newArrayList(region), servers, regionMap, serverMap); @@ -422,6 +427,7 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { internalBalancer.setClusterMetrics(clusterStatus); internalBalancer.setConf(config); internalBalancer.initialize(); + initialized = true; } public boolean isOnline() { @@ -467,4 +473,11 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { public void postMasterStartupInitialize() { this.internalBalancer.postMasterStartupInitialize(); } + + private void checkInitializedState() throws HBaseIOException { + if (!initialized) { + LOG.warn("RSGroupBasedLoadBalancer has not been initialized"); + throw new HBaseIOException("RSGroupBasedLoadBalancer has not been initialized"); + } + } } -- 2.12.2