You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jd...@apache.org on 2013/05/15 20:08:01 UTC

svn commit: r1482986 - in /hbase/branches/0.95/hbase-server/src: main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java main/java/org/apache/hadoop/hbase/master/HMaster.java test/java/org/apache/hadoop/hbase/master/TestActiveMasterManager.java

Author: jdcryans
Date: Wed May 15 18:08:00 2013
New Revision: 1482986

URL: http://svn.apache.org/r1482986
Log:
HBASE-8519  Backup master will never come up if primary master dies during initialization
            (Jerry He via JD)

Modified:
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestActiveMasterManager.java

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java?rev=1482986&r1=1482985&r2=1482986&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java Wed May 15 18:08:00 2013
@@ -29,7 +29,6 @@ import org.apache.hadoop.hbase.exception
 import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.monitoring.MonitoredTask;
-import org.apache.hadoop.hbase.zookeeper.ClusterStatusTracker;
 import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;
 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
 import org.apache.hadoop.hbase.zookeeper.ZooKeeperListener;
@@ -54,6 +53,7 @@ class ActiveMasterManager extends ZooKee
   private static final Log LOG = LogFactory.getLog(ActiveMasterManager.class);
 
   final AtomicBoolean clusterHasActiveMaster = new AtomicBoolean(false);
+  final AtomicBoolean clusterShutDown = new AtomicBoolean(false);
 
   private final ServerName sn;
   private final Server master;
@@ -76,6 +76,18 @@ class ActiveMasterManager extends ZooKee
 
   @Override
   public void nodeDeleted(String path) {
+
+    // We need to keep track of the cluster's shutdown status while
+    // we wait on the current master. We consider that, if the cluster
+    // was already in a "shutdown" state when we started, that this master
+    // is part of a new cluster that was started shortly after the old cluster
+    // shut down, so that state is now irrelevant. This means that the shutdown
+    // state must be set while we wait on the active master in order
+    // to shutdown this master. See HBASE-8519.
+    if(path.equals(watcher.clusterStateZNode) && !master.isStopped()) {
+      clusterShutDown.set(true);
+    }
+
     handle(path);
   }
 
@@ -132,8 +144,7 @@ class ActiveMasterManager extends ZooKee
    * master was running or if some other problem (zookeeper, stop flag has been
    * set on this Master)
    */
-  boolean blockUntilBecomingActiveMaster(MonitoredTask startupStatus,
-    ClusterStatusTracker clusterStatusTracker) {
+  boolean blockUntilBecomingActiveMaster(MonitoredTask startupStatus) {
     while (true) {
       startupStatus.setStatus("Trying to register in ZK as active master");
       // Try to become the active master, watch if there is another master.
@@ -220,7 +231,7 @@ class ActiveMasterManager extends ZooKee
             LOG.debug("Interrupted waiting for master to die", e);
           }
         }
-        if (!clusterStatusTracker.isClusterUp()) {
+        if (clusterShutDown.get()) {
           this.master.stop(
             "Cluster went down before this master became active");
         }

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=1482986&r1=1482985&r2=1482986&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Wed May 15 18:08:00 2013
@@ -602,8 +602,7 @@ MasterServices, Server {
     // to check if the cluster should be shutdown.
     this.clusterStatusTracker = new ClusterStatusTracker(getZooKeeper(), this);
     this.clusterStatusTracker.start();
-    return this.activeMasterManager.blockUntilBecomingActiveMaster(startupStatus,
-        this.clusterStatusTracker);
+    return this.activeMasterManager.blockUntilBecomingActiveMaster(startupStatus);
   }
 
   /**

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestActiveMasterManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestActiveMasterManager.java?rev=1482986&r1=1482985&r2=1482986&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestActiveMasterManager.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestActiveMasterManager.java Wed May 15 18:08:00 2013
@@ -86,7 +86,7 @@ public class TestActiveMasterManager {
     MonitoredTask status = Mockito.mock(MonitoredTask.class);
     clusterStatusTracker.setClusterUp();
 
-    activeMasterManager.blockUntilBecomingActiveMaster(status,clusterStatusTracker);
+    activeMasterManager.blockUntilBecomingActiveMaster(status);
     assertTrue(activeMasterManager.clusterHasActiveMaster.get());
     assertMaster(zk, master);
 
@@ -95,7 +95,7 @@ public class TestActiveMasterManager {
     ActiveMasterManager secondActiveMasterManager =
       secondDummyMaster.getActiveMasterManager();
     assertFalse(secondActiveMasterManager.clusterHasActiveMaster.get());
-    activeMasterManager.blockUntilBecomingActiveMaster(status,clusterStatusTracker);
+    activeMasterManager.blockUntilBecomingActiveMaster(status);
     assertTrue(activeMasterManager.clusterHasActiveMaster.get());
     assertMaster(zk, master);
   }
@@ -131,7 +131,7 @@ public class TestActiveMasterManager {
       ms1.getClusterStatusTracker();
     clusterStatusTracker.setClusterUp();
     activeMasterManager.blockUntilBecomingActiveMaster(
-        Mockito.mock(MonitoredTask.class),clusterStatusTracker);
+        Mockito.mock(MonitoredTask.class));
     assertTrue(activeMasterManager.clusterHasActiveMaster.get());
     assertMaster(zk, firstMasterAddress);
 
@@ -213,8 +213,7 @@ public class TestActiveMasterManager {
     @Override
     public void run() {
       manager.blockUntilBecomingActiveMaster(
-          Mockito.mock(MonitoredTask.class),
-          this.dummyMaster.getClusterStatusTracker());
+          Mockito.mock(MonitoredTask.class));
       LOG.info("Second master has become the active master!");
       isActiveMaster = true;
     }