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..2d8602c 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 @@ -516,6 +516,14 @@ public class RegionStates { if (state.isPendingOpenOrOpening() || state.isFailedClose() || state.isOffline()) { LOG.info("Found region in " + state + " to be reassigned by SSH for " + sn); rits.add(hri); + ServerName lastAssignment = this.lastAssignments.get(hri.getEncodedName()); + if (lastAssignment != null && !lastAssignment.equals(state.getServerName()) + && (state.isOffline() || state.isPendingOpenOrOpeningOnServer(sn))) { + // In SSH, we need to reset last assignment state because + // 1) Those RITs indeed aren't assigned anywhere + // 2) They'll be skipped by regionStates.wasRegionOnDeadServer in SSH region assignment + this.lastAssignments.remove(hri.getEncodedName()); + } } else { LOG.warn("THIS SHOULD NOT HAPPEN: unexpected " + state); }