Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java (date 1452592565000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java (revision ) @@ -507,7 +507,7 @@ if (maxLastModifiedTime > 0) { metaStatement.append(" and LASTMOD <= ?"); - dataStatement.append(" and not exists(select * from " + this.tnMeta + " m where ID = m.ID and m.LASTMOD <= ?)"); + dataStatement.append(" and not exists(select * from " + this.tnMeta + " m where ID = m.ID)"); } prepMeta = con.prepareStatement(metaStatement.toString()); @@ -519,7 +519,6 @@ if (maxLastModifiedTime > 0) { prepMeta.setLong(mindex, maxLastModifiedTime); - prepData.setLong(dindex, maxLastModifiedTime); } count += prepMeta.executeUpdate(); Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java (date 1452592565000) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java (revision ) @@ -28,11 +28,13 @@ import java.util.List; import java.util.Random; +import com.google.common.collect.ImmutableList; import org.apache.jackrabbit.oak.commons.StringUtils; import org.apache.jackrabbit.oak.plugins.document.rdb.RDBBlobStore; import org.apache.jackrabbit.oak.plugins.document.rdb.RDBBlobStoreFriend; import org.apache.jackrabbit.oak.spi.blob.AbstractBlobStoreTest; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -162,6 +164,23 @@ } RDBBlobStoreFriend.deleteChunks(blobStore, toDelete, System.currentTimeMillis() + 1000); + } + + @Test + public void testUpdateAndDelete() throws Exception { + byte[] data = new byte[256]; + Random r = new Random(0); + r.nextBytes(data); + byte[] digest = getDigest(data); + RDBBlobStoreFriend.storeBlock(blobStore, digest, 0, data); + String id = StringUtils.convertBytesToHex(digest); + Thread.sleep(10000); + // Force update to update timestamp + RDBBlobStoreFriend.storeBlock(blobStore, digest, 0, data); + // Metadata row should not have been touched + Assert.assertFalse(blobStore.deleteChunks(ImmutableList.of(id), System.currentTimeMillis() - 1000)); + // Actual data row should still be present + Assert.assertNotNull(RDBBlobStoreFriend.readBlockFromBackend(blobStore, digest)); } @Test