diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java index d4bd9a4..e95ec20 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java @@ -530,8 +530,12 @@ public class RegionStates { regionsInTransition.remove(encodedName); ServerName oldServerName = regionAssignments.remove(hri); if (oldServerName != null && serverHoldings.containsKey(oldServerName)) { - if (newState == State.MERGED || newState == State.SPLIT - || hri.isMetaRegion() || tableStateManager.isTableState(hri.getTable(), + if (newState == State.MERGED || newState == State.SPLIT) { + // in case of merged/split region, we don't need it anymore, + // remove it completely + LOG.info("Offlined and removed " + hri.getShortNameToLog() + " from " + oldServerName); + deleteRegion(hri); + } else if (hri.isMetaRegion() || tableStateManager.isTableState(hri.getTable(), TableState.State.DISABLED, TableState.State.DISABLING)) { // Offline the region only if it's merged/split, or the table is disabled/disabling. // Otherwise, offline it from this server only when it is online on a different server. @@ -696,10 +700,10 @@ public class RegionStates { regionsInTransition.remove(encodedName); regionStates.remove(encodedName); lastAssignments.remove(encodedName); + removeFromReplicaMapping(hri); ServerName sn = regionAssignments.remove(hri); if (sn != null) { - Set regions = serverHoldings.get(sn); - regions.remove(hri); + removeFromServerHoldings(sn, hri); } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java index 4a6ba41..ab8eb98 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java @@ -55,6 +55,9 @@ import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController; +import org.apache.hadoop.hbase.master.HMaster; +import org.apache.hadoop.hbase.master.RegionState; +import org.apache.hadoop.hbase.master.RegionStates; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.RequestConverter; import org.apache.hadoop.hbase.protobuf.generated.ClientProtos; @@ -149,6 +152,11 @@ public class TestEndToEndSplitTransaction { assertTrue(test(con, tableName, firstRow, server)); assertTrue(test(con, tableName, lastRow, server)); + + // ensure, that region is gone from RegionStates + HMaster master = TEST_UTIL.getHBaseCluster().getMaster(); + RegionStates states = master.getAssignmentManager().getRegionStates(); + assertFalse(states.isRegionInState(region.getRegionInfo(), RegionState.State.SPLIT)); } /**