diff --git a/src/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java b/src/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java index 92a00fc..0ea290f 100644 --- a/src/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java +++ b/src/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java @@ -122,9 +122,8 @@ public class ScanQueryMatcher extends QueryMatcher { long timestamp = kv.getTimestamp(); if (isExpired(timestamp)) { - // done, the rest wil also be expired as well. - stickyNextRow = true; - return MatchCode.SEEK_NEXT_ROW; + // done, the rest of this column will also be expired as well. + return MatchCode.SEEK_NEXT_COL; } byte type = kv.getType(); diff --git a/src/test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java b/src/test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java index 8fb2cc1..74491f9 100644 --- a/src/test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java +++ b/src/test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java @@ -354,4 +354,46 @@ public class TestStoreScanner extends TestCase { results.clear(); assertEquals(false, scan.next(results)); } + + /** + * Test expiration of KeyValues in combination with a configured TTL for + * a column family (as should be triggered in a major compaction). + */ + public void testWildCardTtlScan() throws IOException { + long now = System.currentTimeMillis(); + KeyValue [] kvs = new KeyValue[] { + KeyValueTestUtil.create("R1", "cf", "a", now-1000, KeyValue.Type.Put, "dont-care"), + KeyValueTestUtil.create("R1", "cf", "b", now-10, KeyValue.Type.Put, "dont-care"), + KeyValueTestUtil.create("R1", "cf", "c", now-200, KeyValue.Type.Put, "dont-care"), + KeyValueTestUtil.create("R1", "cf", "d", now-10000, KeyValue.Type.Put, "dont-care"), + KeyValueTestUtil.create("R2", "cf", "a", now, KeyValue.Type.Put, "dont-care"), + KeyValueTestUtil.create("R2", "cf", "b", now-10, KeyValue.Type.Put, "dont-care"), + KeyValueTestUtil.create("R2", "cf", "c", now-200, KeyValue.Type.Put, "dont-care"), + KeyValueTestUtil.create("R2", "cf", "c", now-1000, KeyValue.Type.Put, "dont-care") + }; + KeyValueScanner [] scanners = new KeyValueScanner[] { + new KeyValueScanFixture(KeyValue.COMPARATOR, kvs) + }; + Scan scan = new Scan(); + scan.setMaxVersions(1); + StoreScanner scanner = + new StoreScanner(scan, CF, 500, KeyValue.COMPARATOR, + null, scanners); + + List results = new ArrayList(); + assertEquals(true, scanner.next(results)); + assertEquals(2, results.size()); + assertEquals(kvs[1], results.get(0)); + assertEquals(kvs[2], results.get(1)); + results.clear(); + + assertEquals(true, scanner.next(results)); + assertEquals(3, results.size()); + assertEquals(kvs[4], results.get(0)); + assertEquals(kvs[5], results.get(1)); + assertEquals(kvs[6], results.get(2)); + results.clear(); + + assertEquals(false, scanner.next(results)); + } }