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/24 20:01:51 UTC

svn commit: r1085075 - in /hbase/trunk: ./ src/main/java/org/apache/hadoop/hbase/catalog/ src/main/java/org/apache/hadoop/hbase/master/ src/main/java/org/apache/hadoop/hbase/regionserver/handler/ src/main/java/org/apache/hadoop/hbase/zookeeper/

Author: stack
Date: Thu Mar 24 19:01:50 2011
New Revision: 1085075

URL: http://svn.apache.org/viewvc?rev=1085075&view=rev
Log:
HBASE-3627 NPE in EventHandler when region already reassigned

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKAssign.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1085075&r1=1085074&r2=1085075&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Thu Mar 24 19:01:50 2011
@@ -168,6 +168,7 @@ Release 0.90.2 - Unreleased
    HBASE-3617  NoRouteToHostException during balancing will cause Master abort
                (Ted Yu via Stack)
    HBASE-3668  CatalogTracker.waitForMeta can wait forever and totally stall a RS
+   HBASE-3627  NPE in EventHandler when region already reassigned
 
   IMPROVEMENTS
    HBASE-3542  MultiGet methods in Thrift

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java?rev=1085075&r1=1085074&r2=1085075&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java Thu Mar 24 19:01:50 2011
@@ -23,6 +23,7 @@ import java.io.EOFException;
 import java.io.IOException;
 import java.net.ConnectException;
 import java.net.SocketTimeoutException;
+import java.net.SocketException;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.commons.logging.Log;
@@ -390,8 +391,11 @@ public class CatalogTracker {
         throw e;
       }
     } catch (SocketTimeoutException e) {
-      // We were passed the wrong address.  Return 'protocol' == null.
+      // Return 'protocol' == null.
       LOG.debug("Timed out connecting to " + address);
+    } catch (SocketException e) {
+      // Return 'protocol' == null.
+      LOG.debug("Exception connecting to " + address);
     } catch (IOException ioe) {
       Throwable cause = ioe.getCause();
       if (cause != null && cause instanceof EOFException) {

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java?rev=1085075&r1=1085074&r2=1085075&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java Thu Mar 24 19:01:50 2011
@@ -308,14 +308,9 @@ public class MetaReader {
     } catch (java.net.SocketTimeoutException e) {
       // Treat this exception + message as unavailable catalog table. Catch it
       // and fall through to return a null
-    } catch (java.net.ConnectException e) {
-      if (e.getMessage() != null &&
-          e.getMessage().contains("Connection refused")) {
-        // Treat this exception + message as unavailable catalog table. Catch it
-        // and fall through to return a null
-      } else {
-        throw e;
-      }
+    } catch (java.net.SocketException e) {
+      // Treat this exception + message as unavailable catalog table. Catch it
+      // and fall through to return a null
     } catch (RemoteException re) {
       IOException ioe = re.unwrapRemoteException();
       if (ioe instanceof NotServingRegionException) {

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=1085075&r1=1085074&r2=1085075&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 Thu Mar 24 19:01:50 2011
@@ -1770,6 +1770,10 @@ public class AssignmentManager extends Z
                   Stat stat = new Stat();
                   RegionTransitionData data = ZKAssign.getDataNoWatch(watcher,
                       node, stat);
+                  if (data == null) {
+                    LOG.warn("Data is null, node " + node + " no longer exists");
+                    break;
+                  }
                   if (data.getEventType() == EventType.RS_ZK_REGION_OPENED) {
                     LOG.debug("Region has transitioned to OPENED, allowing " +
                         "watched event handlers to process");

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java?rev=1085075&r1=1085074&r2=1085075&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java Thu Mar 24 19:01:50 2011
@@ -87,7 +87,11 @@ public class OpenRegionHandler extends E
 
     // If fails, just return.  Someone stole the region from under us.
     // Calling transitionZookeeperOfflineToOpening initalizes this.version.
-    if (!transitionZookeeperOfflineToOpening(encodedName)) return;
+    if (!transitionZookeeperOfflineToOpening(encodedName)) {
+      LOG.warn("Region was hijacked? It no longer exists, encodedName=" +
+        encodedName);
+      return;
+    }
 
     // Open region.  After a successful open, failures in subsequent processing
     // needs to do a close as part of cleanup.
@@ -254,7 +258,7 @@ public class OpenRegionHandler extends E
   /**
    * @return Instance of HRegion if successful open else null.
    */
-  private HRegion openRegion() {
+  HRegion openRegion() {
     HRegion region = null;
     try {
       // Instantiate the region.  This also periodically tickles our zk OPENING

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKAssign.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKAssign.java?rev=1085075&r1=1085074&r2=1085075&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKAssign.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKAssign.java Thu Mar 24 19:01:50 2011
@@ -396,7 +396,8 @@ public class ZKAssign {
     zkw.sync(node);
     Stat stat = new Stat();
     byte [] bytes = ZKUtil.getDataNoWatch(zkw, node, stat);
-    if(bytes == null) {
+    if (bytes == null) {
+      // If it came back null, node does not exist.
       throw KeeperException.create(Code.NONODE);
     }
     RegionTransitionData data = RegionTransitionData.fromBytes(bytes);
@@ -674,8 +675,11 @@ public class ZKAssign {
 
     // Read existing data of the node
     Stat stat = new Stat();
-    byte [] existingBytes =
-      ZKUtil.getDataNoWatch(zkw, node, stat);
+    byte [] existingBytes = ZKUtil.getDataNoWatch(zkw, node, stat);
+    if (existingBytes == null) {
+      // Node no longer exists.  Return -1. It means unsuccessful transition.
+      return -1;
+    }
     RegionTransitionData existingData =
       RegionTransitionData.fromBytes(existingBytes);
 
@@ -762,7 +766,7 @@ public class ZKAssign {
    * @param zkw zk reference
    * @param pathOrRegionName fully-specified path or region name
    * @param stat object to store node info into on getData call
-   * @return data for the unassigned node
+   * @return data for the unassigned node or null if node does not exist
    * @throws KeeperException if unexpected zookeeper exception
    */
   public static RegionTransitionData getDataNoWatch(ZooKeeperWatcher zkw,
@@ -771,7 +775,7 @@ public class ZKAssign {
     String node = pathOrRegionName.startsWith("/") ?
         pathOrRegionName : getNodeName(zkw, pathOrRegionName);
     byte [] data = ZKUtil.getDataNoWatch(zkw, node, stat);
-    if(data == null) {
+    if (data == null) {
       return null;
     }
     return RegionTransitionData.fromBytes(data);

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java?rev=1085075&r1=1085074&r2=1085075&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java Thu Mar 24 19:01:50 2011
@@ -576,7 +576,7 @@ public class ZKUtil {
    * @param zkw zk reference
    * @param znode path of node
    * @param stat node status to set if node exists
-   * @return data of the specified znode, or null if does not exist
+   * @return data of the specified znode, or null if node does not exist
    * @throws KeeperException if unexpected zookeeper exception
    */
   public static byte [] getDataNoWatch(ZooKeeperWatcher zkw, String znode,