You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2013/07/01 17:55:20 UTC
svn commit: r1498531 - in /hbase/trunk/hbase-server/src:
main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java
test/java/org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java
Author: larsh
Date: Mon Jul 1 15:55:20 2013
New Revision: 1498531
URL: http://svn.apache.org/r1498531
Log:
HBASE-8809 Include deletes in the scan (setRaw) method does not respect the time range or the filter
Modified:
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java?rev=1498531&r1=1498530&r2=1498531&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java Mon Jul 1 15:55:20 2013
@@ -323,7 +323,11 @@ public class ScanQueryMatcher {
|| kv.getMemstoreTS() > maxReadPointToTrackVersions) {
// always include or it is not time yet to check whether it is OK
// to purge deltes or not
- return MatchCode.INCLUDE;
+ if (!isUserScan) {
+ // if this is not a user scan (compaction), we can filter this deletemarker right here
+ // otherwise (i.e. a "raw" scan) we fall through to normal version and timerange checking
+ return MatchCode.INCLUDE;
+ }
} else if (keepDeletedCells) {
if (timestamp < earliestPutTs) {
// keeping delete rows, but there are no puts older than
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java?rev=1498531&r1=1498530&r2=1498531&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java Mon Jul 1 15:55:20 2013
@@ -318,12 +318,55 @@ public class TestKeepDeletes extends HBa
InternalScanner scan = region.getScanner(s);
List<KeyValue> kvs = new ArrayList<KeyValue>();
scan.next(kvs);
+ assertEquals(8, kvs.size());
assertTrue(kvs.get(0).isDeleteFamily());
assertEquals(kvs.get(1).getValue(), T3);
assertTrue(kvs.get(2).isDelete());
assertTrue(kvs.get(3).isDeleteType());
assertEquals(kvs.get(4).getValue(), T2);
assertEquals(kvs.get(5).getValue(), T1);
+ // we have 3 CFs, so there are two more delete markers
+ assertTrue(kvs.get(6).isDeleteFamily());
+ assertTrue(kvs.get(7).isDeleteFamily());
+
+ // verify that raw scans honor the passed timerange
+ s = new Scan();
+ s.setRaw(true);
+ s.setMaxVersions();
+ s.setTimeRange(0, 1);
+ scan = region.getScanner(s);
+ kvs = new ArrayList<KeyValue>();
+ scan.next(kvs);
+ // nothing in this interval, not even delete markers
+ assertTrue(kvs.isEmpty());
+
+ // filter new delete markers
+ s = new Scan();
+ s.setRaw(true);
+ s.setMaxVersions();
+ s.setTimeRange(0, ts+2);
+ scan = region.getScanner(s);
+ kvs = new ArrayList<KeyValue>();
+ scan.next(kvs);
+ assertEquals(4, kvs.size());
+ assertTrue(kvs.get(0).isDeleteFamily());
+ assertEquals(kvs.get(1).getValue(), T1);
+ // we have 3 CFs
+ assertTrue(kvs.get(2).isDeleteFamily());
+ assertTrue(kvs.get(3).isDeleteFamily());
+
+ // filter old delete markers
+ s = new Scan();
+ s.setRaw(true);
+ s.setMaxVersions();
+ s.setTimeRange(ts+3, ts+5);
+ scan = region.getScanner(s);
+ kvs = new ArrayList<KeyValue>();
+ scan.next(kvs);
+ assertEquals(2, kvs.size());
+ assertEquals(kvs.get(0).getValue(), T3);
+ assertTrue(kvs.get(1).isDelete());
+
HRegion.closeHRegion(region);
}