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 ch...@apache.org on 2017/12/18 09:12:02 UTC

svn commit: r1818535 - in /jackrabbit/oak/trunk/oak-run/src: main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ test/java/org/apache/jackrabbit/oak/index/ test/java/org/apache/jackrabbit/oak/plugins/document/mongo/

Author: chetanm
Date: Mon Dec 18 09:12:02 2017
New Revision: 1818535

URL: http://svn.apache.org/viewvc?rev=1818535&view=rev
Log:
OAK-6353 - Use Document order traversal for reindexing performed on DocumentNodeStore setups

Make MongoDocumentTraversal logic work only with readOnly mode

Modified:
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentTraverser.java
    jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
    jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/DocumentTraverserTest.java

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentTraverser.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentTraverser.java?rev=1818535&r1=1818534&r2=1818535&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentTraverser.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentTraverser.java Mon Dec 18 09:12:02 2017
@@ -28,31 +28,27 @@ import com.mongodb.DBCursor;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
-import org.apache.jackrabbit.oak.plugins.document.cache.CacheChangesTracker;
 import org.apache.jackrabbit.oak.plugins.document.cache.NodeDocumentCache;
 import org.apache.jackrabbit.oak.plugins.document.util.CloseableIterable;
 
-import static java.util.Collections.singletonList;
+import static com.google.common.base.Preconditions.checkState;
 
 public class MongoDocumentTraverser {
     private final MongoDocumentStore mongoStore;
+    private boolean disableReadOnlyCheck;
 
     public MongoDocumentTraverser(MongoDocumentStore mongoStore) {
         this.mongoStore = mongoStore;
     }
 
     public <T extends Document> CloseableIterable<T> getAllDocuments(Collection<T> collection, Predicate<String> filter) {
-        //TODO Handle readOnly
-        boolean readOnly = true;
+        if (!disableReadOnlyCheck) {
+            checkState(mongoStore.isReadOnly(), "Traverser can only be used with readOnly store");
+        }
+
         DBCollection dbCollection = mongoStore.getDBCollection(collection);
         Closer closer = Closer.create();
-        CacheChangesTracker cacheChangesTracker;
-        if (collection == Collection.NODES && !readOnly) {
-            cacheChangesTracker = getNodeDocCache().registerTracker(NodeDocument.MIN_ID_VALUE, NodeDocument.MAX_ID_VALUE);
-            closer.register(cacheChangesTracker::close);
-        } else {
-            cacheChangesTracker = null;
-        }
+
 
         DBCursor cursor = dbCollection.find();
         //TODO This may lead to reads being routed to secondary depending on MongoURI
@@ -68,16 +64,20 @@ public class MongoDocumentTraverser {
                     //TODO Review the cache update approach where tracker has to track *all* docs
                     if (collection == Collection.NODES) {
                         NodeDocument nodeDoc = (NodeDocument) doc;
-                        if (readOnly) {
-                            getNodeDocCache().put(nodeDoc);
-                        }
-                        getNodeDocCache().putNonConflictingDocs(cacheChangesTracker, singletonList(nodeDoc));
+                        getNodeDocCache().put(nodeDoc);
                     }
                     return doc;
                 });
         return CloseableIterable.wrap(result, closer);
     }
 
+    /**
+     * For testing only
+     */
+    void disableReadOnlyCheck() {
+        this.disableReadOnlyCheck = true;
+    }
+
     private NodeDocumentCache getNodeDocCache() {
         return mongoStore.getNodeDocumentCache();
     }

Modified: jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java?rev=1818535&r1=1818534&r2=1818535&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java Mon Dec 18 09:12:02 2017
@@ -56,6 +56,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
+import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.junit.Assume;
@@ -133,7 +134,7 @@ public class DocumentStoreIndexerIT exte
 
         Whiteboard wb = new DefaultWhiteboard();
         MongoDocumentStore ds = (MongoDocumentStore) docBuilder.getDocumentStore();
-        wb.register(MongoDocumentStore.class, ds, emptyMap());
+        Registration r1 = wb.register(MongoDocumentStore.class, ds, emptyMap());
         wb.register(StatisticsProvider.class, StatisticsProvider.NOOP, emptyMap());
 
         configureIndex(store);
@@ -159,6 +160,16 @@ public class DocumentStoreIndexerIT exte
 
         String checkpoint = store.checkpoint(100000);
 
+        //Shut down this store and restart in readOnly mode
+        store.dispose();
+        r1.unregister();
+
+        DocumentNodeStoreBuilder<?> docBuilderRO = builderProvider.newBuilder().setReadOnlyMode()
+                .setMongoDB(connectionFactory.getConnection().getDB());
+        ds = (MongoDocumentStore) docBuilderRO.getDocumentStore();
+        store = docBuilderRO.build();
+        wb.register(MongoDocumentStore.class, ds, emptyMap());
+
         IndexHelper helper = new IndexHelper(store, store.getBlobStore(), wb, temporaryFolder.newFolder(),
                 temporaryFolder.newFolder(), asList(TEST_INDEX_PATH));
         IndexerSupport support = new IndexerSupport(helper, checkpoint);

Modified: jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/DocumentTraverserTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/DocumentTraverserTest.java?rev=1818535&r1=1818534&r2=1818535&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/DocumentTraverserTest.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/DocumentTraverserTest.java Mon Dec 18 09:12:02 2017
@@ -58,6 +58,7 @@ public class DocumentTraverserTest exten
         ds.invalidateCache();
 
         MongoDocumentTraverser traverser = new MongoDocumentTraverser((MongoDocumentStore) ds);
+        traverser.disableReadOnlyCheck();
         CloseableIterable<NodeDocument> itr = traverser.getAllDocuments(Collection.NODES, id -> getPathFromId(id).startsWith("/a"));
         Set<String> paths = StreamSupport.stream(itr.spliterator(), false)
                 .map(NodeDocument::getPath)