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 vh...@apache.org on 2020/11/18 04:51:03 UTC

svn commit: r1883582 - in /jackrabbit/oak/trunk/oak-store-document/src: main/java/org/apache/jackrabbit/oak/plugins/document/ main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ main/java/org/apache/jackrabbit/oak/plugins/document/rdb/ test/jav...

Author: vholani
Date: Wed Nov 18 04:51:03 2020
New Revision: 1883582

URL: http://svn.apache.org/viewvc?rev=1883582&view=rev
Log:
OAK-9265 - Oak-run tool recovery function scans for previous documents too

Modified:
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBMissingLastRevSeeker.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeekerTest.java

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java?rev=1883582&r1=1883581&r2=1883582&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java Wed Nov 18 04:51:03 2020
@@ -31,6 +31,7 @@ import com.google.common.collect.Iterabl
 
 import static org.apache.jackrabbit.oak.plugins.document.Collection.CLUSTER_NODES;
 import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.MODIFIED_IN_SECS;
+import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.SD_TYPE;
 import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.getModifiedInSecs;
 import static org.apache.jackrabbit.oak.plugins.document.util.Utils.getSelectedDocuments;
 
@@ -86,7 +87,8 @@ public class MissingLastRevSeeker {
             @Override
             public boolean apply(NodeDocument input) {
                 Long modified = (Long) input.get(MODIFIED_IN_SECS);
-                return (modified != null && (modified >= getModifiedInSecs(startTime)));
+                Long sdType = (Long) input.get(SD_TYPE);
+                return (modified != null && (modified >= getModifiedInSecs(startTime)) && sdType == null);
             }
         });
     }

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java?rev=1883582&r1=1883581&r2=1883582&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java Wed Nov 18 04:51:03 2020
@@ -54,7 +54,9 @@ public class MongoMissingLastRevSeeker e
     @Override
     @NotNull
     public CloseableIterable<NodeDocument> getCandidates(final long startTime) {
-        Bson query = Filters.gte(NodeDocument.MODIFIED_IN_SECS, NodeDocument.getModifiedInSecs(startTime));
+        Bson query = Filters.and(
+                Filters.gte(NodeDocument.MODIFIED_IN_SECS, NodeDocument.getModifiedInSecs(startTime)),
+                Filters.exists(NodeDocument.SD_TYPE, false));
         Bson sortFields = new BasicDBObject(NodeDocument.MODIFIED_IN_SECS, 1);
 
         FindIterable<BasicDBObject> cursor = getNodeCollection()

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBMissingLastRevSeeker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBMissingLastRevSeeker.java?rev=1883582&r1=1883581&r2=1883582&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBMissingLastRevSeeker.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBMissingLastRevSeeker.java Wed Nov 18 04:51:03 2020
@@ -19,6 +19,7 @@
 
 package org.apache.jackrabbit.oak.plugins.document.rdb;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -63,8 +64,9 @@ public class RDBMissingLastRevSeeker ext
         if (MODE == 1) {
             return super.getCandidates(startTime);
         } else {
-            List<QueryCondition> conditions = Collections.singletonList(
-                    new QueryCondition(NodeDocument.MODIFIED_IN_SECS, ">=", NodeDocument.getModifiedInSecs(startTime)));
+            List<QueryCondition> conditions = new ArrayList<>();
+            conditions.add(new QueryCondition(NodeDocument.MODIFIED_IN_SECS, ">=", NodeDocument.getModifiedInSecs(startTime)));
+            conditions.add(new QueryCondition(NodeDocument.SD_TYPE, "is null"));
             return store.queryAsIterable(Collection.NODES, null, null, RDBDocumentStore.EMPTY_KEY_PATTERN, conditions,
                     Integer.MAX_VALUE, null);
         }

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java?rev=1883582&r1=1883581&r2=1883582&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java Wed Nov 18 04:51:03 2020
@@ -1142,11 +1142,13 @@ public class BasicDocumentStoreTest exte
 
     @Test
     public void removeInvalidatesCache() throws Exception {
-        String id = Utils.getIdFromPath("/foo");
+        String path = "/foo";
+        String id = Utils.getIdFromPath(path);
         long modified = 1;
         removeMe.add(id);
-        ds.create(Collection.NODES, Collections.singletonList(newDocument(id, modified)));
-        ds.remove(Collection.NODES, Collections.singletonMap(id, modified));
+        ds.create(Collection.NODES, Collections.singletonList(newDocument(path, modified)));
+        int removed = ds.remove(Collection.NODES, Collections.singletonMap(id, modified));
+        assertEquals(1, removed);
         assertNull(ds.getIfCached(Collection.NODES, id));
     }
 

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeekerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeekerTest.java?rev=1883582&r1=1883581&r2=1883582&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeekerTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeekerTest.java Wed Nov 18 04:51:03 2020
@@ -24,12 +24,17 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoMissingLastRevSeeker;
 import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.rdb.RDBMissingLastRevSeeker;
+import org.apache.jackrabbit.oak.plugins.document.util.Utils;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 import static org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfo.DEFAULT_LEASE_DURATION_MILLIS;
+import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.NUM_REVS_THRESHOLD;
 import static org.apache.jackrabbit.oak.plugins.document.RecoveryHandler.NOOP;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -70,6 +75,12 @@ public class MissingLastRevSeekerTest ex
         ClusterNodeInfo.resetClockToDefault();
         Revision.resetClockToDefault();
     }
+    
+    private void markDocumentsForCleanup() {
+        for (NodeDocument doc : Utils.getAllDocuments(ds)) {
+            removeMe.add(doc.getId());
+        }
+    }
 
     @Test
     public void acquireRecoveryLockOnActiveClusterNode() {
@@ -216,4 +227,31 @@ public class MissingLastRevSeekerTest ex
     private ClusterNodeInfoDocument getClusterNodeInfo(int clusterId) {
         return seeker.getClusterNodeInfo(clusterId);
     }
+    
+    @Test
+    public void getNonSplitDocs() throws Exception {
+        String nodeName = this.getClass().getName() + "-foo";
+        DocumentNodeStore dns = getBuilder().clock(clock).setAsyncDelay(0).setDocumentStore(new DocumentStoreWrapper(store) {
+            @Override
+            public void dispose() {
+                // do not close underlying store, otherwise cleanup
+                // cannot remove documents after the test
+            }
+        }).getNodeStore();
+        NodeBuilder b1 = dns.getRoot().builder();
+        b1.child(nodeName);
+        dns.merge(b1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+        //Modify and commit changes on this node 100 times to create a split document
+        for (int i = 0; i < NUM_REVS_THRESHOLD; i++) {
+            b1 = dns.getRoot().builder();
+            b1.child(nodeName).setProperty("prop",i);
+            dns.merge(b1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+        }
+        dns.runBackgroundOperations();
+        //seeker should return only non split documents
+        int docs = Iterables.size(seeker.getCandidates(0));
+        assertEquals(2, docs);
+        markDocumentsForCleanup();
+        dns.dispose();
+    }
 }