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 2016/02/24 13:35:01 UTC

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

Author: mreutegg
Date: Wed Feb 24 12:35:01 2016
New Revision: 1732131

URL: http://svn.apache.org/viewvc?rev=1732131&view=rev
Log:
OAK-4050: SplitOperations may not retain most recent committed _commitRoot entry

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitOperations.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/SplitOperations.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitOperations.java?rev=1732131&r1=1732130&r2=1732131&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitOperations.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitOperations.java Wed Feb 24 12:35:01 2016
@@ -240,10 +240,10 @@ class SplitOperations {
             } else if (r.getClusterId() == context.getClusterId() 
                     && !changes.contains(r)) {
                 // OAK-2528: _commitRoot entry without associated change
-                // consider all but most recent as garbage (OAK-3333)
-                if (mostRecent) {
+                // consider all but most recent as garbage (OAK-3333, OAK-4050)
+                if (mostRecent && doc.isCommitted(r)) {
                     mostRecent = false;
-                } else {
+                } else if (isGarbage(r)) {
                     addGarbage(r, COMMIT_ROOT);
                 }
             }

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=1732131&r1=1732130&r2=1732131&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 Wed Feb 24 12:35:01 2016
@@ -773,6 +773,45 @@ public class DocumentSplitTest extends B
         ns2.dispose();
     }
 
+    // OAK-4050
+    @Test
+    public void purgeAllButMostRecentCommittedCommitRoot() throws Exception {
+        DocumentStore store = mk.getDocumentStore();
+        DocumentNodeStore ns1 = mk.getNodeStore();
+        NodeBuilder builder1 = ns1.getRoot().builder();
+        builder1.child("test");
+        merge(ns1, builder1);
+        ns1.runBackgroundOperations();
+
+        DocumentNodeStore ns2 = new DocumentMK.Builder().setDocumentStore(store)
+                .setAsyncDelay(0).setClusterId(ns1.getClusterId() + 1).getNodeStore();
+        // prevent merge retries
+        ns2.setMaxBackOffMillis(0);
+        assertTrue(ns2.getRoot().hasChildNode("test"));
+        NodeBuilder builder2 = ns2.getRoot().builder();
+        builder2.child("test").remove();
+
+        for (int i = 0; i < NUM_REVS_THRESHOLD * 2; i++) {
+            builder1 = ns1.getRoot().builder();
+            builder1.child("test").child("child-" + i);
+            merge(ns1, builder1);
+        }
+        // create a _commitRoot entry for a revision, which is not committed
+        UpdateOp op = new UpdateOp(Utils.getIdFromPath("/test"), false);
+        NodeDocument.setCommitRoot(op, ns1.newRevision(), 0);
+        store.findAndUpdate(NODES, op);
+
+        ns1.runBackgroundOperations();
+
+        try {
+            merge(ns2, builder2);
+            fail("merge must fail with CommitFailedException");
+        } catch (CommitFailedException e) {
+            // expected
+        }
+        ns2.dispose();
+    }
+
     // OAK-3081
     @Test
     public void removeGarbage() throws Exception {