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/07/17 10:36:43 UTC

svn commit: r1611285 - in /jackrabbit/oak/branches/1.0: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java

Author: mreutegg
Date: Thu Jul 17 08:36:43 2014
New Revision: 1611285

URL: http://svn.apache.org/r1611285
Log:
OAK-1972: Async property index update may fail on DocumentMK with more than 100 index changes

Merged 1611041 and 1611277 from tunk

Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
    jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1611041,1611277

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1611285&r1=1611284&r2=1611285&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java Thu Jul 17 08:36:43 2014
@@ -734,6 +734,22 @@ public final class NodeDocument extends 
             // first check local map, which contains most recent values
             Value value = getLatestValue(nodeStore, getLocalMap(key),
                     min, readRevision, validRevisions);
+
+            // check if there may be more recent values in a previous document
+            if (value != null && !getPreviousRanges().isEmpty()) {
+                Revision newest = getLocalMap(key).firstKey();
+                if (!value.revision.equals(newest)) {
+                    // not reading the most recent value, we may need to
+                    // consider previous documents as well
+                    Revision newestPrev = getPreviousRanges().firstKey();
+                    if (isRevisionNewer(nodeStore, newestPrev, value.revision)) {
+                        // a previous document has more recent changes
+                        // than value.revision
+                        value = null;
+                    }
+                }
+            }
+
             if (value == null && !getPreviousRanges().isEmpty()) {
                 // check complete revision history
                 value = getLatestValue(nodeStore, getValueMap(key),

Modified: jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java?rev=1611285&r1=1611284&r2=1611285&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java Thu Jul 17 08:36:43 2014
@@ -60,6 +60,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
 import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.MODIFIED_IN_SECS;
 import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.MODIFIED_IN_SECS_RESOLUTION;
+import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.NUM_REVS_THRESHOLD;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -484,6 +485,47 @@ public class DocumentNodeStoreTest {
                 maxLimit.get() <= DocumentNodeState.INITIAL_FETCH_SIZE + 1);
     }
 
+    // OAK-1972
+    @Test
+    public void readFromPreviousDoc() throws CommitFailedException {
+        DocumentStore docStore = new MemoryDocumentStore();
+        DocumentNodeStore ns = new DocumentMK.Builder()
+                .setDocumentStore(docStore).getNodeStore();
+        NodeBuilder builder = ns.getRoot().builder();
+        builder.child("test").setProperty("prop", "initial");
+        ns.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+        ns.dispose();
+
+        ns = new DocumentMK.Builder().setClusterId(2).setAsyncDelay(0)
+                .setDocumentStore(docStore).getNodeStore();
+        builder = ns.getRoot().builder();
+        builder.child("test").setProperty("prop", "value");
+        ns.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        Revision rev = ns.getHeadRevision();
+        NodeDocument doc = docStore.find(Collection.NODES, Utils.getIdFromPath("/test"));
+        assertNotNull(doc);
+        DocumentNodeState state = doc.getNodeAtRevision(ns, rev, null);
+        assertNotNull(state);
+        assertTrue(state.hasProperty("prop"));
+        assertEquals("value", state.getProperty("prop").getValue(Type.STRING));
+
+        for (int i = 0; i < NUM_REVS_THRESHOLD; i++) {
+            builder = ns.getRoot().builder();
+            builder.child("test").setProperty("prop", "v-" + i);
+            ns.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+        }
+        ns.runBackgroundOperations();
+
+        // must still return the same value as before the split
+        doc = docStore.find(Collection.NODES, Utils.getIdFromPath("/test"));
+        assertNotNull(doc);
+        state = doc.getNodeAtRevision(ns, rev, null);
+        assertNotNull(state);
+        assertTrue(state.hasProperty("prop"));
+        assertEquals("value", state.getProperty("prop").getValue(Type.STRING));
+    }
+
     private static class TestHook extends EditorHook {
 
         TestHook(final String prefix) {