HBASE-10366: 0.94 filterRow() may be skipped in 0.96(or onwards) code
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1559547 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
fa298a9573
commit
8eeb7f3d9a
|
@ -3880,10 +3880,12 @@ public class HRegion implements HeapSize { // , Writable{
|
||||||
if (filter != null && filter.hasFilterRow()) {
|
if (filter != null && filter.hasFilterRow()) {
|
||||||
filter.filterRowCells(results);
|
filter.filterRowCells(results);
|
||||||
}
|
}
|
||||||
if (isEmptyRow) {
|
|
||||||
|
if (isEmptyRow || filterRow()) {
|
||||||
|
results.clear();
|
||||||
boolean moreRows = nextRow(currentRow, offset, length);
|
boolean moreRows = nextRow(currentRow, offset, length);
|
||||||
if (!moreRows) return false;
|
if (!moreRows) return false;
|
||||||
results.clear();
|
|
||||||
// This row was totally filtered out, if this is NOT the last row,
|
// This row was totally filtered out, if this is NOT the last row,
|
||||||
// we should continue on. Otherwise, nothing else to do.
|
// we should continue on. Otherwise, nothing else to do.
|
||||||
if (!stopRow) continue;
|
if (!stopRow) continue;
|
||||||
|
@ -3933,6 +3935,20 @@ public class HRegion implements HeapSize { // , Writable{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is to maintain backward compatibility for 0.94 filters. HBASE-6429 combines
|
||||||
|
* both filterRow & filterRow(List<KeyValue> kvs) functions. While 0.94 code or older, it may
|
||||||
|
* not implement hasFilterRow as HBase-6429 expects because 0.94 hasFilterRow() only returns
|
||||||
|
* true when filterRow(List<KeyValue> kvs) is overridden not the filterRow(). Therefore, the
|
||||||
|
* filterRow() will be skipped.
|
||||||
|
*/
|
||||||
|
private boolean filterRow() throws IOException {
|
||||||
|
// when hasFilterRow returns true, filter.filterRow() will be called automatically inside
|
||||||
|
// filterRowCells(List<Cell> kvs) so we skip that scenario here.
|
||||||
|
return filter != null && (!filter.hasFilterRow())
|
||||||
|
&& filter.filterRow();
|
||||||
|
}
|
||||||
|
|
||||||
private boolean filterRowKey(byte[] row, int offset, short length) throws IOException {
|
private boolean filterRowKey(byte[] row, int offset, short length) throws IOException {
|
||||||
return filter != null
|
return filter != null
|
||||||
&& filter.filterRowKey(row, offset, length);
|
&& filter.filterRowKey(row, offset, length);
|
||||||
|
|
|
@ -579,6 +579,47 @@ public class TestFilter {
|
||||||
assertEquals("The page filter returned more rows than expected", pageSize, scannerCounter);
|
assertEquals("The page filter returned more rows than expected", pageSize, scannerCounter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following filter simulates a pre-0.96 filter where filterRow() is defined while
|
||||||
|
* hasFilterRow() returns false
|
||||||
|
*/
|
||||||
|
static class OldTestFilter extends FilterBase {
|
||||||
|
@Override
|
||||||
|
public byte [] toByteArray() {return null;}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasFilterRow() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean filterRow() {
|
||||||
|
// always filter out rows
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following test is to ensure old(such as hbase0.94) filterRow() can be correctly fired in
|
||||||
|
* 0.96+ code base.
|
||||||
|
*
|
||||||
|
* See HBASE-10366
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void tes94FilterRowCompatibility() throws Exception {
|
||||||
|
Scan s = new Scan();
|
||||||
|
OldTestFilter filter = new OldTestFilter();
|
||||||
|
s.setFilter(filter);
|
||||||
|
|
||||||
|
InternalScanner scanner = this.region.getScanner(s);
|
||||||
|
ArrayList<Cell> values = new ArrayList<Cell>();
|
||||||
|
scanner.next(values);
|
||||||
|
assertTrue("All rows should be filtered out", values.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests the the {@link WhileMatchFilter} works in combination with a
|
* Tests the the {@link WhileMatchFilter} works in combination with a
|
||||||
* {@link Filter} that uses the
|
* {@link Filter} that uses the
|
||||||
|
|
Loading…
Reference in New Issue