diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index 9702837..a9dcba2 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -620,6 +620,16 @@ public class AssignmentManager extends ZooKeeperListener { " was on deadserver; forcing offline"); ZKAssign.createOrForceNodeOffline(this.watcher, regionInfo, sn); regionStates.updateRegionState(regionInfo, State.OFFLINE, sn); + ServerName lastAssignment = + regionStates.getLastRegionServerOfRegion(regionInfo.getEncodedName()); + if(lastAssignment != null && !lastAssignment.equals(sn)){ + // We need to clear last assignment info for the region being transitioned to another server + // 1) we force current RIT state to be offline which means the region isn't assigned + // anywhere. + // 2) Otherwise they may be skipped by regionStates.wasRegionOnDeadServer in SSH region + // assignment + regionStates.clearLastAssignmentOfRegion(regionInfo); + } invokeAssign(regionInfo); return false; } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java index 11bddbb..68144bd 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java @@ -626,6 +626,10 @@ public class RegionStates { lastAssignments.put(hri.getEncodedName(), serverName); } } + + synchronized void clearLastAssignmentOfRegion(final HRegionInfo hri) { + lastAssignments.remove(hri.getEncodedName()); + } /** * Compute the average load across all region servers. diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java index 99a8f02..1e5c02d 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java @@ -95,6 +95,7 @@ import org.apache.hadoop.hbase.zookeeper.EmptyWatcher; import org.apache.hadoop.hbase.zookeeper.MiniZooKeeperCluster; import org.apache.hadoop.hbase.zookeeper.ZKAssign; import org.apache.hadoop.hbase.zookeeper.ZKConfig; +import org.apache.hadoop.hbase.zookeeper.ZKUtil; import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; import org.apache.hadoop.hdfs.DFSClient; import org.apache.hadoop.hdfs.DistributedFileSystem; @@ -962,11 +963,6 @@ public class HBaseTestingUtility extends HBaseCommonTestingUtility { hbaseAdmin = null; } - if (zooKeeperWatcher != null) { - zooKeeperWatcher.close(); - zooKeeperWatcher = null; - } - // unset the configuration for MIN and MAX RS to start conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1); conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MAXTOSTART, -1); @@ -976,6 +972,18 @@ public class HBaseTestingUtility extends HBaseCommonTestingUtility { this.hbaseCluster.waitUntilShutDown(); this.hbaseCluster = null; } + + if (zooKeeperWatcher != null) { + try { + ZKUtil.deleteChildrenRecursively(zooKeeperWatcher, + zooKeeperWatcher.getMasterAddressZNode()); + ZKUtil.deleteChildrenRecursively(zooKeeperWatcher, zooKeeperWatcher.rsZNode); + } catch (KeeperException e) { + throw new IOException(e); + } + zooKeeperWatcher.close(); + zooKeeperWatcher = null; + } } /**