Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java (revision 1721180) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java (working copy) @@ -28,6 +28,7 @@ import java.util.List; import java.util.Random; +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; @@ -136,6 +137,29 @@ } @Test + public void testDeleteManyBlobs() throws Exception { + // see https://issues.apache.org/jira/browse/OAK-3807 + int count = 2000; + List toDelete = new ArrayList(); + + for (int i = 0; i < count; i++) { + byte[] data = new byte[256]; + Random r = new Random(0); + r.nextBytes(data); + byte[] digest = getDigest(data); + RDBBlobStoreFriend.storeBlock(blobStore, digest, 0, data); + byte[] data2 = RDBBlobStoreFriend.readBlockFromBackend(blobStore, digest); + if (!Arrays.equals(data, data2)) { + throw new Exception("data mismatch for length " + data.length); + } + String id = StringUtils.convertBytesToHex(digest); + toDelete.add(id); + } + + RDBBlobStoreFriend.deleteChunks(blobStore, toDelete, System.currentTimeMillis() + 1000); + } + + @Test public void testResilienceMissingMetaEntry() throws Exception { int test = 1024 * 1024; byte[] data = new byte[test]; Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java (revision 1721180) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java (working copy) @@ -21,6 +21,7 @@ import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; +import java.util.List; import org.apache.jackrabbit.oak.commons.StringUtils; @@ -48,4 +49,8 @@ ds.ch.closeConnection(con); } } + + public static void deleteChunks(RDBBlobStore ds, List chunkIds, long maxLastModifiedTime) throws Exception { + ds.deleteChunks(chunkIds, maxLastModifiedTime); + } }