Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1584126) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -3636,7 +3636,7 @@ // KeyValue indicating that limit is reached when scanning private final KeyValue KV_LIMIT = new KeyValue(); protected final byte[] stopRow; - private final Filter filter; + private final FilterWrapper filter; private int batch; protected int isScan; private boolean filterClosed = false; @@ -3914,16 +3914,15 @@ stopRow = nextKv == null || isStopRow(nextKv.getRowArray(), nextKv.getRowOffset(), nextKv.getRowLength()); - // save that the row was empty before filters applied to it. - final boolean isEmptyRow = results.isEmpty(); // We have the part of the row necessary for filtering (all of it, usually). // First filter with the filterRow(List). + FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED; if (filter != null && filter.hasFilterRow()) { - filter.filterRowCells(results); + ret = filter.filterRowCellsWithRet(results); } - if (isEmptyRow || filterRow()) { + if ((results.isEmpty() && ret != FilterWrapper.FilterRowRetCode.INCLUDE) || filterRow()) { results.clear(); boolean moreRows = nextRow(currentRow, offset, length); if (!moreRows) return false; Index: hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterWrapper.java =================================================================== --- hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterWrapper.java (revision 1584126) +++ hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterWrapper.java (working copy) @@ -154,15 +154,29 @@ @Override public void filterRowCells(List kvs) throws IOException { + filterRowCellsWithRet(kvs); + } + + public enum FilterRowRetCode { + NOT_CALLED, + INCLUDE, + EXCLUDE + } + public FilterRowRetCode filterRowCellsWithRet(List kvs) throws IOException { //To fix HBASE-6429, //Filter with filterRow() returning true is incompatible with scan with limit //1. hasFilterRow() returns true, if either filterRow() or filterRow(kvs) is implemented. //2. filterRow() is merged with filterRow(kvs), //so that to make all those row related filtering stuff in the same function. this.filter.filterRowCells(kvs); - if (!kvs.isEmpty() && this.filter.filterRow()) { - kvs.clear(); + if (!kvs.isEmpty()) { + if (this.filter.filterRow()) { + kvs.clear(); + return FilterRowRetCode.EXCLUDE; + } + return FilterRowRetCode.INCLUDE; } + return FilterRowRetCode.NOT_CALLED; } /**