You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2016/05/10 15:02:30 UTC

svn commit: r1743208 - in /jackrabbit/oak/branches/1.4: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/ oak-core/src/test/java/org/apache/jackrabbit/oak/p...

Author: reschke
Date: Tue May 10 15:02:30 2016
New Revision: 1743208

URL: http://svn.apache.org/viewvc?rev=1743208&view=rev
Log:
OAK-4199: RDBBlobStore: garbage collection fails to delete DATA records when there was subsequent blobstore activity (ported to 1.4)

Modified:
    jackrabbit/oak/branches/1.4/   (props changed)
    jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
    jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java
    jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java

Propchange: jackrabbit/oak/branches/1.4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue May 10 15:02:30 2016
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1733615,1733875,1733913,1733929,1734230,1734254,1734279,1734941,1735052,1735405,1735484,1735549,1735564,1735588,1735622,1735638,1735919,1735983,1736176,1737309-1737310,1737334,1737349,1737998,1738004,1738775,1738833,1738963,1739894,1740971,1741032,1741339,1741343,1742520,1742888,1742916,1743097,1743172
+/jackrabbit/oak/trunk:1733615,1733875,1733913,1733929,1734230,1734254,1734279,1734941,1735052,1735405,1735484,1735549,1735564,1735588,1735622,1735638,1735919,1735983,1736176,1737309-1737310,1737334,1737349,1737998,1738004,1738775,1738833,1738950,1738957,1738963,1739894,1740971,1741032,1741339,1741343,1742520,1742888,1742916,1743097,1743172
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java?rev=1743208&r1=1743207&r2=1743208&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java Tue May 10 15:02:30 2016
@@ -518,8 +518,10 @@ public class RDBBlobStore extends Cachin
                 if (maxLastModifiedTime > 0) {
                     // delete only if the last modified is OLDER than x
                     metaStatement.append(" and LASTMOD <= ?");
-                    // delete if there is NO entry where the last modified of the meta is YOUNGER than x
-                    dataStatement.append(" and not exists(select * from " + this.tnMeta + " m where ID = m.ID and m.LASTMOD > ?)");
+                    // delete if there is NO entry where the last modified of
+                    // the meta is YOUNGER than x
+                    dataStatement.append(" and not exists(select * from " + this.tnMeta + " where " + this.tnMeta + ".ID = "
+                            + this.tnData + ".ID and LASTMOD > ?)");
                 }
 
                 prepMeta = con.prepareStatement(metaStatement.toString());

Modified: jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java?rev=1743208&r1=1743207&r2=1743208&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java Tue May 10 15:02:30 2016
@@ -190,6 +190,34 @@ public class RDBBlobStoreTest extends Ab
     }
 
     @Test
+    public void testDeleteChunks() throws Exception {
+        byte[] data1 = new byte[256];
+        Random r = new Random(0);
+        r.nextBytes(data1);
+        byte[] digest1 = getDigest(data1);
+        RDBBlobStoreFriend.storeBlock(blobStore, digest1, 0, data1);
+        String id1 = StringUtils.convertBytesToHex(digest1);
+
+        long now = System.currentTimeMillis();
+
+        long until = System.currentTimeMillis() + 10;
+        while (System.currentTimeMillis() < until) {
+            try {
+                Thread.sleep(5);
+            } catch (InterruptedException e) {
+            }
+        }
+
+        byte[] data2 = new byte[256];
+        r.nextBytes(data2);
+        byte[] digest2 = getDigest(data2);
+        RDBBlobStoreFriend.storeBlock(blobStore, digest2, 0, data2);
+
+        Assert.assertEquals("meta entry was not removed", 1, blobStore.countDeleteChunks(ImmutableList.of(id1), now));
+        Assert.assertFalse("data entry was not removed", RDBBlobStoreFriend.isDataEntryPresent(blobStore, digest1));
+    }
+
+    @Test
     public void testResilienceMissingMetaEntry() throws Exception {
         int test = 1024 * 1024;
         byte[] data = new byte[test];

Modified: jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java?rev=1743208&r1=1743207&r2=1743208&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java Tue May 10 15:02:30 2016
@@ -21,6 +21,7 @@ import static org.apache.jackrabbit.oak.
 import java.io.IOException;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.util.List;
 
 import org.apache.jackrabbit.oak.commons.StringUtils;
@@ -48,6 +49,22 @@ public class RDBBlobStoreFriend {
             con.commit();
             ds.ch.closeConnection(con);
         }
+    }
+
+    public static boolean isDataEntryPresent(RDBBlobStore ds, byte[] digest) throws Exception {
+        String id = StringUtils.convertBytesToHex(digest);
+        Connection con = ds.ch.getROConnection();
+        PreparedStatement prep = null;
+        try {
+            prep = con.prepareStatement("select ID from " + ds.tnData + " where ID = ?");
+            prep.setString(1, id);
+            ResultSet rs = prep.executeQuery();
+            return rs.next();
+        } finally {
+            closeStatement(prep);
+            con.commit();
+            ds.ch.closeConnection(con);
+        }
     }
 
     public static void deleteChunks(RDBBlobStore ds, List<String> chunkIds, long maxLastModifiedTime) throws Exception {