diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java index 4005f38..24c8135 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java @@ -102,7 +102,7 @@ public class MultiRowRangeFilter extends FilterBase { } else { range = rangeList.get(0); } - if(EXCLUSIVE) { + if (EXCLUSIVE) { EXCLUSIVE = false; currentReturnCode = ReturnCode.NEXT_ROW; return false; @@ -115,7 +115,9 @@ public class MultiRowRangeFilter extends FilterBase { } initialized = true; } else { - currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT; + if (range.contains(buffer, offset, length)) { + currentReturnCode = ReturnCode.INCLUDE; + } else currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT; } } else { currentReturnCode = ReturnCode.INCLUDE; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java index 6bc089f..0c596aa 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.apache.commons.logging.Log; @@ -69,6 +70,24 @@ public class TestMultiRowRangeFilter { } @Test + public void testOutOfOrderScannerNextException() throws Exception { + MultiRowRangeFilter filter = new MultiRowRangeFilter(Arrays.asList( + new MultiRowRangeFilter.RowRange(Bytes.toBytes("b"), true, Bytes.toBytes("c"), true), + new MultiRowRangeFilter.RowRange(Bytes.toBytes("d"), true, Bytes.toBytes("e"), true) + )); + filter.filterRowKey(Bytes.toBytes("a"), 0, 1); + assertEquals(Filter.ReturnCode.SEEK_NEXT_USING_HINT, filter.filterKeyValue(null)); + filter.filterRowKey(Bytes.toBytes("b"), 0, 1); + assertEquals(Filter.ReturnCode.INCLUDE, filter.filterKeyValue(null)); + filter.filterRowKey(Bytes.toBytes("c"), 0, 1); + assertEquals(Filter.ReturnCode.INCLUDE, filter.filterKeyValue(null)); + filter.filterRowKey(Bytes.toBytes("d"), 0, 1); + assertEquals(Filter.ReturnCode.INCLUDE, filter.filterKeyValue(null)); + filter.filterRowKey(Bytes.toBytes("e"), 0, 1); + assertEquals(Filter.ReturnCode.INCLUDE, filter.filterKeyValue(null)); + } + + @Test public void testMergeAndSortWithEmptyStartRow() throws IOException { List ranges = new ArrayList(); ranges.add(new RowRange(Bytes.toBytes(""), true, Bytes.toBytes(20), false));