From 4c42d1b2e4431185da74595ab339d118ff69953a Mon Sep 17 00:00:00 2001 From: bsglz <18031031@qq.com> Date: Thu, 30 Apr 2020 16:21:37 +0800 Subject: [PATCH] =?UTF-8?q?HBASE-22710=20Wrong=20result=20in=20one=20case?= =?UTF-8?q?=20of=20scan=20that=20use=20raw=20and=20version=E2=80=A6=20(#76?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: stack Signed-off-by: Duo Zhang Signed-off-by: Viraj Jasani --- .../querymatcher/ScanQueryMatcher.java | 3 +- .../hbase/regionserver/TestStoreScanner.java | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.java index c164afdafdee..96d3bab61490 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.java @@ -372,10 +372,11 @@ protected static Pair getTrackers(RegionCoprocesso if (userScan != null) { if (userScan.isRaw()) { resultMaxVersion = userScan.getMaxVersions(); + maxVersionToCheck = userScan.hasFilter() ? Integer.MAX_VALUE : resultMaxVersion; } else { resultMaxVersion = Math.min(userScan.getMaxVersions(), scanInfo.getMaxVersions()); + maxVersionToCheck = userScan.hasFilter() ? scanInfo.getMaxVersions() : resultMaxVersion; } - maxVersionToCheck = userScan.hasFilter() ? scanInfo.getMaxVersions() : resultMaxVersion; } DeleteTracker deleteTracker; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java index e5d714b045c6..29aab41f70e8 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java @@ -38,6 +38,7 @@ import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellComparator; import org.apache.hadoop.hbase.CellUtil; +import org.apache.hadoop.hbase.CompareOperator; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HBaseTestingUtility; @@ -47,8 +48,11 @@ import org.apache.hadoop.hbase.PrivateCellUtil; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.filter.BinaryComparator; import org.apache.hadoop.hbase.filter.ColumnCountGetFilter; import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.filter.QualifierFilter; import org.apache.hadoop.hbase.testclassification.RegionServerTests; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.EnvironmentEdge; @@ -976,4 +980,30 @@ public void testPreadNotEnabledForCompactionStoreScanners() throws Exception { assertFalse(storeScanner.isScanUsePread()); } } + + @Test + public void testReadVersionWithRawAndFilter() throws IOException { + ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, 1, Long.MAX_VALUE, + KeepDeletedCells.FALSE, HConstants.DEFAULT_BLOCKSIZE, 0 + , CellComparator.getInstance(), false); + KeyValue [] kvs = new KeyValue[] { + create("R1", "cf", "a", 3, KeyValue.Type.Put, "dont-care"), + create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"), + create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care") + }; + List scanners = Arrays.asList( + new KeyValueScanner[]{ + new KeyValueScanFixture(CellComparator.getInstance(), kvs) + }); + + BinaryComparator comp = new BinaryComparator(Bytes.toBytes("a")); + Filter filter = new QualifierFilter(CompareOperator.EQUAL, comp); + Scan scanSpec = new Scan().withStartRow(Bytes.toBytes("R1")).readVersions(2).setRaw(true); + scanSpec.setFilter(filter); + try (StoreScanner scan = new StoreScanner(scanSpec, scanInfo, null, scanners)) { + List results = new ArrayList<>(); + assertEquals(true, scan.next(results)); + assertEquals(2, results.size()); + } + } }