You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2013/03/31 06:36:52 UTC
svn commit: r1462880 - in /hbase/branches/0.94/src:
main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java
Author: tedyu
Date: Sun Mar 31 04:36:52 2013
New Revision: 1462880
URL: http://svn.apache.org/r1462880
Log:
HBASE-8152 Avoid creating empty reference file when splitkey is outside the key range of a store file (clockfly)
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java?rev=1462880&r1=1462879&r2=1462880&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java Sun Mar 31 04:36:52 2013
@@ -945,6 +945,30 @@ public class StoreFile extends SchemaCon
final byte [] splitRow,
final Reference.Range range)
throws IOException {
+
+ // Check whether the split row lies in the range of the store file
+ // If it is outside the range, return directly.
+ if (range == Reference.Range.bottom) {
+ //check if smaller than first key
+ KeyValue splitKey = KeyValue.createLastOnRow(splitRow);
+ byte[] firstKey = f.createReader().getFirstKey();
+ if (f.getReader().getComparator().compare(splitKey.getBuffer(),
+ splitKey.getKeyOffset(), splitKey.getKeyLength(),
+ firstKey, 0, firstKey.length) < 0) {
+ return null;
+ }
+ }
+ else {
+ //check if larger than last key.
+ KeyValue splitKey = KeyValue.createFirstOnRow(splitRow);
+ byte[] lastKey = f.createReader().getLastKey();
+ if (f.getReader().getComparator().compare(splitKey.getBuffer(),
+ splitKey.getKeyOffset(), splitKey.getKeyLength(),
+ lastKey, 0, lastKey.length) > 0) {
+ return null;
+ }
+ }
+
// A reference to the bottom half of the hsf store file.
Reference r = new Reference(splitRow, range);
// Add the referred-to regions name as a dot separated suffix.
Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java?rev=1462880&r1=1462879&r2=1462880&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java Sun Mar 31 04:36:52 2013
@@ -116,7 +116,7 @@ public class TestStoreFile extends HBase
}
// pick an split point (roughly halfway)
- byte[] SPLITKEY = new byte[] { (LAST_CHAR-FIRST_CHAR)/2, FIRST_CHAR};
+ byte[] SPLITKEY = new byte[] { (LAST_CHAR + FIRST_CHAR)/2, FIRST_CHAR};
/*
* Writes HStoreKey and ImmutableBytes data to passed writer and
@@ -315,6 +315,9 @@ public class TestStoreFile extends HBase
// Now confirm that I can read from the ref to link
HFileScanner sB = hsfB.createReader().getScanner(false, false);
sB.seekTo();
+
+ //count++ as seekTo() will advance the scanner
+ count++;
while (sB.next()) {
count++;
}
@@ -404,20 +407,12 @@ public class TestStoreFile extends HBase
topPath = StoreFile.split(this.fs, topDir, f, badmidkey, Range.top);
bottomPath = StoreFile.split(this.fs, bottomDir, f, badmidkey,
Range.bottom);
+
+ assertNull(bottomPath);
+
top = new StoreFile(this.fs, topPath, conf, cacheConf,
StoreFile.BloomType.NONE,
NoOpDataBlockEncoder.INSTANCE).createReader();
- bottom = new StoreFile(this.fs, bottomPath, conf, cacheConf,
- StoreFile.BloomType.NONE,
- NoOpDataBlockEncoder.INSTANCE).createReader();
- bottomScanner = bottom.getScanner(false, false);
- int count = 0;
- while ((!bottomScanner.isSeeked() && bottomScanner.seekTo()) ||
- bottomScanner.next()) {
- count++;
- }
- // When badkey is < than the bottom, should return no values.
- assertTrue(count == 0);
// Now read from the top.
first = true;
topScanner = top.getScanner(false, false);
@@ -444,16 +439,15 @@ public class TestStoreFile extends HBase
}
// Remove references.
this.fs.delete(topPath, false);
- this.fs.delete(bottomPath, false);
// Test when badkey is > than last key in file ('||' > 'zz').
badmidkey = Bytes.toBytes("|||");
topPath = StoreFile.split(this.fs, topDir, f, badmidkey, Range.top);
bottomPath = StoreFile.split(this.fs, bottomDir, f, badmidkey,
Range.bottom);
- top = new StoreFile(this.fs, topPath, conf, cacheConf,
- StoreFile.BloomType.NONE,
- NoOpDataBlockEncoder.INSTANCE).createReader();
+
+ assertNull(topPath);
+
bottom = new StoreFile(this.fs, bottomPath, conf, cacheConf,
StoreFile.BloomType.NONE,
NoOpDataBlockEncoder.INSTANCE).createReader();
@@ -477,14 +471,6 @@ public class TestStoreFile extends HBase
for (int i = 0; i < tmp.length(); i++) {
assertTrue(Bytes.toString(keyKV.getRow()).charAt(i) == 'z');
}
- count = 0;
- topScanner = top.getScanner(false, false);
- while ((!topScanner.isSeeked() && topScanner.seekTo()) ||
- (topScanner.isSeeked() && topScanner.next())) {
- count++;
- }
- // When badkey is < than the bottom, should return no values.
- assertTrue(count == 0);
} finally {
if (top != null) {
top.close(true); // evict since we are about to delete the file