You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2011/03/01 21:52:46 UTC

svn commit: r1076019 - in /hbase/trunk: ./ src/main/java/org/apache/hadoop/hbase/ src/main/java/org/apache/hadoop/hbase/master/ src/main/java/org/apache/hadoop/hbase/regionserver/ src/test/java/org/apache/hadoop/hbase/

Author: stack
Date: Tue Mar  1 20:52:45 2011
New Revision: 1076019

URL: http://svn.apache.org/viewvc?rev=1076019&view=rev
Log:
HBASE-3573 Move shutdown messaging OFF hearbeat; prereq for fix of hbase-1502

Removed:
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/TestHMsg.java
Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/HMsg.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/TestSerialization.java

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Tue Mar  1 20:52:45 2011
@@ -90,6 +90,8 @@ Release 0.91.0 - Unreleased
 
   TASK
    HBASE-3559  Move report of split to master OFF the heartbeat channel
+   HBASE-3573  Move shutdown messaging OFF hearbeat; prereq for fix of
+               hbase-1502
 
 
   NEW FEATURES

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/HMsg.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/HMsg.java?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/HMsg.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/HMsg.java Tue Mar  1 20:52:45 2011
@@ -38,15 +38,9 @@ import org.apache.hadoop.io.Writable;
  * design, these are to go via zk from here on out.
  */
 public class HMsg implements Writable {
-  public static final HMsg [] STOP_REGIONSERVER_ARRAY =
-    new HMsg [] {new HMsg(Type.STOP_REGIONSERVER)};
   public static final HMsg [] EMPTY_HMSG_ARRAY = new HMsg[0];
 
   public static enum Type {
-    /** Master tells region server to stop.
-     */
-    STOP_REGIONSERVER,
-
     /**
      * When RegionServer receives this message, it goes into a sleep that only
      * an exit will cure.  This message is sent by unit tests simulating

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java Tue Mar  1 20:52:45 2011
@@ -504,7 +504,9 @@ public class HRegionInfo extends Version
     return this.tableDesc.isRootRegion();
   }
 
-  /** @return true if this is the meta table */
+  /** @return true if this region is from a table that is a meta table,
+   * either <code>.META.</code> or <code>-ROOT-</code>
+   */
   public boolean isMetaTable() {
     return this.tableDesc.isMetaTable();
   }

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java Tue Mar  1 20:52:45 2011
@@ -249,7 +249,9 @@ public class HTableDescriptor implements
     values.put(IS_META_KEY, isMeta? TRUE: FALSE);
   }
 
-  /** @return true if table is the meta table */
+  /** @return true if table is a meta table, either <code>.META.</code> or
+   * <code>-ROOT-</code>
+   */
   public boolean isMetaTable() {
     return isMetaRegion() && !isRootRegion();
   }

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java Tue Mar  1 20:52:45 2011
@@ -1964,6 +1964,40 @@ public class AssignmentManager extends Z
   }
 
   /**
+   * @param hsi
+   * @return True if this server is carrying a catalog region, a region from
+   * -ROOT- or .META. table.
+   */
+  boolean isMetaRegionServer(final HServerInfo hsi) {
+    synchronized (this.regions) {
+      List<HRegionInfo> regions = this.servers.get(hsi);
+      if (regions == null || regions.isEmpty()) return false;
+      for (HRegionInfo hri: regions) {
+        if (hri.isMetaRegion()) return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Run through remaining regionservers and unassign all catalog regions.
+   */
+  void unassignCatalogRegions() {
+    this.servers.entrySet();
+    synchronized (this.regions) {
+      for (Map.Entry<HServerInfo, List<HRegionInfo>> e: this.servers.entrySet()) {
+        List<HRegionInfo> regions = e.getValue();
+        if (regions == null || regions.isEmpty()) continue;
+        for (HRegionInfo hri: regions) {
+          if (hri.isMetaRegion()) {
+            unassign(hri);
+          }
+        }
+      }
+    }
+  }
+
+  /**
    * State of a Region while undergoing transitions.
    */
   public static class RegionState implements Writable {
@@ -2079,4 +2113,4 @@ public class AssignmentManager extends Z
   public void stop() {
     this.timeoutMonitor.interrupt();
   }
-}
+}
\ No newline at end of file

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java Tue Mar  1 20:52:45 2011
@@ -269,11 +269,6 @@ public class ServerManager {
           "ready next on next report");
     }
 
-    // Check startcodes
-    if (raceThatShouldNotHappenAnymore(storedInfo, info)) {
-      return HMsg.STOP_REGIONSERVER_ARRAY;
-    }
-
     for (HMsg msg: msgs) {
       LOG.info("Received " + msg + " from " + serverInfo.getServerName());
       switch (msg.getType()) {
@@ -283,38 +278,32 @@ public class ServerManager {
     }
 
     HMsg [] reply = null;
-    int numservers = countOfRegionServers();
     if (this.clusterShutdown) {
-      if (numservers <= 2) {
+      if (isOnlyMetaRegionServersOnline()) {
+        LOG.info("Only catalog regions remaining; running unassign");
+        // The only remaining regions are catalog regions.
         // Shutdown needs to be staggered; the meta regions need to close last
-        // in case they need to be updated during the close melee.  If <= 2
-        // servers left, then these are the two that were carrying root and meta
-        // most likely (TODO: This presumes unsplittable meta -- FIX). Tell
-        // these servers can shutdown now too.
-        reply = HMsg.STOP_REGIONSERVER_ARRAY;
+        // in case they need to be updated during the close melee. If only
+        // catalog reigons remaining, tell them they can go down now too.  On
+        // close of region, the regionservers should then shut themselves down.
+        this.services.getAssignmentManager().unassignCatalogRegions();
       }
     }
     return processRegionServerAllsWell(info, mostLoadedRegions, reply);
   }
 
-  private boolean raceThatShouldNotHappenAnymore(final HServerInfo storedInfo,
-      final HServerInfo reportedInfo) {
-    if (storedInfo.getStartCode() != reportedInfo.getStartCode()) {
-      // TODO: I don't think this possible any more.  We check startcodes when
-      // server comes in on regionServerStartup -- St.Ack
-      // This state is reachable if:
-      // 1) RegionServer A started
-      // 2) RegionServer B started on the same machine, then clobbered A in regionServerStartup.
-      // 3) RegionServer A returns, expecting to work as usual.
-      // The answer is to ask A to shut down for good.
-      LOG.warn("Race condition detected: " + reportedInfo.getServerName());
-      synchronized (this.onlineServers) {
-        removeServerInfo(reportedInfo.getServerName());
-        notifyOnlineServers();
+  /**
+   * @return True if all online servers are carrying one or more catalog
+   * regions, there are no servers online carrying user regions only
+   */
+  private boolean isOnlyMetaRegionServersOnline() {
+    List<HServerInfo> onlineServers = getOnlineServersList();
+    for (HServerInfo hsi: onlineServers) {
+      if (!this.services.getAssignmentManager().isMetaRegionServer(hsi)) {
+        return false;
       }
-      return true;
     }
-    return false;
+    return true;
   }
 
   /**

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Tue Mar  1 20:52:45 2011
@@ -741,16 +741,6 @@ public class HRegionServer implements HR
     }
     updateOutboundMsgs(outboundMessages);
     outboundMessages.clear();
-
-    for (int i = 0; !this.stopped && msgs != null && i < msgs.length; i++) {
-      LOG.info(msgs[i].toString());
-      // Intercept stop regionserver messages
-      if (msgs[i].getType().equals(HMsg.Type.STOP_REGIONSERVER)) {
-        stop("Received " + msgs[i]);
-        continue;
-      }
-      LOG.warn("NOT PROCESSING " + msgs[i] + " -- WHY IS MASTER SENDING IT TO US?");
-    }
     return outboundMessages;
   }
 

Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/TestSerialization.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/TestSerialization.java?rev=1076019&r1=1076018&r2=1076019&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/TestSerialization.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/TestSerialization.java Tue Mar  1 20:52:45 2011
@@ -84,21 +84,6 @@ public class TestSerialization {
     assertTrue(Bytes.equals("value".getBytes(), hmw.get("key".getBytes())));
   }
 
-  @Test public void testHMsg() throws Exception {
-    final String name = "testHMsg";
-    HMsg  m = new HMsg(HMsg.Type.STOP_REGIONSERVER);
-    byte [] mb = Writables.getBytes(m);
-    HMsg deserializedHMsg = (HMsg)Writables.getWritable(mb, new HMsg());
-    assertTrue(m.equals(deserializedHMsg));
-    m = new HMsg(HMsg.Type.STOP_REGIONSERVER,
-      new HRegionInfo(new HTableDescriptor(name),
-        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),
-        "Some message".getBytes());
-    mb = Writables.getBytes(m);
-    deserializedHMsg = (HMsg)Writables.getWritable(mb, new HMsg());
-    assertTrue(m.equals(deserializedHMsg));
-  }
-
   @Test public void testTableDescriptor() throws Exception {
     final String name = "testTableDescriptor";
     HTableDescriptor htd = createTableDescriptor(name);