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 2013/03/28 11:48:18 UTC
svn commit: r1462026 - in /jackrabbit/oak/trunk/oak-mongomk/src:
main/java/org/apache/jackrabbit/mongomk/prototype/
test/java/org/apache/jackrabbit/mongomk/prototype/
Author: thomasm
Date: Thu Mar 28 10:48:17 2013
New Revision: 1462026
URL: http://svn.apache.org/r1462026
Log:
OAK-619 MongoMK: a simple randomized test case and related bugfixes
Added:
jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java
Modified:
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java
jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java?rev=1462026&r1=1462025&r2=1462026&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java Thu Mar 28 10:48:17 2013
@@ -255,7 +255,13 @@ public class Commit {
Map<String, Object> map = store.createOrUpdate(Collection.NODES, op);
if (baseRevision != null) {
Revision newestRev = mk.getNewestRevision(map, revision, true);
- if (newestRev != null) {
+ if (newestRev == null) {
+ if (op.isDelete || !op.isNew) {
+ throw new MicroKernelException("The node " +
+ op.path + " does not exist or is already deleted " +
+ "before " + revision + "; document " + map);
+ }
+ } else {
if (op.isNew) {
throw new MicroKernelException("The node " +
op.path + " was already added in revision " +
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java?rev=1462026&r1=1462025&r2=1462026&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java Thu Mar 28 10:48:17 2013
@@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentSk
import javax.annotation.Nonnull;
+import org.apache.jackrabbit.mk.api.MicroKernelException;
import org.apache.jackrabbit.mongomk.prototype.UpdateOp.Operation;
/**
@@ -107,6 +108,9 @@ public class MemoryDocumentStore impleme
oldNode = n = map.get(update.key);
if (n == null) {
+ if (!update.isNew) {
+ throw new MicroKernelException("Document does not exist: " + update.key);
+ }
// for a new node, add it (without synchronization)
n = Utils.newMap();
oldNode = map.putIfAbsent(update.key, n);
Added: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java?rev=1462026&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java Thu Mar 28 10:48:17 2013
@@ -0,0 +1,143 @@
+/*
+ * 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.mongomk.prototype;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Random;
+
+import org.apache.jackrabbit.mk.api.MicroKernelException;
+import org.apache.jackrabbit.mk.core.MicroKernelImpl;
+import org.apache.jackrabbit.mk.json.JsonObject;
+import org.apache.jackrabbit.mk.json.JsopBuilder;
+import org.apache.jackrabbit.mk.json.JsopTokenizer;
+import org.junit.Test;
+
+import com.mongodb.DB;
+
+/**
+ * A simple randomized single-instance test.
+ */
+public class RandomizedTest {
+
+ private static final boolean MONGO_DB = false;
+ // private static final boolean MONGO_DB = true;
+
+ private MongoMK mk;
+ private MicroKernelImpl mkGold;
+
+ @Test
+ public void addRemoveSet() throws Exception {
+ mk = createMK();
+ mkGold = new MicroKernelImpl();
+ Random r = new Random(1);
+ int opCount = 1000, nodeCount = 10;
+ int propertyCount = 5, valueCount = 10;
+ StringBuilder log = new StringBuilder();
+ try {
+ for (int i = 0; i < opCount; i++) {
+ String node = "t" + r.nextInt(nodeCount);
+ String property = "p" + r.nextInt(propertyCount);
+ String value = "" + r.nextInt(valueCount);
+ String diff;
+ int op = r.nextInt(3);
+ switch(op) {
+ case 0:
+ diff = "+ \"" + node + "\": { \"" + property + "\": " + value + "}";
+ log.append(diff).append('\n');
+ commit(diff);
+ break;
+ case 1:
+ diff = "- \"" + node + "\"";
+ log.append(diff).append('\n');
+ commit(diff);
+ break;
+ case 2:
+ diff = "^ \"" + node + "/" + property + "\": " + value;
+ log.append(diff).append('\n');
+ commit(diff);
+ break;
+ case 3:
+ fail();
+ }
+ get(node);
+ }
+ } catch (AssertionError e) {
+ throw new Exception("log: " + log, e);
+ } catch (Exception e) {
+ throw new Exception("log: " + log, e);
+ }
+ mk.dispose();
+ mkGold.dispose();
+ }
+
+ private void get(String node) {
+ String headGold = mkGold.getHeadRevision();
+ String head = mk.getHeadRevision();
+ String p = "/" + node;
+ if (!mkGold.nodeExists(p, headGold)) {
+ assertFalse(mk.nodeExists(p, head));
+ return;
+ }
+ assertTrue(mk.nodeExists(p, head));
+ String resultGold = mkGold.getNodes(p, headGold, 0, 0, Integer.MAX_VALUE, null);
+ String result = mk.getNodes(p, head, 0, 0, Integer.MAX_VALUE, null);
+ resultGold = normalize(resultGold);
+ result = normalize(result);
+ assertEquals(resultGold, result);
+ }
+
+ private static String normalize(String json) {
+ JsopTokenizer t = new JsopTokenizer(json);
+ t.read('{');
+ JsonObject o = JsonObject.create(t);
+ JsopBuilder w = new JsopBuilder();
+ o.toJson(w);
+ return w.toString();
+ }
+
+ private void commit(String diff) {
+ boolean ok = false;
+ try {
+ mkGold.commit("/", diff, null, null);
+ ok = true;
+ } catch (MicroKernelException e) {
+ try {
+ mk.commit("/", diff, null, null);
+ fail("Should fail: " + diff + " with exception " + e);
+ } catch (MicroKernelException e2) {
+ // expected
+ }
+ }
+ if (ok) {
+ mk.commit("/", diff, null, null);
+ }
+ }
+
+ private static MongoMK createMK() {
+ if (MONGO_DB) {
+ DB db = MongoUtils.getConnection().getDB();
+ MongoUtils.dropCollections(db);
+ return new MongoMK(db, 0);
+ }
+ return new MongoMK();
+ }
+
+}
Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java?rev=1462026&r1=1462025&r2=1462026&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java Thu Mar 28 10:48:17 2013
@@ -181,9 +181,9 @@ public class SimpleTest {
public void reAddDeleted() {
MongoMK mk = createMK();
String rev0 = mk.getHeadRevision();
- String rev1 = mk.commit("/", "+\"test\":{\"name\": \"Hello\"}", null, null);
- String rev2 = mk.commit("/", "-\"test\"", null, null);
- String rev3 = mk.commit("/", "+\"test\":{\"name\": \"Hallo\"}", null, null);
+ String rev1 = mk.commit("/", "+\"test\":{\"name\": \"Hello\"} ^ \"x\": 1", null, null);
+ String rev2 = mk.commit("/", "-\"test\" ^ \"x\": 2", null, null);
+ String rev3 = mk.commit("/", "+\"test\":{\"name\": \"Hallo\"} ^ \"x\": 3", null, null);
String test0 = mk.getNodes("/test", rev0, 0, 0, Integer.MAX_VALUE, null);
assertNull(null, test0);
String test1 = mk.getNodes("/test", rev1, 0, 0, Integer.MAX_VALUE, null);