HBASE-6901 Store file compactSelection throws ArrayIndexOutOfBoundsException
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1392451 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9a1dbdef9d
commit
7b640037fb
|
@ -54,7 +54,6 @@ import org.apache.hadoop.hbase.backup.HFileArchiver;
|
|||
import org.apache.hadoop.hbase.client.Scan;
|
||||
import org.apache.hadoop.hbase.fs.HFileSystem;
|
||||
import org.apache.hadoop.hbase.io.HFileLink;
|
||||
import org.apache.hadoop.hbase.io.HeapSize;
|
||||
import org.apache.hadoop.hbase.io.hfile.CacheConfig;
|
||||
import org.apache.hadoop.hbase.io.hfile.Compression;
|
||||
import org.apache.hadoop.hbase.io.hfile.HFile;
|
||||
|
@ -1420,6 +1419,15 @@ public class HStore extends SchemaConfigured implements Store {
|
|||
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()) {
|
||||
|
@ -1431,15 +1439,6 @@ public class HStore extends SchemaConfigured implements Store {
|
|||
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);
|
||||
|
|
|
@ -671,12 +671,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 = HStore.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();
|
||||
|
|
Loading…
Reference in New Issue