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 2019/06/25 10:30:21 UTC

svn commit: r1862050 - in /jackrabbit/oak/trunk/oak-store-document/src: main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ test/java/org/apache/jackrabbit/oak/plugins/document/blob/

Author: reschke
Date: Tue Jun 25 10:30:20 2019
New Revision: 1862050

URL: http://svn.apache.org/viewvc?rev=1862050&view=rev
Log:
OAK-8252: MongoBlobStore instantiated from ReadOnly DocumentNodeStore should never modify persistence

Modified:
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/MongoBlobStoreTest.java

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java?rev=1862050&r1=1862049&r2=1862050&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java Tue Jun 25 10:30:20 2019
@@ -27,9 +27,12 @@ import com.mongodb.client.model.UpdateOp
 import com.mongodb.client.result.UpdateResult;
 import org.apache.jackrabbit.oak.commons.StringUtils;
 import org.apache.jackrabbit.oak.plugins.blob.CachingBlobStore;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder;
 import org.bson.Document;
 import org.bson.codecs.configuration.CodecRegistry;
 import org.bson.conversions.Bson;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,24 +74,44 @@ public class MongoBlobStore extends Cach
     private final ReadPreference defaultReadPreference;
     private final MongoCollection<MongoBlob> blobCollection;
     private long minLastModified;
+    private final boolean readOnly;
 
     /**
      * Constructs a new {@code MongoBlobStore}
      *
-     * @param db The DB.
+     * @param db the database
      */
     public MongoBlobStore(MongoDatabase db) {
-        this(db, DEFAULT_CACHE_SIZE);
+        this(db, DEFAULT_CACHE_SIZE, null);
     }
 
+    /**
+     * Constructs a new {@code MongoBlobStore}
+     *
+     * @param db the database
+     * @param cachesize the cachesize
+     * @param builder {@link DocumentNodeStoreBuilder}, supplying further options
+     */
     public MongoBlobStore(MongoDatabase db, long cacheSize) {
+        this(db, cacheSize, null);
+    }
+
+    /**
+     * Constructs a new {@code MongoBlobStore}
+     *
+     * @param db the database
+     * @param cachesize the cache size
+     * @param builder {@link DocumentNodeStoreBuilder}, supplying further options
+     */
+    public MongoBlobStore(@NotNull MongoDatabase db, long cacheSize, @Nullable DocumentNodeStoreBuilder<?> builder) {
         super(cacheSize);
+        readOnly = builder == null ? false : builder.getReadOnlyMode();
         // use a block size of 2 MB - 1 KB, because MongoDB rounds up the
         // space allocated for a record to the next power of two
         // (there is an overhead per record, let's assume it is 1 KB at most)
         setBlockSize(2 * 1024 * 1024 - 1024);
         defaultReadPreference = db.getReadPreference();
-        blobCollection = initBlobCollection(db);
+        blobCollection = initBlobCollection(db, readOnly);
     }
 
     @Override
@@ -181,9 +204,13 @@ public class MongoBlobStore extends Cach
         return (int) num;
     }
 
-    private MongoCollection<MongoBlob> initBlobCollection(MongoDatabase db) {
+    private MongoCollection<MongoBlob> initBlobCollection(MongoDatabase db, boolean readOnly) {
         if (stream(db.listCollectionNames().spliterator(), false)
                 .noneMatch(COLLECTION_BLOBS::equals)) {
+            if (readOnly) {
+                throw new RuntimeException(
+                        "MongoBlobStore instantiated read-only, but collection " + COLLECTION_BLOBS + " not present");
+            }
             db.createCollection(COLLECTION_BLOBS);
         }
         // override the read preference configured with the MongoDB URI

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java?rev=1862050&r1=1862049&r2=1862050&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java Tue Jun 25 10:30:20 2019
@@ -226,7 +226,8 @@ public abstract class MongoDocumentNodeS
                 client, db, MongoDocumentNodeStoreBuilderBase.this));
 
         if (this.blobStoreSupplier == null) {
-            this.blobStoreSupplier = memoize(() -> new MongoBlobStore(db, blobCacheSizeMB * 1024 * 1024L));
+            this.blobStoreSupplier = memoize(
+                    () -> new MongoBlobStore(db, blobCacheSizeMB * 1024 * 1024L, MongoDocumentNodeStoreBuilderBase.this));
         }
 
         return thisBuilder();

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/MongoBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/MongoBlobStoreTest.java?rev=1862050&r1=1862049&r2=1862050&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/MongoBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/MongoBlobStoreTest.java Tue Jun 25 10:30:20 2019
@@ -19,14 +19,18 @@ package org.apache.jackrabbit.oak.plugin
 import com.mongodb.ReadPreference;
 import com.mongodb.client.MongoDatabase;
 
+import static org.junit.Assert.fail;
+
 import org.apache.jackrabbit.oak.plugins.document.MongoUtils;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoBlobStore;
+import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentNodeStoreBuilder;
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
 import org.apache.jackrabbit.oak.spi.blob.AbstractBlobStoreTest;
 import org.junit.After;
 import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Test;
 
 /**
  * Tests the {@link MongoBlobStore} implementation.
@@ -68,4 +72,15 @@ public class MongoBlobStoreTest extends
         super.tearDown();
     }
 
+    @Test
+    public void readOnly() throws Exception {
+        try {
+            MongoUtils.dropCollections(mongoConnection.getDatabase());
+            MongoDocumentNodeStoreBuilder mdnssb = MongoDocumentNodeStoreBuilder.newMongoDocumentNodeStoreBuilder()
+                    .setReadOnlyMode();
+            MongoBlobStore mbs = new MongoBlobStore(mongoConnection.getDatabase(), 0, mdnssb);
+            fail("Read-only instantiation should fail when collection is missing, but got: " + mbs);
+        } catch (RuntimeException expected) {
+        }
+    }
 }
\ No newline at end of file