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/04/24 21:43:31 UTC

svn commit: r1589850 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java

Author: mreutegg
Date: Thu Apr 24 19:43:30 2014
New Revision: 1589850

URL: http://svn.apache.org/r1589850
Log:
OAK-1770: Document split suppressed with steady load on many cluster nodes

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1589850&r1=1589849&r2=1589850&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java Thu Apr 24 19:43:30 2014
@@ -969,7 +969,8 @@ public final class NodeDocument extends 
             UpdateUtils.applyChanges(oldDoc, old, context.getRevisionComparator());
             setSplitDocProps(this, oldDoc, old, high);
             // only split if enough of the data can be moved to old document
-            if (oldDoc.getMemory() > getMemory() * SPLIT_RATIO) {
+            if (oldDoc.getMemory() > getMemory() * SPLIT_RATIO
+                    || numValues >= NUM_REVS_THRESHOLD) {
                 splitOps.add(old);
             } else {
                 main = null;

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java?rev=1589850&r1=1589849&r2=1589850&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java Thu Apr 24 19:43:30 2014
@@ -486,6 +486,7 @@ public class DocumentSplitTest extends B
         }
     }
 
+    // OAK-1692
     @Test
     public void cascadingWithSplitRatio() {
         String id = Utils.getIdFromPath("/test");
@@ -494,14 +495,19 @@ public class DocumentSplitTest extends B
         int clusterId = mk.getNodeStore().getClusterId();
 
         UpdateOp op = new UpdateOp(id, false);
-        // create some baggage
-        for (int i = 0; i < NUM_REVS_THRESHOLD / SPLIT_RATIO; i++) {
+        // create some baggage from another cluster node
+        for (int i = 0; i < 1000; i++) {
             Revision r = Revision.newRevision(2);
-            op.setMapEntry("prop", r, "test value");
+            op.setMapEntry("prop", r, "some long test value with many characters");
             NodeDocument.setRevision(op, r, "c");
         }
+        store.findAndUpdate(NODES, op);
+        NodeDocument doc = store.find(NODES, id);
+        assertNotNull(doc);
+        assertTrue(doc.getMemory() > NodeDocument.DOC_SIZE_THRESHOLD);
+
         // these will be considered for a split
-        for (int i = 0; i < NUM_REVS_THRESHOLD; i++) {
+        for (int i = 0; i < NUM_REVS_THRESHOLD / 2; i++) {
             Revision r = Revision.newRevision(clusterId);
             op.setMapEntry("prop", r, "value");
             NodeDocument.setRevision(op, r, "c");
@@ -517,7 +523,7 @@ public class DocumentSplitTest extends B
         }
         store.findAndUpdate(NODES, op);
 
-        NodeDocument doc = store.find(NODES, id);
+        doc = store.find(NODES, id);
         assertNotNull(doc);
         List<UpdateOp> splitOps = Lists.newArrayList(doc.split(mk.getNodeStore()));
         assertEquals(2, splitOps.size());
@@ -544,7 +550,41 @@ public class DocumentSplitTest extends B
                 fail("unexpected update operation " + entry);
             }
         }
+    }
+
+    // OAK-1770
+    @Test
+    public void splitRevisionsManyClusterNodes() {
+        int numClusterNodes = 5;
+        String id = Utils.getIdFromPath("/test");
+        mk.commit("/", "+\"test\":{}", null, null);
+        DocumentStore store = mk.getDocumentStore();
+        int clusterId = mk.getNodeStore().getClusterId();
+
+        List<Revision> revs = Lists.newArrayList();
+        UpdateOp op = new UpdateOp(id, false);
+        for (int i = 0; i < numClusterNodes; i++) {
+            // create some commits for each cluster node
+            for (int j = 0; j < NUM_REVS_THRESHOLD; j++) {
+                Revision r = Revision.newRevision(i + 1);
+                if (clusterId == r.getClusterId()) {
+                    revs.add(r);
+                }
+                op.setMapEntry("prop", r, "value");
+                NodeDocument.setRevision(op, r, "c");
+            }
+        }
+        store.findAndUpdate(NODES, op);
+        NodeDocument doc = store.find(NODES, id);
+        assertNotNull(doc);
 
+        // must split document and create a previous document starting at
+        // the second most recent revision
+        List<UpdateOp> splitOps = Lists.newArrayList(doc.split(mk.getNodeStore()));
+        assertEquals(2, splitOps.size());
+        String prevId = Utils.getPreviousIdFor("/test", revs.get(revs.size() - 2), 0);
+        assertEquals(prevId, splitOps.get(0).getId());
+        assertEquals(id, splitOps.get(1).getId());
     }
 
     private void syncMKs(List<DocumentMK> mks, int idx) {