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.client.Scan;
|
||||||
import org.apache.hadoop.hbase.fs.HFileSystem;
|
import org.apache.hadoop.hbase.fs.HFileSystem;
|
||||||
import org.apache.hadoop.hbase.io.HFileLink;
|
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.CacheConfig;
|
||||||
import org.apache.hadoop.hbase.io.hfile.Compression;
|
import org.apache.hadoop.hbase.io.hfile.Compression;
|
||||||
import org.apache.hadoop.hbase.io.hfile.HFile;
|
import org.apache.hadoop.hbase.io.hfile.HFile;
|
||||||
|
@ -1420,6 +1419,15 @@ public class HStore extends SchemaConfigured implements Store {
|
||||||
int start = 0;
|
int start = 0;
|
||||||
double r = compactSelection.getCompactSelectionRatio();
|
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
|
// skip selection algorithm if we don't have enough files
|
||||||
if (compactSelection.getFilesToCompact().size() < this.minFilesToCompact) {
|
if (compactSelection.getFilesToCompact().size() < this.minFilesToCompact) {
|
||||||
if(LOG.isDebugEnabled()) {
|
if(LOG.isDebugEnabled()) {
|
||||||
|
@ -1431,15 +1439,6 @@ public class HStore extends SchemaConfigured implements Store {
|
||||||
return compactSelection;
|
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
|
/* 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.
|
// Sort files by size to correct when normal skew is altered by bulk load.
|
||||||
Collections.sort(filesToCompact, StoreFile.Comparators.FILE_SIZE);
|
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
|
@Test
|
||||||
public void testExcludeMinorCompaction() throws Exception {
|
public void testExcludeMinorCompaction() throws Exception {
|
||||||
Configuration conf = util.getConfiguration();
|
Configuration conf = util.getConfiguration();
|
||||||
conf.setInt("hbase.hstore.compaction.min", 2);
|
conf.setInt("hbase.hstore.compaction.min", 2);
|
||||||
Path testDir = util.getDataTestDir("testExcludeMinorCompaction");
|
Path testDir = util.getDataTestDir("testExcludeMinorCompaction");
|
||||||
byte[][] startKeys = generateRandomStartKeys(5);
|
generateRandomStartKeys(5);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
util.startMiniCluster();
|
util.startMiniCluster();
|
||||||
|
|
Loading…
Reference in New Issue