You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2012/10/01 19:35:18 UTC
svn commit: r1392459 - in /hbase/branches/0.94/src:
main/java/org/apache/hadoop/hbase/regionserver/Store.java
test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat.java
Author: jxiang
Date: Mon Oct 1 17:35:17 2012
New Revision: 1392459
URL: http://svn.apache.org/viewvc?rev=1392459&view=rev
Log:
HBASE-6901 Store file compactSelection throws ArrayIndexOutOfBoundsException
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat.java
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java?rev=1392459&r1=1392458&r2=1392459&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java Mon Oct 1 17:35:17 2012
@@ -1402,6 +1402,15 @@ public class Store extends SchemaConfigu
int start = 0;
double r = compactSelection.getCompactSelectionRatio();
+ // remove bulk import files that request to be excluded from minors
+ compactSelection.getFilesToCompact().removeAll(Collections2.filter(
+ compactSelection.getFilesToCompact(),
+ new Predicate<StoreFile>() {
+ public boolean apply(StoreFile input) {
+ return input.excludeFromMinorCompaction();
+ }
+ }));
+
// skip selection algorithm if we don't have enough files
if (compactSelection.getFilesToCompact().size() < this.minFilesToCompact) {
if(LOG.isDebugEnabled()) {
@@ -1413,15 +1422,6 @@ public class Store extends SchemaConfigu
return compactSelection;
}
- // remove bulk import files that request to be excluded from minors
- compactSelection.getFilesToCompact().removeAll(Collections2.filter(
- compactSelection.getFilesToCompact(),
- new Predicate<StoreFile>() {
- public boolean apply(StoreFile input) {
- return input.excludeFromMinorCompaction();
- }
- }));
-
/* TODO: add sorting + unit test back in when HBASE-2856 is fixed
// Sort files by size to correct when normal skew is altered by bulk load.
Collections.sort(filesToCompact, StoreFile.Comparators.FILE_SIZE);
Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat.java?rev=1392459&r1=1392458&r2=1392459&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat.java Mon Oct 1 17:35:17 2012
@@ -686,12 +686,85 @@ public class TestHFileOutputFormat {
}
}
+ /**
+ * This test is to test the scenario happened in HBASE-6901.
+ * All files are bulk loaded and excluded from minor compaction.
+ * Without the fix of HBASE-6901, an ArrayIndexOutOfBoundsException
+ * will be thrown.
+ */
+ @Test
+ public void testExcludeAllFromMinorCompaction() throws Exception {
+ Configuration conf = util.getConfiguration();
+ conf.setInt("hbase.hstore.compaction.min", 2);
+ generateRandomStartKeys(5);
+
+ try {
+ util.startMiniCluster();
+ final FileSystem fs = util.getDFSCluster().getFileSystem();
+ HBaseAdmin admin = new HBaseAdmin(conf);
+ HTable table = util.createTable(TABLE_NAME, FAMILIES);
+ assertEquals("Should start with empty table", 0, util.countRows(table));
+
+ // deep inspection: get the StoreFile dir
+ final Path storePath = Store.getStoreHomedir(
+ HTableDescriptor.getTableDir(FSUtils.getRootDir(conf), TABLE_NAME),
+ admin.getTableRegions(TABLE_NAME).get(0).getEncodedName(),
+ FAMILIES[0]);
+ assertEquals(0, fs.listStatus(storePath).length);
+
+ // Generate two bulk load files
+ conf.setBoolean("hbase.mapreduce.hfileoutputformat.compaction.exclude",
+ true);
+ util.startMiniMapReduceCluster();
+
+ for (int i = 0; i < 2; i++) {
+ Path testDir = util.getDataTestDir("testExcludeAllFromMinorCompaction_" + i);
+ runIncrementalPELoad(conf, table, testDir);
+ // Perform the actual load
+ new LoadIncrementalHFiles(conf).doBulkLoad(testDir, table);
+ }
+
+ // Ensure data shows up
+ int expectedRows = 2 * NMapInputFormat.getNumMapTasks(conf) * ROWSPERSPLIT;
+ assertEquals("LoadIncrementalHFiles should put expected data in table",
+ expectedRows, util.countRows(table));
+
+ // should have a second StoreFile now
+ assertEquals(2, fs.listStatus(storePath).length);
+
+ // minor compactions shouldn't get rid of the file
+ admin.compact(TABLE_NAME);
+ try {
+ quickPoll(new Callable<Boolean>() {
+ public Boolean call() throws Exception {
+ return fs.listStatus(storePath).length == 1;
+ }
+ }, 5000);
+ throw new IOException("SF# = " + fs.listStatus(storePath).length);
+ } catch (AssertionError ae) {
+ // this is expected behavior
+ }
+
+ // a major compaction should work though
+ admin.majorCompact(TABLE_NAME);
+ quickPoll(new Callable<Boolean>() {
+ public Boolean call() throws Exception {
+ return fs.listStatus(storePath).length == 1;
+ }
+ }, 5000);
+
+ } finally {
+ util.shutdownMiniMapReduceCluster();
+ util.shutdownMiniCluster();
+ }
+ }
+
@Test
public void testExcludeMinorCompaction() throws Exception {
Configuration conf = util.getConfiguration();
conf.setInt("hbase.hstore.compaction.min", 2);
Path testDir = util.getDataTestDir("testExcludeMinorCompaction");
- byte[][] startKeys = generateRandomStartKeys(5);
+ generateRandomStartKeys(5);
try {
util.startMiniCluster();