HBASE-13704 Hbase throws OutOfOrderScannerNextException when MultiRowRangeFilter is used (Aleksandr Maksymenko)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/13257379 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/13257379 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/13257379 Branch: refs/heads/hbase-12439 Commit: 132573792dc4947f2d7846f9e8093c9227c189da Parents: 0ef4a10 Author: tedyu <[email protected]> Authored: Tue May 19 20:22:53 2015 -0700 Committer: tedyu <[email protected]> Committed: Tue May 19 20:22:53 2015 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/filter/MultiRowRangeFilter.java | 6 ++++-- .../hbase/filter/TestMultiRowRangeFilter.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/13257379/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java ---------------------------------------------------------------------- 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; http://git-wip-us.apache.org/repos/asf/hbase/blob/13257379/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java ---------------------------------------------------------------------- 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<RowRange> ranges = new ArrayList<RowRange>(); ranges.add(new RowRange(Bytes.toBytes(""), true, Bytes.toBytes(20), false));
