diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java index 2cf9fe04cf30..88308326705d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java @@ -161,7 +161,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner /** An internal constructor. */ private StoreScanner(HStore store, Scan scan, ScanInfo scanInfo, int numColumns, long readPt, - boolean cacheBlocks, ScanType scanType) { + boolean cacheBlocks, ScanType scanType, Long timeStampOrigin) { this.readPt = readPt; this.store = store; this.cacheBlocks = cacheBlocks; @@ -170,7 +170,11 @@ private StoreScanner(HStore store, Scan scan, ScanInfo scanInfo, int numColumns, explicitColumnQuery = numColumns > 0; this.scan = scan; this.now = EnvironmentEdgeManager.currentTime(); - this.oldestUnexpiredTS = scan.isRaw() ? 0L : now - scanInfo.getTtl(); + if (timeStampOrigin == null) { + this.oldestUnexpiredTS = scan.isRaw() ? 0L : now - scanInfo.getTtl(); + } else { + this.oldestUnexpiredTS = timeStampOrigin - scanInfo.getTtl(); + } this.minVersions = scanInfo.getMinVersions(); // We look up row-column Bloom filters for multi-column queries as part of @@ -215,6 +219,11 @@ private StoreScanner(HStore store, Scan scan, ScanInfo scanInfo, int numColumns, } } } + + private StoreScanner(HStore store, Scan scan, ScanInfo scanInfo, int numColumns, long readPt, + boolean cacheBlocks, ScanType scanType) { + this(store, scan, scanInfo, numColumns, readPt, cacheBlocks, scanType, null); + } private void addCurrentScanners(List scanners) { this.currentScanners.addAll(scanners); @@ -357,6 +366,17 @@ public StoreScanner(ScanInfo scanInfo, ScanType scanType, seekAllScanner(scanInfo, scanners); } + // Almost the same as below except for settting the start time of oldestUnexpiredTS + StoreScanner(Scan scan, ScanInfo scanInfo, NavigableSet columns, + List scanners, Long timeStampOrigin) throws IOException { + // 0 is passed as readpoint because the test bypasses Store + this(null, scan, scanInfo, columns != null ? columns.size() : 0, 0L, + scan.getCacheBlocks(), ScanType.USER_SCAN, timeStampOrigin); + this.matcher = + UserScanQueryMatcher.create(scan, scanInfo, columns, oldestUnexpiredTS, now, null); + seekAllScanner(scanInfo, scanners); + } + // Used to instantiate a scanner for user scan in test StoreScanner(Scan scan, ScanInfo scanInfo, NavigableSet columns, List scanners) throws IOException { 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 c1843e306f1b..056f9fc62d10 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 @@ -874,7 +874,7 @@ public void testWildCardTtlScan() throws IOException { scan.readVersions(1); ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, 1, 500, KeepDeletedCells.FALSE, HConstants.DEFAULT_BLOCKSIZE, 0, CellComparator.getInstance(), false); - try (StoreScanner scanner = new StoreScanner(scan, scanInfo, null, scanners)) { + try (StoreScanner scanner = new StoreScanner(scan, scanInfo, null, scanners, now)) { List results = new ArrayList<>(); assertEquals(true, scanner.next(results)); assertEquals(2, results.size());