diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java index 4fed9d9..2145211 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java @@ -611,6 +611,17 @@ class RSGroupInfoManagerImpl implements RSGroupInfoManager { if (waitForGroupTableOnline()) { LOG.info("GroupBasedLoadBalancer is now online"); } + while (isMasterRunning(masterServices)) { + if (masterServices.isInitialized()) { + checkAndMoveRegionToCorrectGroup(); + break; + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + LOG.info("Sleep interrupted", e); + } + } } private boolean waitForGroupTableOnline() { @@ -747,6 +758,28 @@ class RSGroupInfoManagerImpl implements RSGroupInfoManager { public boolean isOnline() { return online; } + + //Check if the regions are deployed in the correct group + //if not, move it to the correct group + public void checkAndMoveRegionToCorrectGroup() { + LOG.info(""); + synchronized (rsGroupMap) { + for (RSGroupInfo info : rsGroupMap.values()) { + Set
servers = info.getServers(); + for (TableName table : info.getTables()) { + List regions = masterServices.getAssignmentManager(). + getRegionStates().getRegionsOfTable(table); + for (HRegionInfo region : regions) { + ServerName sn = masterServices.getAssignmentManager(). + getRegionStates().getRegionServerOfRegion(region); + if (!servers.contains(sn.getAddress())) { + masterServices.getAssignmentManager().unassign(region); + } + } + } + } + } + } } private static boolean isMasterRunning(MasterServices masterServices) {