HBASE-13704 Hbase throws OutOfOrderScannerNextException when MultiRowRangeFilter is used (Aleksandr Maksymenko)

This commit is contained in:
tedyu 2015-05-19 20:22:53 -07:00
parent 0ef4a10882
commit 132573792d
2 changed files with 23 additions and 2 deletions

View File

@ -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;

View File

@ -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;
@ -68,6 +69,24 @@ public class TestMultiRowRangeFilter {
TEST_UTIL.shutdownMiniCluster();
}
@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>();