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 th...@apache.org on 2014/01/21 10:23:21 UTC
svn commit: r1559951 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/mongomk/
main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/
main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/
test/java/org/apach...
Author: thomasm
Date: Tue Jan 21 09:23:21 2014
New Revision: 1559951
URL: http://svn.apache.org/r1559951
Log:
OAK-759 MongoMK: read from a secondary member when possible (allow changing the read preference / write concern at runtime)
Added:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterInfoTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfo.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfoDocument.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/LoggingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/SynchronizingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/TimingDocumentStoreWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterJoinTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfo.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfo.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfo.java Tue Jan 21 09:23:21 2014
@@ -65,6 +65,11 @@ public class ClusterNodeInfo {
private static final String INFO_KEY = "info";
/**
+ * The read/write mode key.
+ */
+ private static final String READ_WRITE_MODE_KEY = "readWriteMode";
+
+ /**
* The unique machine id (the MAC address if available).
*/
private static final String MACHINE_ID = getMachineId();
@@ -120,6 +125,11 @@ public class ClusterNodeInfo {
*/
private long leaseEndTime;
+ /**
+ * The read/write mode.
+ */
+ private String readWriteMode;
+
ClusterNodeInfo(int id, DocumentStore store, String machineId, String instanceId) {
this.id = id;
this.startTime = System.currentTimeMillis();
@@ -234,7 +244,12 @@ public class ClusterNodeInfo {
UpdateOp update = new UpdateOp("" + id, true);
leaseEndTime = now + leaseTime;
update.set(LEASE_END_KEY, leaseEndTime);
- store.createOrUpdate(Collection.CLUSTER_NODES, update);
+ ClusterNodeInfoDocument doc = store.createOrUpdate(Collection.CLUSTER_NODES, update);
+ String mode = (String) doc.get(READ_WRITE_MODE_KEY);
+ if (mode != null && !mode.equals(readWriteMode)) {
+ readWriteMode = mode;
+ store.setReadWriteMode(mode);
+ }
}
public void setLeaseTime(long leaseTime) {
@@ -258,7 +273,8 @@ public class ClusterNodeInfo {
"machineId: " + machineId + ",\n" +
"instanceId: " + instanceId + ",\n" +
"pid: " + PROCESS_ID + ",\n" +
- "uuid: " + uuid +"\n";
+ "uuid: " + uuid +",\n" +
+ "readWriteMode: " + readWriteMode;
}
private static long getProcessId() {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfoDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfoDocument.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfoDocument.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterNodeInfoDocument.java Tue Jan 21 09:23:21 2014
@@ -20,7 +20,7 @@ package org.apache.jackrabbit.oak.plugin
* A document storing cluster node info. See also {@link ClusterNodeInfo}.
*/
public class ClusterNodeInfoDocument extends Document {
-
+
// marker interface
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentStore.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentStore.java Tue Jan 21 09:23:21 2014
@@ -188,4 +188,12 @@ public interface DocumentStore {
*/
@CheckForNull
<T extends Document> T getIfCached(Collection<T> collection, String key);
+
+ /**
+ * Set the level of guarantee for read and write operations, if supported by this backend.
+ *
+ * @param readWriteMode the read/write mode
+ */
+ void setReadWriteMode(String readWriteMode);
+
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MemoryDocumentStore.java Tue Jan 21 09:23:21 2014
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugin
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.locks.Lock;
@@ -30,6 +31,10 @@ import javax.annotation.Nonnull;
import org.apache.jackrabbit.mk.api.MicroKernelException;
+import com.google.common.base.Splitter;
+import com.mongodb.ReadPreference;
+import com.mongodb.WriteConcern;
+
/**
* Emulates a MongoDB store (possibly consisting of multiple shards and
* replicas).
@@ -56,6 +61,12 @@ public class MemoryDocumentStore impleme
*/
private final Comparator<Revision> comparator = StableRevisionComparator.REVERSE;
+ private ReadPreference readPreference;
+
+ private WriteConcern writeConcern;
+
+ private Object lastReadWriteMode;
+
@Override
public <T extends Document> T find(Collection<T> collection, String key, int maxCacheAge) {
return find(collection, key);
@@ -177,7 +188,7 @@ public class MemoryDocumentStore impleme
} else {
oldDoc.deepCopy(doc);
}
- if (checkConditions && ! UpdateUtils.checkConditions(doc, update)) {
+ if (checkConditions && !UpdateUtils.checkConditions(doc, update)) {
return null;
}
// update the document
@@ -265,4 +276,39 @@ public class MemoryDocumentStore impleme
// ignore
}
+ @Override
+ public void setReadWriteMode(String readWriteMode) {
+ if (readWriteMode == null || readWriteMode.equals(lastReadWriteMode)) {
+ return;
+ }
+ lastReadWriteMode = readWriteMode;
+ try {
+ Map<String, String> map = Splitter.on(", ").withKeyValueSeparator(":").split(readWriteMode);
+ String read = map.get("read");
+ if (read != null) {
+ ReadPreference readPref = ReadPreference.valueOf(read);
+ if (!readPref.equals(this.readPreference)) {
+ this.readPreference = readPref;
+ }
+ }
+ String write = map.get("write");
+ if (write != null) {
+ WriteConcern writeConcern = WriteConcern.valueOf(write);
+ if (!writeConcern.equals(this.writeConcern)) {
+ this.writeConcern = writeConcern;
+ }
+ }
+ } catch (Exception e) {
+ // unsupported or parse error - ignore
+ }
+ }
+
+ public ReadPreference getReadPreference() {
+ return readPreference;
+ }
+
+ public WriteConcern getWriteConcern() {
+ return writeConcern;
+ }
+
}
\ No newline at end of file
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoDocumentStore.java Tue Jan 21 09:23:21 2014
@@ -33,12 +33,14 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.jackrabbit.mk.api.MicroKernelException;
-import org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Operation;
import org.apache.jackrabbit.oak.cache.CacheStats;
+import org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Key;
+import org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Objects;
+import com.google.common.base.Splitter;
import com.google.common.cache.Cache;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.Striped;
@@ -49,11 +51,10 @@ import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import com.mongodb.QueryBuilder;
+import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;
-import static org.apache.jackrabbit.oak.plugins.mongomk.UpdateOp.Key;
-
/**
* A document store that uses MongoDB as the backend.
*/
@@ -87,6 +88,8 @@ public class MongoDocumentStore implemen
*/
private final Comparator<Revision> comparator = StableRevisionComparator.REVERSE;
+ private String lastReadWriteMode;
+
public MongoDocumentStore(DB db, MongoMK.Builder builder) {
nodes = db.getCollection(
Collection.NODES.toString());
@@ -768,4 +771,33 @@ public class MongoDocumentStore implemen
l.lock();
return l;
}
+
+ @Override
+ public void setReadWriteMode(String readWriteMode) {
+ if (readWriteMode == null || readWriteMode.equals(lastReadWriteMode)) {
+ return;
+ }
+ lastReadWriteMode = readWriteMode;
+ try {
+ Map<String, String> map = Splitter.on(", ").withKeyValueSeparator(":").split(readWriteMode);
+ String read = map.get("read");
+ if (read != null) {
+ ReadPreference readPref = ReadPreference.valueOf(read);
+ if (!readPref.equals(nodes.getReadPreference())) {
+ nodes.setReadPreference(readPref);
+ LOG.info("Using ReadPreference " + readPref);
+ }
+ }
+ String write = map.get("write");
+ if (write != null) {
+ WriteConcern writeConcern = WriteConcern.valueOf(write);
+ if (!writeConcern.equals(nodes.getWriteConcern())) {
+ nodes.setWriteConcern(writeConcern);
+ LOG.info("Using WriteConcern " + writeConcern);
+ }
+ }
+ } catch (Exception e) {
+ LOG.error("Error setting readWriteMode " + readWriteMode, e);
+ }
+ }
}
\ No newline at end of file
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/LoggingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/LoggingDocumentStoreWrapper.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/LoggingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/LoggingDocumentStoreWrapper.java Tue Jan 21 09:23:21 2014
@@ -40,7 +40,7 @@ public class LoggingDocumentStoreWrapper
private static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("ds.debug", "true"));
final DocumentStore store;
- private boolean logThread = false;
+ private boolean logThread;
public LoggingDocumentStoreWrapper(DocumentStore store) {
this.store = store;
@@ -261,6 +261,17 @@ public class LoggingDocumentStoreWrapper
throw convert(e);
}
}
+
+ @Override
+ public void setReadWriteMode(String readWriteMode) {
+ try {
+ logMethod("setReadWriteMode", readWriteMode);
+ store.setReadWriteMode(readWriteMode);
+ } catch (Exception e) {
+ logException(e);
+ throw convert(e);
+ }
+ }
private void logMethod(String methodName, Object... args) {
StringBuilder buff = new StringBuilder("ds");
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/SynchronizingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/SynchronizingDocumentStoreWrapper.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/SynchronizingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/SynchronizingDocumentStoreWrapper.java Tue Jan 21 09:23:21 2014
@@ -39,75 +39,81 @@ public class SynchronizingDocumentStoreW
}
@Override
- synchronized public <T extends Document> T find(final Collection<T> collection, final String key) {
+ public synchronized <T extends Document> T find(final Collection<T> collection, final String key) {
return store.find(collection, key);
}
@Override
- synchronized public <T extends Document> T find(final Collection<T> collection, final String key, final int maxCacheAge) {
+ public synchronized <T extends Document> T find(final Collection<T> collection, final String key, final int maxCacheAge) {
return store.find(collection, key, maxCacheAge);
}
@Nonnull
@Override
- synchronized public <T extends Document> List<T> query(final Collection<T> collection, final String fromKey,
+ public synchronized <T extends Document> List<T> query(final Collection<T> collection, final String fromKey,
final String toKey, final int limit) {
return store.query(collection, fromKey, toKey, limit);
}
@Override
@Nonnull
- synchronized public <T extends Document> List<T> query(final Collection<T> collection, final String fromKey,
+ public synchronized <T extends Document> List<T> query(final Collection<T> collection, final String fromKey,
final String toKey, final String indexedProperty, final long startValue, final int limit) {
return store.query(collection, fromKey, toKey, indexedProperty, startValue, limit);
}
@Override
- synchronized public <T extends Document> void remove(Collection<T> collection, String key) {
+ public synchronized <T extends Document> void remove(Collection<T> collection, String key) {
store.remove(collection, key);
}
@Override
- synchronized public <T extends Document> boolean create(final Collection<T> collection, final List<UpdateOp> updateOps) {
+ public synchronized <T extends Document> boolean create(final Collection<T> collection, final List<UpdateOp> updateOps) {
return store.create(collection, updateOps);
}
@Override
- synchronized public <T extends Document> void update(final Collection<T> collection, final List<String> keys,
+ public synchronized <T extends Document> void update(final Collection<T> collection, final List<String> keys,
final UpdateOp updateOp) {
store.update(collection, keys, updateOp);
}
@Nonnull
@Override
- synchronized public <T extends Document> T createOrUpdate(final Collection<T> collection, final UpdateOp update)
+ public synchronized <T extends Document> T createOrUpdate(final Collection<T> collection, final UpdateOp update)
throws MicroKernelException {
return store.createOrUpdate(collection, update);
}
@Override
- synchronized public <T extends Document> T findAndUpdate(final Collection<T> collection, final UpdateOp update)
+ public synchronized <T extends Document> T findAndUpdate(final Collection<T> collection, final UpdateOp update)
throws MicroKernelException {
return store.findAndUpdate(collection, update);
}
@Override
- synchronized public void invalidateCache() {
+ public synchronized void invalidateCache() {
store.invalidateCache();
}
@Override
- synchronized public <T extends Document> void invalidateCache(Collection<T> collection, String key) {
+ public synchronized <T extends Document> void invalidateCache(Collection<T> collection, String key) {
store.invalidateCache(collection, key);
}
@Override
- synchronized public void dispose() {
+ public synchronized void dispose() {
store.dispose();
}
@Override
- synchronized public <T extends Document> T getIfCached(final Collection<T> collection, final String key) {
+ public synchronized <T extends Document> T getIfCached(final Collection<T> collection, final String key) {
return store.getIfCached(collection, key);
}
+
+ @Override
+ public synchronized void setReadWriteMode(String readWriteMode) {
+ store.setReadWriteMode(readWriteMode);
+ }
+
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/TimingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/TimingDocumentStoreWrapper.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/TimingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/util/TimingDocumentStoreWrapper.java Tue Jan 21 09:23:21 2014
@@ -286,6 +286,17 @@ public class TimingDocumentStoreWrapper
}
}
+ @Override
+ public void setReadWriteMode(String readWriteMode) {
+ try {
+ long start = now();
+ base.setReadWriteMode(readWriteMode);
+ updateAndLogTimes("setReadWriteMode", start, 0, 0);
+ } catch (Exception e) {
+ throw convert(e);
+ }
+ }
+
private void logCommonCall(long start, String key) {
int time = (int) (System.currentTimeMillis() - start);
if (time <= 0) {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/sqlpersistence/SQLDocumentStore.java Tue Jan 21 09:23:21 2014
@@ -494,4 +494,10 @@ public class SQLDocumentStore implements
stmt.close();
}
}
+
+ @Override
+ public void setReadWriteMode(String readWriteMode) {
+ // ignored
+ }
+
}
Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterInfoTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterInfoTest.java?rev=1559951&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterInfoTest.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterInfoTest.java Tue Jan 21 09:23:21 2014
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.mongomk;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import com.mongodb.ReadPreference;
+import com.mongodb.WriteConcern;
+
+/**
+ * Test the ClusterInfo class
+ */
+public class ClusterInfoTest {
+
+ @Test
+ public void readWriteMode() throws InterruptedException {
+
+ MemoryDocumentStore mem = new MemoryDocumentStore();
+ MongoNodeStore ns1 = new MongoMK.Builder().
+ setDocumentStore(mem).
+ setAsyncDelay(0).
+ getNodeStore();
+ MongoNodeStore ns2 = new MongoMK.Builder().
+ setDocumentStore(mem).
+ setAsyncDelay(0).
+ getNodeStore();
+ ns1.getClusterInfo().setLeaseTime(0);
+ ns2.getClusterInfo().setLeaseTime(0);
+ List<ClusterNodeInfoDocument> list = mem.query(
+ Collection.CLUSTER_NODES, "0", "a", Integer.MAX_VALUE);
+ assertEquals(2, list.size());
+
+ assertNull(mem.getReadPreference());
+ assertNull(mem.getWriteConcern());
+ mem.setReadWriteMode("read:primary, write:majority");
+ assertEquals(ReadPreference.primary(), mem.getReadPreference());
+ assertEquals(WriteConcern.MAJORITY, mem.getWriteConcern());
+
+ UpdateOp op;
+
+ // unknown modes: ignore
+ op = new UpdateOp(list.get(0).getId(), false);
+ op.set("readWriteMode", "read:xyz, write:abc");
+ mem.findAndUpdate(Collection.CLUSTER_NODES, op);
+ ns1.runBackgroundOperations();
+ assertEquals(ReadPreference.primary(), mem.getReadPreference());
+ assertEquals(WriteConcern.MAJORITY, mem.getWriteConcern());
+
+ op = new UpdateOp(list.get(0).getId(), false);
+ op.set("readWriteMode", "read:nearest, write:fsynced");
+ mem.findAndUpdate(Collection.CLUSTER_NODES, op);
+ ns1.runBackgroundOperations();
+ assertEquals(ReadPreference.nearest(), mem.getReadPreference());
+ assertEquals(WriteConcern.FSYNCED, mem.getWriteConcern());
+
+ ns1.dispose();
+ ns2.dispose();
+ }
+
+}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterJoinTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterJoinTest.java?rev=1559951&r1=1559950&r2=1559951&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterJoinTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/ClusterJoinTest.java Tue Jan 21 09:23:21 2014
@@ -16,7 +16,6 @@
*/
package org.apache.jackrabbit.oak.plugins.mongomk;
-import org.apache.jackrabbit.oak.plugins.mongomk.util.MongoConnection;
import org.json.simple.JSONObject;
import org.junit.Test;