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 mr...@apache.org on 2014/05/15 14:18:38 UTC
svn commit: r1594888 - in
/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document:
AmnesiaDiffCache.java DocumentNodeStoreTest.java
Author: mreutegg
Date: Thu May 15 12:18:37 2014
New Revision: 1594888
URL: http://svn.apache.org/r1594888
Log:
OAK-1822: NodeDocument _modified may go back in time
Additional test showing the diff issue when _modified is set back in time
Added:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java?rev=1594888&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/AmnesiaDiffCache.java Thu May 15 12:18:37 2014
@@ -0,0 +1,52 @@
+/*
+ * 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.document;
+
+import javax.annotation.Nonnull;
+
+/**
+ * A diff cache implementation, which immediately forgets the diff.
+ */
+class AmnesiaDiffCache implements DiffCache {
+
+ static final DiffCache INSTANCE = new AmnesiaDiffCache();
+
+ private AmnesiaDiffCache() {
+ super();
+ }
+
+ @Override
+ public String getChanges(@Nonnull Revision from,
+ @Nonnull Revision to,
+ @Nonnull String path) {
+ return null;
+ }
+
+ @Nonnull
+ @Override
+ public Entry newEntry(@Nonnull Revision from, @Nonnull Revision to) {
+ return new Entry() {
+ @Override
+ public void append(@Nonnull String path, @Nonnull String changes) {
+ }
+
+ @Override
+ public void done() {
+ }
+ };
+ }
+}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java?rev=1594888&r1=1594887&r2=1594888&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java Thu May 15 12:18:37 2014
@@ -462,6 +462,69 @@ public class DocumentNodeStoreTest {
doc = docStore.find(NODES, Utils.getIdFromPath("/node"));
Long mod2 = (Long) doc.get(MODIFIED_IN_SECS);
assertTrue("" + mod2 + " < " + mod1, mod2 >= mod1);
+
+ ns1.dispose();
+ ns2.dispose();
+ }
+
+ @Ignore("OAK-1822")
+ @Test
+ public void modifiedResetWithDiff() throws Exception {
+ Clock clock = new Clock.Virtual();
+ clock.waitUntil(System.currentTimeMillis());
+ Revision.setClock(clock);
+ MemoryDocumentStore docStore = new MemoryDocumentStore();
+ DocumentNodeStore ns1 = new DocumentMK.Builder()
+ .setDocumentStore(docStore).setClusterId(1)
+ .setAsyncDelay(0).clock(clock)
+ // use a no-op diff cache to simulate a cache miss
+ // when the diff is made later in the test
+ .setDiffCache(AmnesiaDiffCache.INSTANCE)
+ .getNodeStore();
+ NodeBuilder builder1 = ns1.getRoot().builder();
+ builder1.child("node");
+ for (int i = 0; i < DocumentMK.MANY_CHILDREN_THRESHOLD; i++) {
+ builder1.child("node-" + i);
+ }
+ ns1.merge(builder1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ // make sure commit is visible to other node store instance
+ ns1.runBackgroundOperations();
+
+ DocumentNodeStore ns2 = new DocumentMK.Builder()
+ .setDocumentStore(docStore).setClusterId(2)
+ .setAsyncDelay(0).clock(clock).getNodeStore();
+
+ NodeBuilder builder2 = ns2.getRoot().builder();
+ builder2.child("node").child("child-a");
+ ns2.merge(builder2, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+ // wait at least _modified resolution. in reality the wait may
+ // not be necessary. e.g. when the clock passes the resolution boundary
+ // exactly at this time
+ clock.waitUntil(System.currentTimeMillis() +
+ SECONDS.toMillis(MODIFIED_IN_SECS_RESOLUTION + 1));
+
+ builder1 = ns1.getRoot().builder();
+ builder1.child("node").child("child-b");
+ ns1.merge(builder1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ // remember root for diff
+ DocumentNodeState root1 = ns1.getRoot();
+
+ builder1 = root1.builder();
+ builder1.child("node").child("child-c");
+ ns1.merge(builder1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ // remember root for diff
+ DocumentNodeState root2 = ns1.getRoot();
+
+ ns1.runBackgroundOperations();
+ ns2.runBackgroundOperations();
+
+ String diff = ns1.diffChildren(root2, root1);
+ // must report /node as changed
+ assertEquals("^\"node\":{}", diff);
+
+ ns1.dispose();
+ ns2.dispose();
}
private static class TestHook extends EditorHook {