From 4ce8e5980557455506d3455d87386b834bbf5668 Mon Sep 17 00:00:00 2001 From: chenyang Date: Tue, 24 Jul 2018 22:43:18 +0800 Subject: [PATCH] HBASE-20919 waiting for initailizing rsgroup balancer before calling balance methods --- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) 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..b9bc0db9d3 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 @@ -77,6 +77,7 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { private MasterServices masterServices; private volatile RSGroupInfoManager rsGroupInfoManager; private LoadBalancer internalBalancer; + private boolean initialized = false; /** * Used by reflection in {@link org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory}. @@ -118,6 +119,7 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { " is not online, unable to perform balance"); } + checkAndWaitInitialization(); 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 { + checkAndWaitInitialization(); 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 { + checkAndWaitInitialization(); 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 { + checkAndWaitInitialization(); 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,20 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { public void postMasterStartupInitialize() { this.internalBalancer.postMasterStartupInitialize(); } + + private void checkAndWaitInitialization() { + int checkTimes = 0; + while (!initialized) { + if (checkTimes % 4 == 0) { + LOG.info("waiting for balancer to be initialized, checkTimes:{}", checkTimes); + } + try { + Thread.sleep(250); + } catch (InterruptedException e) { + LOG.warn("interrupted when sleep to check balancer initialized state", e); + break; + } + checkTimes++; + } + } } -- 2.12.2