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 2013/07/15 01:42:27 UTC

svn commit: r1503082 - in /hbase/trunk/hbase-server/src: main/java/org/apache/hadoop/hbase/tool/Canary.java test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java

Author: stack
Date: Sun Jul 14 23:42:27 2013
New Revision: 1503082

URL: http://svn.apache.org/r1503082
Log:
HBASE-8941 TestAccessController.testGlobalPermissionList failed with IndexOutOfBoundsException

Modified:
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java?rev=1503082&r1=1503081&r2=1503082&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/Canary.java Sun Jul 14 23:42:27 2013
@@ -19,6 +19,7 @@
 
 package org.apache.hadoop.hbase.tool;
 
+import org.apache.commons.lang.time.StopWatch;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -36,6 +37,8 @@ import org.apache.hadoop.hbase.HBaseConf
 import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.HTable;
 import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.client.ResultScanner;
+import org.apache.hadoop.hbase.client.Scan;
 
 /**
  * HBase Canary Tool, that that can be used to do
@@ -47,23 +50,23 @@ import org.apache.hadoop.hbase.client.HB
 public final class Canary implements Tool {
   // Sink interface used by the canary to outputs information
   public interface Sink {
-    void publishReadFailure(HRegionInfo region);
-    void publishReadFailure(HRegionInfo region, HColumnDescriptor column);
-    void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);
+    public void publishReadFailure(HRegionInfo region, Exception e);
+    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);
+    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);
   }
 
   // Simple implementation of canary sink that allows to plot on
   // file or standard output timings or failures.
   public static class StdOutSink implements Sink {
     @Override
-    public void publishReadFailure(HRegionInfo region) {
-      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()));
+    public void publishReadFailure(HRegionInfo region, Exception e) {
+      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);
     }
 
     @Override
-    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column) {
+    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {
       LOG.error(String.format("read from region %s column family %s failed",
-                region.getRegionNameAsString(), column.getNameAsString()));
+                region.getRegionNameAsString(), column.getNameAsString()), e);
     }
 
     @Override
@@ -150,24 +153,27 @@ public final class Canary implements Too
     // initialize HBase conf and admin
     if (conf == null) conf = HBaseConfiguration.create();
     admin = new HBaseAdmin(conf);
+    try {
+      // lets the canary monitor the cluster
+      do {
+        if (admin.isAborted()) {
+          LOG.error("HBaseAdmin aborted");
+          return(1);
+        }
 
-    // lets the canary monitor the cluster
-    do {
-      if (admin.isAborted()) {
-        LOG.error("HBaseAdmin aborted");
-        return(1);
-      }
-
-      if (tables_index >= 0) {
-        for (int i = tables_index; i < args.length; i++) {
-          sniff(args[i]);
+        if (tables_index >= 0) {
+          for (int i = tables_index; i < args.length; i++) {
+            sniff(admin, sink, args[i]);
+          }
+        } else {
+          sniff();
         }
-      } else {
-        sniff();
-      }
 
-      Thread.sleep(interval);
-    } while (interval > 0);
+        Thread.sleep(interval);
+      } while (interval > 0);
+    } finally {
+      this.admin.close();
+    }
 
     return(0);
   }
@@ -186,16 +192,32 @@ public final class Canary implements Too
    */
   private void sniff() throws Exception {
     for (HTableDescriptor table : admin.listTables()) {
-      sniff(table);
+      sniff(admin, sink, table);
     }
   }
 
-  /*
-   * canary entry point to monitor specified table.
+  /**
+   * Canary entry point for specified table.
+   * @param admin
+   * @param tableName
+   * @throws Exception
    */
-  private void sniff(String tableName) throws Exception {
+  public static void sniff(final HBaseAdmin admin, String tableName)
+  throws Exception {
+    sniff(admin, new StdOutSink(), tableName);
+  }
+
+  /**
+   * Canary entry point for specified table.
+   * @param admin
+   * @param sink
+   * @param tableName
+   * @throws Exception
+   */
+  private static void sniff(final HBaseAdmin admin, final Sink sink, String tableName)
+  throws Exception {
     if (admin.isTableAvailable(tableName)) {
-      sniff(admin.getTableDescriptor(tableName.getBytes()));
+      sniff(admin, sink, admin.getTableDescriptor(tableName.getBytes()));
     } else {
       LOG.warn(String.format("Table %s is not available", tableName));
     }
@@ -205,7 +227,8 @@ public final class Canary implements Too
    * Loops over regions that owns this table,
    * and output some information abouts the state.
    */
-  private void sniff(HTableDescriptor tableDesc) throws Exception {
+  private static void sniff(final HBaseAdmin admin, final Sink sink, HTableDescriptor tableDesc)
+  throws Exception {
     HTable table = null;
 
     try {
@@ -216,9 +239,9 @@ public final class Canary implements Too
 
     for (HRegionInfo region : admin.getTableRegions(tableDesc.getName())) {
       try {
-        sniffRegion(region, table);
+        sniffRegion(admin, sink, region, table);
       } catch (Exception e) {
-        sink.publishReadFailure(region);
+        sink.publishReadFailure(region, e);
       }
     }
   }
@@ -227,20 +250,42 @@ public final class Canary implements Too
    * For each column family of the region tries to get one row
    * and outputs the latency, or the failure.
    */
-  private void sniffRegion(HRegionInfo region, HTable table) throws Exception {
+  private static void sniffRegion(final HBaseAdmin admin, final Sink sink, HRegionInfo region,
+      HTable table)
+  throws Exception {
     HTableDescriptor tableDesc = table.getTableDescriptor();
+    StopWatch stopWatch = new StopWatch();
     for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {
-      Get get = new Get(region.getStartKey());
-      get.addFamily(column.getName());
-
-      try {
-        long startTime = System.currentTimeMillis();
-        table.get(get);
-        long time = System.currentTimeMillis() - startTime;
-
-        sink.publishReadTiming(region, column, time);
-      } catch (Exception e) {
-        sink.publishReadFailure(region, column);
+      stopWatch.reset();
+      byte [] startKey = region.getStartKey();
+      if (startKey ==  null || startKey.length <= 0) {
+        // Can't do a get on empty start row so do a Scan of first element if any instead.
+        Scan scan = new Scan();
+        scan.addFamily(column.getName());
+        scan.setBatch(1);
+        ResultScanner scanner = null;
+        try {
+          stopWatch.start();
+          scanner = table.getScanner(scan);
+          scanner.next();
+          stopWatch.stop();
+          sink.publishReadTiming(region, column, stopWatch.getTime());
+        } catch (Exception e) {
+          sink.publishReadFailure(region, column, e);
+        } finally {
+          if (scanner != null) scanner.close();
+        }
+      } else {
+        Get get = new Get(region.getStartKey());
+        get.addFamily(column.getName());
+        try {
+          stopWatch.start();
+          table.get(get);
+          stopWatch.stop();
+          sink.publishReadTiming(region, column, stopWatch.getTime());
+        } catch (Exception e) {
+          sink.publishReadFailure(region, column, e);
+        }
       }
     }
   }
@@ -250,4 +295,3 @@ public final class Canary implements Too
     System.exit(exitCode);
   }
 }
-

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java?rev=1503082&r1=1503081&r2=1503082&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java Sun Jul 14 23:42:27 2013
@@ -100,6 +100,7 @@ import org.apache.hadoop.hbase.zookeeper
 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
 import org.apache.hadoop.hbase.zookeeper.ZKConfig;
 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
+import org.apache.hadoop.hbase.tool.Canary;
 import org.apache.hadoop.hdfs.DFSClient;
 import org.apache.hadoop.hdfs.DistributedFileSystem;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
@@ -1652,7 +1653,7 @@ public class HBaseTestingUtility extends
    * @param tableName user table to lookup in .META.
    * @return region server that holds it, null if the row doesn't exist
    * @throws IOException
-   * @throws InterruptedException 
+   * @throws InterruptedException
    */
   public HRegionServer getRSForFirstRegionInTable(byte[] tableName)
   throws IOException, InterruptedException {
@@ -2150,6 +2151,16 @@ public class HBaseTestingUtility extends
          System.currentTimeMillis() - remainder < timeoutMillis);
       Thread.sleep(200);
     }
+    // Finally make sure all regions are fully open and online out on the cluster. Regions may be
+    // in the .META. table and almost open on all regionservers but there setting the region
+    // online in the regionserver is the very last thing done and can take a little while to happen.
+    // Below we do a get.  The get will retry if a NotServeringRegionException or a
+    // RegionOpeningException.  It is crass but when done all will be online.
+    try {
+      Canary.sniff(getHBaseAdmin(), Bytes.toString(table));
+    } catch (Exception e) {
+      throw new IOException(e);
+    }
   }
 
   /**