Index: src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java (revision 1126890) +++ src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java (working copy) @@ -74,6 +74,25 @@ } /** + * Before assign the ROOT region, ensure it haven't + * been assigned by other place + *
+ * Under some scenarios, the ROOT region can be opened twice, so it seemed online
+ * in two regionserver at the same time.
+ * If the ROOT region has been assigned, so the operation can be canceled.
+ * @throws InterruptedException
+ * @throws IOException
+ * @throws KeeperException
+ */
+ private void verifyAndAssignRoot()
+ throws InterruptedException, IOException, KeeperException {
+ long timeout = this.server.getConfiguration().getLong("hbase.catalog.verification.timeout", 1000);
+ if (!this.server.getCatalogTracker().verifyRootRegionLocation(timeout)) {
+ this.services.getAssignmentManager().assignRoot();
+ }
+ }
+
+ /**
* @return True if the server we are processing was carrying -ROOT-
*/
boolean isCarryingRoot() {
@@ -104,10 +123,14 @@
// Assign root and meta if we were carrying them.
if (isCarryingRoot()) { // -ROOT-
try {
- this.services.getAssignmentManager().assignRoot();
+ verifyAndAssignRoot();
} catch (KeeperException e) {
this.server.abort("In server shutdown processing, assigning root", e);
throw new IOException("Aborting", e);
+ } catch (InterruptedException e1)
+ {
+ LOG.warn("Interrupted while verifying root region's location", e1);
+ throw new IOException(e1);
}
}