Index: src/main/java/org/apache/hadoop/hbase/KeyValue.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/KeyValue.java (revision 1302198) +++ src/main/java/org/apache/hadoop/hbase/KeyValue.java (working copy) @@ -696,7 +696,7 @@ return "empty"; } return keyToString(this.bytes, this.offset + ROW_OFFSET, getKeyLength()) + - "/vlen=" + getValueLength(); + "/vlen=" + getValueLength() + "/ts=" + memstoreTS; } /** Index: src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java (revision 1302198) +++ src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java (working copy) @@ -280,10 +280,15 @@ if (!keepDeletedCells) { // first ignore delete markers if the scanner can do so, and the // range does not include the marker + // + // during flushes and compactions also ignore delete markers newer + // than the readpoint of any open scanner, this prevents deleted + // rows that could still be seen by a scanner from being collected boolean includeDeleteMarker = seePastDeleteMarkers ? tr.withinTimeRange(timestamp) : tr.withinOrAfterTimeRange(timestamp); - if (includeDeleteMarker) { + if (includeDeleteMarker + && kv.getMemstoreTS() <= maxReadPointToTrackVersions) { this.deletes.add(bytes, offset, qualLength, timestamp, type); } // Can't early out now, because DelFam come before any other keys Index: src/test/java/org/apache/hadoop/hbase/TestKeyValue.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/TestKeyValue.java (revision 1302198) +++ src/test/java/org/apache/hadoop/hbase/TestKeyValue.java (working copy) @@ -404,7 +404,7 @@ System.err.println("kv=" + kv); System.err.println("kvFromKey=" + kvFromKey); assertEquals(kvFromKey.toString(), - kv.toString().replaceAll("=[0-9]+$", "=0")); + kv.toString().replaceAll("=[0-9]+", "=0")); } @org.junit.Rule Index: src/test/java/org/apache/hadoop/hbase/regionserver/TestCompaction.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/regionserver/TestCompaction.java (revision 1302198) +++ src/test/java/org/apache/hadoop/hbase/regionserver/TestCompaction.java (working copy) @@ -131,6 +131,7 @@ r.delete(new Delete(results.get(0).getRow()), null, false); if (!result) break; } while(true); + s.close(); // Flush r.flushcache(); // Major compact. Index: src/test/java/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java (revision 1302198) +++ src/test/java/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java (working copy) @@ -40,7 +40,6 @@ import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper; import org.junit.experimental.categories.Category; @@ -55,11 +54,9 @@ HRegion region = null; private HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); - private final String DIR = TEST_UTIL.getDataTestDir("TestIncrement").toString(); + private final String DIR = TEST_UTIL.getDataTestDir("TestAtomicOperation").toString(); - private final int MAX_VERSIONS = 2; - // Test names static final byte[] tableName = Bytes.toBytes("testtable");; static final byte[] qual1 = Bytes.toBytes("qual1"); @@ -260,8 +257,8 @@ // create 100 threads, each will alternate between adding and // removing a column - int numThreads = 100; - int opsPerThread = 1000; + int numThreads = 10; + int opsPerThread = 500; AtomicOperation[] all = new AtomicOperation[numThreads]; AtomicLong timeStamps = new AtomicLong(0); @@ -275,9 +272,11 @@ for (int i=0; i mrm = new ArrayList(); @@ -386,6 +387,7 @@ RegionScanner rs = region.getScanner(s); List r = new ArrayList(); while(rs.next(r)); + rs.close(); if (r.size() != 1) { LOG.debug(r); failures.incrementAndGet();