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); } }