HBASE-5922 HalfStoreFileReader seekBefore causes StackOverflowError
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1337409 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ca56b0615e
commit
83ab15e2ed
|
@ -148,9 +148,10 @@ public class HalfStoreFileReader extends StoreFile.Reader {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// The equals sign isn't strictly necessary just here to be consistent with seekTo
|
||||||
if (getComparator().compare(key, offset, length, splitkey, 0,
|
if (getComparator().compare(key, offset, length, splitkey, 0,
|
||||||
splitkey.length) >= 0) {
|
splitkey.length) >= 0) {
|
||||||
return seekBefore(splitkey, 0, splitkey.length);
|
return this.delegate.seekBefore(splitkey, 0, splitkey.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return this.delegate.seekBefore(key, offset, length);
|
return this.delegate.seekBefore(key, offset, length);
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
|
|
||||||
package org.apache.hadoop.hbase.io;
|
package org.apache.hadoop.hbase.io;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -123,6 +125,89 @@ public class TestHalfStoreFileReader {
|
||||||
halfreader.close(true);
|
halfreader.close(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Tests the scanner on an HFile that is backed by HalfStoreFiles
|
||||||
|
@Test
|
||||||
|
public void testHalfScanner() throws IOException {
|
||||||
|
HBaseTestingUtility test_util = new HBaseTestingUtility();
|
||||||
|
String root_dir = test_util.getDataTestDir("TestHalfStoreFileScanBefore").toString();
|
||||||
|
Path p = new Path(root_dir, "test");
|
||||||
|
Configuration conf = test_util.getConfiguration();
|
||||||
|
FileSystem fs = FileSystem.get(conf);
|
||||||
|
CacheConfig cacheConf = new CacheConfig(conf);
|
||||||
|
|
||||||
|
HFile.Writer w = HFile.getWriterFactory(conf, cacheConf)
|
||||||
|
.withPath(fs, p)
|
||||||
|
.withBlockSize(1024)
|
||||||
|
.withComparator(KeyValue.KEY_COMPARATOR)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
// write some things.
|
||||||
|
List<KeyValue> items = genSomeKeys();
|
||||||
|
for (KeyValue kv : items) {
|
||||||
|
w.append(kv);
|
||||||
|
}
|
||||||
|
w.close();
|
||||||
|
|
||||||
|
|
||||||
|
HFile.Reader r = HFile.createReader(fs, p, cacheConf);
|
||||||
|
r.loadFileInfo();
|
||||||
|
byte[] midkey = r.midkey();
|
||||||
|
KeyValue midKV = KeyValue.createKeyValueFromKey(midkey);
|
||||||
|
midkey = midKV.getRow();
|
||||||
|
|
||||||
|
Reference bottom = new Reference(midkey, Reference.Range.bottom);
|
||||||
|
Reference top = new Reference(midkey, Reference.Range.top);
|
||||||
|
|
||||||
|
// Ugly code to get the item before the midkey
|
||||||
|
KeyValue beforeMidKey = null;
|
||||||
|
for (KeyValue item : items) {
|
||||||
|
if (item.equals(midKV)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
beforeMidKey = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Seek on the splitKey, should be in top, not in bottom
|
||||||
|
KeyValue foundKeyValue = doTestOfSeekBefore(p, fs, bottom, midKV, cacheConf);
|
||||||
|
assertEquals(beforeMidKey, foundKeyValue);
|
||||||
|
|
||||||
|
// Seek tot the last thing should be the penultimate on the top, the one before the midkey on the bottom.
|
||||||
|
foundKeyValue = doTestOfSeekBefore(p, fs, top, items.get(items.size() - 1), cacheConf);
|
||||||
|
assertEquals(items.get(items.size() - 2), foundKeyValue);
|
||||||
|
|
||||||
|
foundKeyValue = doTestOfSeekBefore(p, fs, bottom, items.get(items.size() - 1), cacheConf);
|
||||||
|
assertEquals(beforeMidKey, foundKeyValue);
|
||||||
|
|
||||||
|
// Try and seek before something that is in the bottom.
|
||||||
|
foundKeyValue = doTestOfSeekBefore(p, fs, top, items.get(0), cacheConf);
|
||||||
|
assertNull(foundKeyValue);
|
||||||
|
|
||||||
|
// Try and seek before the first thing.
|
||||||
|
foundKeyValue = doTestOfSeekBefore(p, fs, bottom, items.get(0), cacheConf);
|
||||||
|
assertNull(foundKeyValue);
|
||||||
|
|
||||||
|
// Try and seek before the second thing in the top and bottom.
|
||||||
|
foundKeyValue = doTestOfSeekBefore(p, fs, top, items.get(1), cacheConf);
|
||||||
|
assertNull(foundKeyValue);
|
||||||
|
|
||||||
|
foundKeyValue = doTestOfSeekBefore(p, fs, bottom, items.get(1), cacheConf);
|
||||||
|
assertEquals(items.get(0), foundKeyValue);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private KeyValue doTestOfSeekBefore(Path p, FileSystem fs, Reference bottom, KeyValue seekBefore,
|
||||||
|
CacheConfig cacheConfig)
|
||||||
|
throws IOException {
|
||||||
|
final HalfStoreFileReader halfreader = new HalfStoreFileReader(fs, p,
|
||||||
|
cacheConfig, bottom, DataBlockEncoding.NONE);
|
||||||
|
halfreader.loadFileInfo();
|
||||||
|
final HFileScanner scanner = halfreader.getScanner(false, false);
|
||||||
|
scanner.seekBefore(seekBefore.getKey());
|
||||||
|
return scanner.getKeyValue();
|
||||||
|
}
|
||||||
|
|
||||||
private KeyValue getLastOnCol(KeyValue curr) {
|
private KeyValue getLastOnCol(KeyValue curr) {
|
||||||
return KeyValue.createLastOnRow(
|
return KeyValue.createLastOnRow(
|
||||||
curr.getBuffer(), curr.getRowOffset(), curr.getRowLength(),
|
curr.getBuffer(), curr.getRowOffset(), curr.getRowLength(),
|
||||||
|
|
Loading…
Reference in New Issue