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 {
