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/04/15 09:42:25 UTC
svn commit: r1857555 - in
/jackrabbit/oak/branches/1.8/oak-store-document/src:
main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java
Author: reschke
Date: Mon Apr 15 09:42:25 2019
New Revision: 1857555
URL: http://svn.apache.org/viewvc?rev=1857555&view=rev
Log:
OAK-8200: MongoDocumentStore in ReadOnly mode should never modify persistence (ported to 1.8)
Modified:
jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java
Modified: jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1857555&r1=1857554&r2=1857555&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java (original)
+++ jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java Mon Apr 15 09:42:25 2019
@@ -261,6 +261,23 @@ public class MongoDocumentStore implemen
replicaInfoThread.start();
}
+ if (!readOnly) {
+ ensureIndexes(mongoStatus);
+ }
+
+ this.nodeLocks = new StripedNodeDocumentLocks();
+ this.nodesCache = builder.buildNodeDocumentCache(this, nodeLocks);
+
+ LOG.info("Connected to MongoDB {} with maxReplicationLagMillis {}, " +
+ "maxDeltaForModTimeIdxSecs {}, disableIndexHint {}, " +
+ "{}, serverStatus {}",
+ mongoStatus.getVersion(), maxReplicationLagMillis, maxDeltaForModTimeIdxSecs,
+ disableIndexHint, db.getWriteConcern(),
+ mongoStatus.getServerDetails());
+
+ }
+
+ private void ensureIndexes(@NotNull MongoStatus mongoStatus) {
// indexes:
// the _id field is the primary key, so we don't need to define it
@@ -273,11 +290,9 @@ public class MongoDocumentStore implemen
new boolean[]{true, true}, false, false);
} else if (!hasIndex(nodes, NodeDocument.MODIFIED_IN_SECS, Document.ID)) {
hasModifiedIdCompoundIndex = false;
- if (!builder.getReadOnlyMode()) {
- LOG.warn("Detected an upgrade from Oak version <= 1.2. For optimal " +
- "performance it is recommended to create a compound index " +
- "for the 'nodes' collection on {_modified:1, _id:1}.");
- }
+ LOG.warn("Detected an upgrade from Oak version <= 1.2. For optimal " +
+ "performance it is recommended to create a compound index " +
+ "for the 'nodes' collection on {_modified:1, _id:1}.");
}
// index on the _bin flag to faster access nodes with binaries for GC
@@ -293,14 +308,12 @@ public class MongoDocumentStore implemen
createIndex(nodes, NodeDocument.DELETED_ONCE, true, false, true);
}
} else if (!hasIndex(nodes, DELETED_ONCE, MODIFIED_IN_SECS)) {
- if (!builder.getReadOnlyMode()) {
- LOG.warn("Detected an upgrade from Oak version <= 1.6. For optimal " +
- "Revision GC performance it is recommended to create a " +
- "partial index for the 'nodes' collection on " +
- "{_deletedOnce:1, _modified:1} with a partialFilterExpression " +
- "{_deletedOnce:true}. Partial indexes require MongoDB 3.2 " +
- "or higher.");
- }
+ LOG.warn("Detected an upgrade from Oak version <= 1.6. For optimal " +
+ "Revision GC performance it is recommended to create a " +
+ "partial index for the 'nodes' collection on " +
+ "{_deletedOnce:1, _modified:1} with a partialFilterExpression " +
+ "{_deletedOnce:true}. Partial indexes require MongoDB 3.2 " +
+ "or higher.");
}
// compound index on _sdType and _sdMaxRevTime
@@ -310,26 +323,14 @@ public class MongoDocumentStore implemen
createIndex(nodes, new String[]{SD_TYPE, SD_MAX_REV_TIME_IN_SECS},
new boolean[]{true, true}, false, true);
} else if (!hasIndex(nodes, SD_TYPE, SD_MAX_REV_TIME_IN_SECS)) {
- if (!builder.getReadOnlyMode()) {
- LOG.warn("Detected an upgrade from Oak version <= 1.6. For optimal " +
- "Revision GC performance it is recommended to create a " +
- "sparse compound index for the 'nodes' collection on " +
- "{_sdType:1, _sdMaxRevTime:1}.");
- }
+ LOG.warn("Detected an upgrade from Oak version <= 1.6. For optimal " +
+ "Revision GC performance it is recommended to create a " +
+ "sparse compound index for the 'nodes' collection on " +
+ "{_sdType:1, _sdMaxRevTime:1}.");
}
// index on _modified for journal entries
createIndex(journal, JournalEntry.MODIFIED, true, false, false);
-
- this.nodeLocks = new StripedNodeDocumentLocks();
- this.nodesCache = builder.buildNodeDocumentCache(this, nodeLocks);
-
- LOG.info("Connected to MongoDB {} with maxReplicationLagMillis {}, " +
- "maxDeltaForModTimeIdxSecs {}, disableIndexHint {}, " +
- "{}, serverStatus {}",
- mongoStatus.getVersion(), maxReplicationLagMillis, maxDeltaForModTimeIdxSecs,
- disableIndexHint, db.getWriteConcern(),
- mongoStatus.getServerDetails());
}
public boolean isReadOnly() {
Modified: jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java?rev=1857555&r1=1857554&r2=1857555&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java (original)
+++ jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java Mon Apr 15 09:42:25 2019
@@ -92,6 +92,26 @@ public class MongoDocumentStoreTest exte
assertThat(info.keySet(), hasItem("settings.count"));
}
+ @Test
+ public void readOnly() throws Exception {
+ // setup must have created nodes collection with index on _bin
+ assertTrue(hasIndex(store.getDBCollection(Collection.NODES), NodeDocument.HAS_BINARY_FLAG));
+ mk.dispose();
+ // remove the indexes
+ mongoConnection = connectionFactory.getConnection();
+ assertNotNull(mongoConnection);
+ DocumentMK.Builder builder = new DocumentMK.Builder();
+ store = new TestStore(mongoConnection.getDB(), builder);
+ store.getDBCollection(Collection.NODES).dropIndexes();
+ // must be gone now
+ assertFalse(hasIndex(store.getDBCollection(Collection.NODES), NodeDocument.HAS_BINARY_FLAG));
+
+ // start a new read-only DocumentNodeStore
+ mk = newBuilder(mongoConnection.getDB()).setReadOnlyMode().open();
+ // must still not exist when started in read-only mode
+ assertFalse(hasIndex(store.getDBCollection(Collection.NODES), NodeDocument.HAS_BINARY_FLAG));
+ }
+
static final class TestStore extends MongoDocumentStore {
TestStore(DB db, DocumentMK.Builder builder) {
super(db, builder);