HADOOP-2592 Scanning, a region can let out a row that its not supposed to have
git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk/src/contrib/hbase@612314 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b78012df61
commit
615fe2bbc7
|
@ -129,6 +129,8 @@ Trunk (unreleased changes)
|
||||||
previously (Bryan Duxbury via Stack)
|
previously (Bryan Duxbury via Stack)
|
||||||
HADOOP-2587 Splits blocked by compactions cause region to be offline for
|
HADOOP-2587 Splits blocked by compactions cause region to be offline for
|
||||||
duration of compaction.
|
duration of compaction.
|
||||||
|
HADOOP-2592 Scanning, a region can let out a row that its not supposed
|
||||||
|
to have
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
HADOOP-2401 Add convenience put method that takes writable
|
HADOOP-2401 Add convenience put method that takes writable
|
||||||
|
|
|
@ -737,7 +737,7 @@ public class HStoreFile implements HConstants {
|
||||||
static class HalfMapFileReader extends BloomFilterMapFile.Reader {
|
static class HalfMapFileReader extends BloomFilterMapFile.Reader {
|
||||||
private final boolean top;
|
private final boolean top;
|
||||||
private final WritableComparable midkey;
|
private final WritableComparable midkey;
|
||||||
private boolean topFirstNextCall = true;
|
private boolean firstNextCall = true;
|
||||||
|
|
||||||
HalfMapFileReader(final FileSystem fs, final String dirName,
|
HalfMapFileReader(final FileSystem fs, final String dirName,
|
||||||
final Configuration conf, final Range r,
|
final Configuration conf, final Range r,
|
||||||
|
@ -789,17 +789,32 @@ public class HStoreFile implements HConstants {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public synchronized WritableComparable getClosest(WritableComparable key,
|
public synchronized WritableComparable getClosest(WritableComparable key,
|
||||||
Writable val)
|
Writable val)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
WritableComparable closest = null;
|
||||||
if (top) {
|
if (top) {
|
||||||
if (key.compareTo(midkey) < 0) {
|
// If top, the lowest possible key is midkey. Do not have to check
|
||||||
return midkey;
|
// what comes back from super getClosest. Will return exact match or
|
||||||
|
// greater.
|
||||||
|
closest = (key.compareTo(this.midkey) < 0)?
|
||||||
|
this.midkey: super.getClosest(key, val);
|
||||||
|
} else {
|
||||||
|
// We're serving bottom of the file.
|
||||||
|
if (key.compareTo(this.midkey) < 0) {
|
||||||
|
// Check key is within range for bottom.
|
||||||
|
closest = super.getClosest(key, val);
|
||||||
|
// midkey was made against largest store file at time of split. Smaller
|
||||||
|
// store files could have anything in them. Check return value is
|
||||||
|
// not beyond the midkey (getClosest returns exact match or next
|
||||||
|
// after).
|
||||||
|
if (closest != null && closest.compareTo(this.midkey) >= 0) {
|
||||||
|
// Don't let this value out.
|
||||||
|
closest = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (key.compareTo(midkey) >= 0) {
|
// Else, key is > midkey so let out closest = null.
|
||||||
// Contract says return null if EOF.
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
return super.getClosest(key, val);
|
return closest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
|
@ -815,9 +830,19 @@ public class HStoreFile implements HConstants {
|
||||||
@Override
|
@Override
|
||||||
public synchronized boolean next(WritableComparable key, Writable val)
|
public synchronized boolean next(WritableComparable key, Writable val)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
if (top && topFirstNextCall) {
|
if (firstNextCall) {
|
||||||
topFirstNextCall = false;
|
firstNextCall = false;
|
||||||
return doFirstNextProcessing(key, val);
|
if (this.top) {
|
||||||
|
// Seek to midkey. Midkey may not exist in this file. That should be
|
||||||
|
// fine. Then we'll either be positioned at end or start of file.
|
||||||
|
WritableComparable nearest = getClosest(midkey, val);
|
||||||
|
// Now copy the mid key into the passed key.
|
||||||
|
if (nearest != null) {
|
||||||
|
Writables.copyWritable(nearest, key);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
boolean result = super.next(key, val);
|
boolean result = super.next(key, val);
|
||||||
if (!top && key.compareTo(midkey) >= 0) {
|
if (!top && key.compareTo(midkey) >= 0) {
|
||||||
|
@ -825,25 +850,12 @@ public class HStoreFile implements HConstants {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean doFirstNextProcessing(WritableComparable key, Writable val)
|
|
||||||
throws IOException {
|
|
||||||
// Seek to midkey. Midkey may not exist in this file. That should be
|
|
||||||
// fine. Then we'll either be positioned at end or start of file.
|
|
||||||
WritableComparable nearest = getClosest(midkey, val);
|
|
||||||
// Now copy the mid key into the passed key.
|
|
||||||
if (nearest != null) {
|
|
||||||
Writables.copyWritable(nearest, key);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public synchronized void reset() throws IOException {
|
public synchronized void reset() throws IOException {
|
||||||
if (top) {
|
if (top) {
|
||||||
topFirstNextCall = true;
|
firstNextCall = true;
|
||||||
seek(midkey);
|
seek(midkey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue