You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by li...@apache.org on 2013/11/28 19:13:33 UTC

svn commit: r1546432 - in /hbase/branches/0.89-fb/src: main/java/org/apache/hadoop/hbase/io/hfile/histogram/ main/java/org/apache/hadoop/hbase/regionserver/ test/java/org/apache/hadoop/hbase/io/hfile/histogram/

Author: liyin
Date: Thu Nov 28 18:13:33 2013
New Revision: 1546432

URL: http://svn.apache.org/r1546432
Log:
[HBASE-9815] Fix a NullPointerException in HRegion.getHistogram()

Author: manukranthk

Summary: Fixing the NPE in HRegion.getHistogram().

Test Plan: Unit Test

Reviewers: adela, liyintang

Reviewed By: liyintang

CC: hbase-eng@, daviddeng

Differential Revision: https://phabricator.fb.com/D1072451

Task ID: 2905536

Added:
    hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestNullData.java
Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/io/hfile/histogram/UniformSplitHFileHistogram.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java
    hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestHFileHistogramE2E.java

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/io/hfile/histogram/UniformSplitHFileHistogram.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/io/hfile/histogram/UniformSplitHFileHistogram.java?rev=1546432&r1=1546431&r2=1546432&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/io/hfile/histogram/UniformSplitHFileHistogram.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/io/hfile/histogram/UniformSplitHFileHistogram.java Thu Nov 28 18:13:33 2013
@@ -220,6 +220,7 @@ public class UniformSplitHFileHistogram 
 
   @Override
   public HFileHistogram deserialize(ByteBuffer buf) throws IOException {
+    if (buf == null) return null;
     ByteArrayInputStream bais = new ByteArrayInputStream(buf.array(),
         buf.arrayOffset(), buf.limit());
     DataInput in = new DataInputStream(bais);

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1546432&r1=1546431&r2=1546432&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Thu Nov 28 18:13:33 2013
@@ -4061,12 +4061,20 @@ public class HRegion implements HeapSize
     }
   };
 
+  /**
+   * Returns null is no data is available.
+   * @return
+   * @throws IOException
+   */
   public HFileHistogram getHistogram() throws IOException {
     List<HFileHistogram> histograms = new ArrayList<HFileHistogram>();
     if (stores.size() == 0) return null;
     for (Store s : stores.values()) {
-      histograms.add(s.getHistogram());
+      HFileHistogram hist = s.getHistogram();
+      if (hist != null) histograms.add(hist);
     }
+    // If none of the stores produce a histogram returns null.
+    if (histograms.size() == 0) return null;
     HFileHistogram h = histograms.get(0).compose(histograms);
     return h;
   }

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1546432&r1=1546431&r2=1546432&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Thu Nov 28 18:13:33 2013
@@ -114,6 +114,7 @@ import org.apache.hadoop.hbase.io.hfile.
 import org.apache.hadoop.hbase.io.hfile.LruBlockCache;
 import org.apache.hadoop.hbase.io.hfile.LruBlockCache.CacheStats;
 import org.apache.hadoop.hbase.io.hfile.PreloadThreadPool;
+import org.apache.hadoop.hbase.io.hfile.histogram.HFileHistogram;
 import org.apache.hadoop.hbase.io.hfile.histogram.HFileHistogram.Bucket;
 import org.apache.hadoop.hbase.ipc.HBaseRPC;
 import org.apache.hadoop.hbase.ipc.HBaseRPCErrorHandler;
@@ -3817,19 +3818,31 @@ public class HRegionServer implements HR
     return 0;
   }
 
+  /**
+   *
+   * Returns null if no data is available.
+   */
   @Override
   public List<Bucket> getHistogram(byte[] regionName) throws IOException {
     checkOpen();
     HRegion region = getRegion(regionName);
-    return region.getHistogram().getUniformBuckets();
+    HFileHistogram hist = region.getHistogram();
+    if (hist == null) return null;
+    return hist.getUniformBuckets();
   }
 
+  /**
+   *
+   * Returns null if no data is available.
+   */
   @Override
   public List<Bucket> getHistogramForStore(byte[] regionName, byte[] family)
       throws IOException {
     checkOpen();
     HRegion region = getRegion(regionName);
-    return region.getStore(family).getHistogram().getUniformBuckets();
+    HFileHistogram hist = region.getStore(family).getHistogram();
+    if (hist == null) return null;
+    return hist.getUniformBuckets();
   }
 }
     boolean origProfiling = enableServerSideProfilingForAllCalls.get();

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java?rev=1546432&r1=1546431&r2=1546432&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java Thu Nov 28 18:13:33 2013
@@ -1451,14 +1451,21 @@ public class Store extends SchemaConfigu
   }
 
   private HFileHistogram hist = null;
-  public HFileHistogram getHistogram() throws IOException {
+  /**
+   *
+   * @return HFileHistogram for this store.
+   * Returns null if no data available.
+   * @throws IOException
+   */
+  public synchronized HFileHistogram getHistogram() throws IOException {
     if (hist != null) return hist;
     List<HFileHistogram> histograms = new ArrayList<HFileHistogram>();
-    if (storefiles.size() == 0) return null;
+    if (storefiles.size() == 0) return hist;
     for (StoreFile file : this.storefiles) {
       HFileHistogram hist = file.getHistogram();
       if (hist != null) histograms.add(hist);
     }
+    if (histograms.size() == 0) return hist;
     HFileHistogram h = histograms.get(0).compose(histograms);
     this.hist = h;
     return hist;

Modified: hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestHFileHistogramE2E.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestHFileHistogramE2E.java?rev=1546432&r1=1546431&r2=1546432&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestHFileHistogramE2E.java (original)
+++ hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestHFileHistogramE2E.java Thu Nov 28 18:13:33 2013
@@ -27,8 +27,6 @@ public class TestHFileHistogramE2E {
   private static final byte[] TABLE =
       Bytes.toBytes("TestHFileHistogramE2ESingleStore");
   private static final byte[] FAMILY = Bytes.toBytes("family");
-  private static final byte[] TABLE2 =
-      Bytes.toBytes("TestHistogramSerDeE2E");
   private static final Log LOG = LogFactory.getLog(TestHFileHistogramE2E.class);
   private HBaseTestingUtility util = new HBaseTestingUtility();
   private final int numBuckets = 100;
@@ -72,6 +70,7 @@ public class TestHFileHistogramE2E {
 
   @Test
   public void testHistogramSerDeE2E() throws IOException {
+    byte[] TABLE2 = Bytes.toBytes("TestHistogramSerDeE2E");
     HTable table = util.createTable(TABLE2, FAMILY);
     util.loadTable(table, FAMILY);
     util.flush(TABLE2);
@@ -123,7 +122,7 @@ public class TestHFileHistogramE2E {
   public void testHistogramError() throws IOException {
     byte[] TABLE3 = Bytes.toBytes("testHistogramError");
     HTable table = util.createTable(TABLE3, FAMILY);
-    util.flush(TABLE2);
+    util.flush(TABLE3);
     Random r = new Random();
     int numEntries = 100000 + r.nextInt(100000);
     int expectedBucketCnt = numEntries/numBuckets;

Added: hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestNullData.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestNullData.java?rev=1546432&view=auto
==============================================================================
--- hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestNullData.java (added)
+++ hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/io/hfile/histogram/TestNullData.java Thu Nov 28 18:13:33 2013
@@ -0,0 +1,50 @@
+package org.apache.hadoop.hbase.io.hfile.histogram;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.io.hfile.histogram.HFileHistogram.Bucket;
+import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestNullData {
+  private static final byte[] TABLE =
+      Bytes.toBytes("TestHFileHistogramE2ESingleStore");
+  private static final byte[] FAMILY = Bytes.toBytes("family");
+  private HBaseTestingUtility util = new HBaseTestingUtility();
+  private final int numBuckets = 100;
+
+  @Before
+  public void setUp() throws Exception {
+    util.getConfiguration().setInt(HFileHistogram.HFILEHISTOGRAM_BINCOUNT,
+        numBuckets);
+    util.getConfiguration().setBoolean(HConstants.USE_HFILEHISTOGRAM, false);
+    util.startMiniCluster(3);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+  }
+
+  @Test
+  public void testNullData() throws IOException {
+    HTable table = util.createTable(TABLE, FAMILY);
+    util.loadTable(table, FAMILY);
+    util.flush(TABLE);
+    assertTrue(util.getHBaseCluster().getRegions(TABLE).size() == 1);
+    HRegion region = util.getHBaseCluster().getRegions(TABLE).get(0);
+    List<Bucket> hist = table.getHistogram(region.getStartKey());
+    assertTrue(hist == null);
+  }
+
+}