in hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java [99:282]
protected HFileScanner getScanner(final boolean cacheBlocks, final boolean pread,
final boolean isCompaction) {
final HFileScanner s = super.getScanner(cacheBlocks, pread, isCompaction);
return new HFileScanner() {
final HFileScanner delegate = s;
public boolean atEnd = false;
@Override
public ExtendedCell getKey() {
if (atEnd) {
return null;
}
return delegate.getKey();
}
@Override
public ByteBuffer getValue() {
if (atEnd) {
return null;
}
return delegate.getValue();
}
@Override
public ExtendedCell getCell() {
if (atEnd) {
return null;
}
return delegate.getCell();
}
@Override
public boolean next() throws IOException {
if (atEnd) return false;
boolean b = delegate.next();
if (!b) {
return b;
}
// constrain the bottom.
if (!top) {
if (getComparator().compare(splitCell, getKey()) <= 0) {
atEnd = true;
return false;
}
}
return true;
}
@Override
public boolean seekTo() throws IOException {
if (top) {
int r = this.delegate.seekTo(splitCell);
if (r == HConstants.INDEX_KEY_MAGIC) {
return true;
}
if (r < 0) {
// midkey is < first key in file
return this.delegate.seekTo();
}
if (r > 0) {
return this.delegate.next();
}
return true;
}
boolean b = delegate.seekTo();
if (!b) {
return b;
}
// Check key.
return (this.delegate.getReader().getComparator().compare(splitCell, getKey())) > 0;
}
@Override
public org.apache.hadoop.hbase.io.hfile.HFile.Reader getReader() {
return this.delegate.getReader();
}
@Override
public boolean isSeeked() {
return this.delegate.isSeeked();
}
@Override
public int seekTo(ExtendedCell key) throws IOException {
if (top) {
if (PrivateCellUtil.compareKeyIgnoresMvcc(getComparator(), key, splitCell) < 0) {
return -1;
}
} else {
if (PrivateCellUtil.compareKeyIgnoresMvcc(getComparator(), key, splitCell) >= 0) {
// we would place the scanner in the second half.
// it might be an error to return false here ever...
boolean res = delegate.seekBefore(splitCell);
if (!res) {
throw new IOException(
"Seeking for a key in bottom of file, but key exists in top of file, "
+ "failed on seekBefore(midkey)");
}
return 1;
}
}
return delegate.seekTo(key);
}
@Override
public int reseekTo(ExtendedCell key) throws IOException {
// This function is identical to the corresponding seekTo function
// except that we call reseekTo (and not seekTo) on the delegate.
if (top) {
if (PrivateCellUtil.compareKeyIgnoresMvcc(getComparator(), key, splitCell) < 0) {
return -1;
}
} else {
if (PrivateCellUtil.compareKeyIgnoresMvcc(getComparator(), key, splitCell) >= 0) {
// we would place the scanner in the second half.
// it might be an error to return false here ever...
boolean res = delegate.seekBefore(splitCell);
if (!res) {
throw new IOException("Seeking for a key in bottom of file, but"
+ " key exists in top of file, failed on seekBefore(midkey)");
}
return 1;
}
}
if (atEnd) {
// skip the 'reseek' and just return 1.
return 1;
}
return delegate.reseekTo(key);
}
@Override
public boolean seekBefore(ExtendedCell key) throws IOException {
if (top) {
Optional<ExtendedCell> fk = getFirstKey();
if (
fk.isPresent()
&& PrivateCellUtil.compareKeyIgnoresMvcc(getComparator(), key, fk.get()) <= 0
) {
return false;
}
} else {
// The equals sign isn't strictly necessary just here to be consistent
// with seekTo
if (PrivateCellUtil.compareKeyIgnoresMvcc(getComparator(), key, splitCell) >= 0) {
boolean ret = this.delegate.seekBefore(splitCell);
if (ret) {
atEnd = false;
}
return ret;
}
}
boolean ret = this.delegate.seekBefore(key);
if (ret) {
atEnd = false;
}
return ret;
}
@Override
public ExtendedCell getNextIndexedKey() {
return null;
}
@Override
public void close() {
this.delegate.close();
}
@Override
public void shipped() throws IOException {
this.delegate.shipped();
}
@Override
public void recordBlockSize(IntConsumer blockSizeConsumer) {
this.delegate.recordBlockSize(blockSizeConsumer);
}
};
}