You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/11 04:00:16 UTC

svn commit: r1181340 - in /hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase: master/ZKUnassignedWatcher.java zookeeper/ZooKeeperWrapper.java

Author: nspiegelberg
Date: Tue Oct 11 02:00:16 2011
New Revision: 1181340

URL: http://svn.apache.org/viewvc?rev=1181340&view=rev
Log:
HBASE 2866 Region permanently offline

Summary:
https://issues.apache.org/jira/browse/HBASE-2866

Test Plan:
Ran the unit tests

DiffCamp Revision: 137096
Reviewed By: kannan
CC: kannan, hbase@lists
Revert Plan:
OK

Modified:
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java?rev=1181340&r1=1181339&r2=1181340&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java Tue Oct 11 02:00:16 2011
@@ -169,6 +169,7 @@ public class ZKUnassignedWatcher impleme
     String region = zNodePath.substring(
         zNodePath.indexOf(rgnInTransitNode) + rgnInTransitNode.length() + 1);
     HBaseEventType rsEvent = HBaseEventType.fromByte(data[0]);
+    LOG.debug("Got event type [ " + rsEvent + " ] for region " + region);
 
     // if the node was CLOSED then handle it
     if(rsEvent == HBaseEventType.RS2ZK_REGION_CLOSED) {

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java?rev=1181340&r1=1181339&r2=1181340&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java Tue Oct 11 02:00:16 2011
@@ -1133,22 +1133,36 @@ public class ZooKeeperWrapper implements
       return;
     }
 
-    if(LOG.isDebugEnabled()) {
-      // Check existing state for logging purposes.
-      Stat stat = new Stat();
-      byte[] oldData = null;
-      try {
-        oldData = readZNode(znode, stat);
-      } catch (IOException e) {
-        LOG.error("Error reading data for " + znode);
-      }
-      if(oldData == null) {
-        LOG.debug("While updating UNASSIGNED region " + regionName + " - node exists with no data" );
-      }
-      else {
-        LOG.debug("While updating UNASSIGNED region " + regionName + " exists, state = " + (HBaseEventType.fromByte(oldData[0])));
-      }
+    Stat stat = new Stat();
+    byte[] oldData = null;
+    try {
+      oldData = readZNode(znode, stat);
+    } catch (IOException e) {
+      LOG.error("Error reading data for " + znode);
+    }
+    // If there is no data in the ZNode, then update it
+    if(oldData == null) {
+      LOG.debug("While updating UNASSIGNED region " + regionName + " - node exists with no data" );
+    }
+    // If there is data in the ZNode, do not update if it is already correct
+    else {
+      HBaseEventType curState = HBaseEventType.fromByte(oldData[0]);
+      HBaseEventType newState = HBaseEventType.fromByte(data[0]);
+      // If the znode has the right state already, do not update it. Updating
+      // the znode again and again will bump up the zk version. This may cause
+      // the region server to fail. The RS expects that the znode is never
+      // updated by anyone else while it is opening/closing a region.
+      if(curState == newState) {
+        LOG.debug("No need to update UNASSIGNED region " + regionName +
+                  " as it already exists in state = " + curState);
+        return;
+      }
+
+      // If the ZNode is in another state, then update it
+      LOG.debug("UNASSIGNED region " + regionName + " is currently in state = " +
+                curState + ", updating it to " + newState);
     }
+    // Update the ZNode
     synchronized(unassignedZNodesWatched) {
       unassignedZNodesWatched.add(znode);
       try {