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:02:37 UTC

svn commit: r1181370 - /hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java

Author: nspiegelberg
Date: Tue Oct 11 02:02:36 2011
New Revision: 1181370

URL: http://svn.apache.org/viewvc?rev=1181370&view=rev
Log:
Print additional information for unassigned regions

Summary:
Print additional information for unassigned regions in user web interface
(zk.jsp). This includes information about unassigned regions (encoded name,
status (UNASSIGNED/CLOSED/CLOSING/OPENED/OPENING/ etc.), time stamp and HMsg.

Test Plan:
Tested on local server

DiffCamp Revision: 153374
Reviewed By: kannan
CC: nspiegelberg, kannan, ageorgiev, hbase@lists
Revert Plan:
OK

Modified:
    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/zookeeper/ZooKeeperWrapper.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java?rev=1181370&r1=1181369&r2=1181370&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:02:36 2011
@@ -23,6 +23,9 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -34,6 +37,9 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.Calendar;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -42,6 +48,7 @@ import org.apache.hadoop.hbase.HConstant
 import org.apache.hadoop.hbase.HServerAddress;
 import org.apache.hadoop.hbase.HServerInfo;
 import org.apache.hadoop.hbase.executor.HBaseEventHandler.HBaseEventType;
+import org.apache.hadoop.hbase.executor.RegionTransitionEventData;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
@@ -244,8 +251,20 @@ public class ZooKeeperWrapper implements
 
   /** @return String dump of everything in ZooKeeper. */
   @SuppressWarnings({"ConstantConditions"})
-  public String dump() {
+  public String dump() throws IOException {
     StringBuilder sb = new StringBuilder();
+
+    dumpRegionServers(sb);
+    dumpUnassignedRegions(sb);
+    dumpQuorumServers(sb);
+
+    return sb.toString();
+  }
+
+  /**
+   * Dump of master, root and region servers
+   */
+  private void dumpRegionServers(StringBuilder sb) {
     sb.append("\nHBase tree in ZooKeeper is rooted at ").append(parentZNode);
     sb.append("\n  Cluster up? ").append(exists(clusterStateZNode, true));
     sb.append("\n  Master address: ").append(readMasterAddress(null));
@@ -254,6 +273,63 @@ public class ZooKeeperWrapper implements
     for (HServerAddress address : scanRSDirectory()) {
       sb.append("\n    - ").append(address);
     }
+  }
+
+  /**
+   * Dump the unassigned regions
+   */
+  private void dumpUnassignedRegions(StringBuilder sb) throws IOException {
+    sb.append("\n  Unassigned regions:");
+
+    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    Calendar calendar = Calendar.getInstance();
+    boolean noUnassigned = true;
+    // Get a list of all UNASSIGNED regions
+    List<String> nodes = this.listZnodes(rgnsInTransitZNode);
+    if(nodes != null) {
+      // For each unassigned region determine its state
+      // (UNASSIGNED/OFFLINE/CLOSING/CLOSED etc.)
+      // and its HMessage, which can contain additional info
+      for (String node : nodes) {
+        noUnassigned = false;
+        String path = joinPath(rgnsInTransitZNode, node);
+        byte[] data = null;
+        try {
+          data = readZNode(path, null);
+        } catch (IOException ioe) {
+          // This is expected, node has already been processed
+          continue;
+        }
+        // If there is no data for the region it is probably CLOSED?
+        if (data == null) {
+          sb.append("\n    - " + node + " has null data[]");
+        }
+        // Otherwise attach the state to the name of the region
+        else {
+          RegionTransitionEventData rtData = new RegionTransitionEventData();
+          rtData.readFields(new DataInputStream(new ByteArrayInputStream(data)));
+
+          sb.append("\n    - " + node);
+          sb.append(" (" + rtData.getHbEvent().toString() + ")");
+          sb.append(", from server: " + rtData.getRsName());
+          sb.append(", with timestamp: " + rtData.getTimeStamp());
+          calendar.setTimeInMillis(rtData.getTimeStamp());
+          sb.append(" (" + formatter.format(calendar.getTime()) + ")");
+          if (rtData.getHmsg() != null) {
+            sb.append("\n      + Message: " + rtData.getHmsg().toString());
+          }
+        }
+      }
+    }
+    if (noUnassigned) {
+      sb.append("\n    - No unassigned regions found.");
+    }
+  }
+
+  /**
+   * Dump the quorum server statistics.
+   */
+  private void dumpQuorumServers(StringBuilder sb) {
     sb.append("\n  Quorum Server Statistics:");
     String[] servers = quorumServers.split(",");
     for (String server : servers) {
@@ -267,7 +343,6 @@ public class ZooKeeperWrapper implements
         sb.append("\n        ERROR: ").append(e.getMessage());
       }
     }
-    return sb.toString();
   }
 
   /**