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);
+ }
+
+}