You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by je...@apache.org on 2014/11/12 03:11:45 UTC
hbase git commit: HBASE-12319: Inconsistencies during region recovery
due to close/open of a region during recovery
Repository: hbase
Updated Branches:
refs/heads/branch-1 61477d06b -> 86711846d
HBASE-12319: Inconsistencies during region recovery due to close/open of a region during recovery
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/86711846
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/86711846
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/86711846
Branch: refs/heads/branch-1
Commit: 86711846d38efa32515c1fcdba8c1eadce15e7b2
Parents: 61477d0
Author: Jeffrey Zhong <je...@apache.org>
Authored: Tue Nov 11 17:55:40 2014 -0800
Committer: Jeffrey Zhong <je...@apache.org>
Committed: Tue Nov 11 17:55:48 2014 -0800
----------------------------------------------------------------------
.../hadoop/hbase/regionserver/HRegionServer.java | 2 +-
.../hbase/regionserver/handler/OpenRegionHandler.java | 14 ++++++++++----
.../hbase/master/TestAssignmentManagerOnCluster.java | 4 +++-
.../hbase/regionserver/TestRegionServerNoMaster.java | 2 +-
4 files changed, 15 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/86711846/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
index 1a83e76..69fdb74 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
@@ -2591,7 +2591,7 @@ public class HRegionServer extends HasThread implements
if (actualRegion == null) { // If already online, we still need to close it.
LOG.info("The opening previously in progress has been cancelled by a CLOSE request.");
// The master deletes the znode when it receives this exception.
- throw new NotServingRegionException("The region " + encodedName +
+ throw new RegionAlreadyInTransitionException("The region " + encodedName +
" was opening but not yet served. Opening is cancelled.");
}
} else if (Boolean.FALSE.equals(previous)) {
http://git-wip-us.apache.org/repos/asf/hbase/blob/86711846/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
index b492de9..ea4c205 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
@@ -129,8 +129,8 @@ public class OpenRegionHandler extends EventHandler {
}
boolean failed = true;
- if (!useZKForAssignment ||
- coordination.tickleOpening(ord, regionInfo, rsServices, "post_region_open")) {
+ if (isRegionStillOpening() && (!useZKForAssignment ||
+ coordination.tickleOpening(ord, regionInfo, rsServices, "post_region_open"))) {
if (updateMeta(region)) {
failed = false;
}
@@ -392,8 +392,14 @@ public class OpenRegionHandler extends EventHandler {
void cleanupFailedOpen(final HRegion region) throws IOException {
if (region != null) {
- this.rsServices.removeFromOnlineRegions(region, null);
- region.close();
+ byte[] encodedName = regionInfo.getEncodedNameAsBytes();
+ try {
+ rsServices.getRegionsInTransitionInRS().put(encodedName,Boolean.FALSE);
+ this.rsServices.removeFromOnlineRegions(region, null);
+ region.close();
+ } finally {
+ rsServices.getRegionsInTransitionInRS().remove(encodedName);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/86711846/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
index 1c538e2..12732af 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
@@ -806,7 +806,6 @@ public class TestAssignmentManagerOnCluster {
// Let's forcefully re-assign it to trigger closing/opening
// racing. This test is to make sure this scenario
// is handled properly.
- MyRegionObserver.postOpenEnabled.set(false);
ServerName destServerName = null;
int numRS = TEST_UTIL.getHBaseCluster().getLiveRegionServerThreads().size();
for (int i = 0; i < numRS; i++) {
@@ -822,6 +821,9 @@ public class TestAssignmentManagerOnCluster {
List<HRegionInfo> regions = new ArrayList<HRegionInfo>();
regions.add(hri);
am.assign(destServerName, regions);
+
+ // let region open continue
+ MyRegionObserver.postOpenEnabled.set(false);
// let's check if it's assigned after it's out of transition
am.waitOnRegionToClearRegionsInTransition(hri);
http://git-wip-us.apache.org/repos/asf/hbase/blob/86711846/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java
index 14cae3c..b58fb0f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java
@@ -402,7 +402,7 @@ public class TestRegionServerNoMaster {
getRS().rpcServices.closeRegion(null, crr);
Assert.assertTrue(false);
} catch (ServiceException expected) {
- Assert.assertTrue(expected.getCause() instanceof NotServingRegionException);
+ Assert.assertTrue(expected.getCause() instanceof RegionAlreadyInTransitionException);
}
// The close should have left the ZK state as it is: it's the job the AM to delete it