Index: src/test/java/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java (revision 1532811) +++ src/test/java/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java (working copy) @@ -47,7 +47,7 @@ List scannerColumns, List expected) throws IOException { ColumnTracker exp = new ExplicitColumnTracker( - trackColumns, 0, maxVersions, Long.MIN_VALUE); + trackColumns, 0, maxVersions, maxVersions, Long.MIN_VALUE); //Initialize result @@ -81,9 +81,9 @@ columns.add(col2); columns.add(col4); List expected = new ArrayList(); - expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_COL); // col1 + expected.add(ScanQueryMatcher.MatchCode.SKIP); // col1 expected.add(ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_COL); // col2 - expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_COL); // col3 + expected.add(ScanQueryMatcher.MatchCode.SKIP); // col3 expected.add(ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_ROW); // col4 expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_ROW); // col5 int maxVersions = 1; @@ -97,8 +97,35 @@ scanner.add(col5); runTest(maxVersions, columns, scanner, expected); - } + // test with multiple versions in store and 1 version in tracker + scanner = new ArrayList(); + scanner.add(col1); + scanner.add(col1); + scanner.add(col2); + scanner.add(col2); + scanner.add(col3); + scanner.add(col3); + scanner.add(col4); + scanner.add(col4); + scanner.add(col5); + scanner.add(col5); + + expected = new ArrayList(); + expected.add(ScanQueryMatcher.MatchCode.SKIP); // col1 + expected.add(ScanQueryMatcher.MatchCode.SKIP); // col1 + expected.add(ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_COL); // col2 + expected.add(ScanQueryMatcher.MatchCode.SKIP); // col2 + expected.add(ScanQueryMatcher.MatchCode.SKIP); // col3 + expected.add(ScanQueryMatcher.MatchCode.SKIP); // col3 + expected.add(ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_ROW); // col4 + expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_ROW); // col4 + expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_ROW); // col5 + expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_ROW); // col5 + + runTest(maxVersions, columns, scanner, expected); +} + public void testGet_MultiVersion() throws IOException{ if(PRINT){ System.out.println("\nMultiVersion"); @@ -165,7 +192,7 @@ columns.add(Bytes.toBytes("col"+i)); } - ColumnTracker explicit = new ExplicitColumnTracker(columns, 0, maxVersions, + ColumnTracker explicit = new ExplicitColumnTracker(columns, 0, maxVersions, maxVersions, Long.MIN_VALUE); for (int i = 0; i < 100000; i+=2) { byte [] col = Bytes.toBytes("col"+i); @@ -192,8 +219,8 @@ new byte[][] { col1, col4 }); List expected = Arrays.asList( new ScanQueryMatcher.MatchCode[] { - ScanQueryMatcher.MatchCode.SEEK_NEXT_COL, - ScanQueryMatcher.MatchCode.SEEK_NEXT_COL }); + ScanQueryMatcher.MatchCode.SKIP, + ScanQueryMatcher.MatchCode.SKIP }); runTest(1, columns, scanner, expected); } Index: src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java (revision 1532811) +++ src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java (working copy) @@ -176,8 +176,8 @@ // We can share the ExplicitColumnTracker, diff is we reset // between rows, not between storefiles. - this.columns = new ExplicitColumnTracker(columns, - scanInfo.getMinVersions(), maxVersions, oldestUnexpiredTS); + this.columns = new ExplicitColumnTracker(columns, scanInfo.getMinVersions(), maxVersions, + scanInfo.getMaxVersions(), oldestUnexpiredTS); } } Index: src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java (revision 1532811) +++ src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java (working copy) @@ -54,6 +54,7 @@ public class ExplicitColumnTracker implements ColumnTracker { private final int maxVersions; + private final int storeMaxVersions; // max version as set by the CF private final int minVersions; /** @@ -79,8 +80,9 @@ * @param ttl The timeToLive to enforce */ public ExplicitColumnTracker(NavigableSet columns, int minVersions, - int maxVersions, long oldestUnexpiredTS) { + int maxVersions, int storeMaxVersions, long oldestUnexpiredTS) { this.maxVersions = maxVersions; + this.storeMaxVersions = storeMaxVersions; this.minVersions = minVersions; this.oldestStamp = oldestUnexpiredTS; this.columns = new ArrayList(columns.size()); @@ -135,8 +137,9 @@ if (ret > 0) { // The current KV is smaller than the column the ExplicitColumnTracker - // is interested in, so seek to that column of interest. - return ScanQueryMatcher.MatchCode.SEEK_NEXT_COL; + // is interested in, so skip or seek to that column of interest. + return storeMaxVersions == 1 ? ScanQueryMatcher.MatchCode.SKIP + : ScanQueryMatcher.MatchCode.SEEK_NEXT_COL; } // The current KV is bigger than the column the ExplicitColumnTracker