From a75e5a543531c7656ccb5108ec8fe613d584a89e Mon Sep 17 00:00:00 2001 From: tedyu Date: Tue, 7 Feb 2017 12:57:07 -0800 Subject: [PATCH] HBASE-17275 Assign timeout may cause region to be unassigned forever (Allan yang) --- .../hadoop/hbase/master/AssignmentManager.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index f3c0787efc7..9c6be4e7b14 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -1128,10 +1128,19 @@ public class AssignmentManager extends ZooKeeperListener { + regionStates.getRegionState(encodedName)); if (regionState != null) { - // Close it without updating the internal region states, - // so as not to create double assignments in unlucky scenarios - // mentioned in OpenRegionHandler#process - unassign(regionState.getRegion(), null, -1, null, false, sn); + if(regionState.isOpened() && regionState.getServerName().equals(sn)) { + //if this region was opened before on this rs, we don't have to unassign it. It won't cause + //double assign. One possible scenario of what happened is HBASE-17275 + failedOpenTracker.remove(encodedName); // reset the count, if any + new OpenedRegionHandler( + server, this, regionState.getRegion(), coordination, ord).process(); + updateOpenedRegionHandlerTracker(regionState.getRegion()); + } else { + // Close it without updating the internal region states, + // so as not to create double assignments in unlucky scenarios + // mentioned in OpenRegionHandler#process + unassign(regionState.getRegion(), null, -1, null, false, sn); + } } return; }