Author: mreutegg
Date: Wed Sep  2 10:01:40 2015
New Revision: 1700749

URL: http://svn.apache.org/r1700749
Log:
OAK-3333: SplitOperations purges _commitRoot entries too eagerly

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=1700749&r1=1700748&r2=1700749&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 Sep  2 10:01:40 2015
@@ -233,6 +233,7 @@ class SplitOperations {
         committedChanges.put(REVISIONS, revisions);
         NavigableMap<Revision, String> commitRoot =
                 new TreeMap<Revision, String>(context.getRevisionComparator());
+        boolean mostRecent = true;
         for (Map.Entry<Revision, String> entry : 
doc.getLocalCommitRoot().entrySet()) {
             Revision r = entry.getKey();
             if (splitRevs.contains(r)) {
@@ -240,9 +241,13 @@ class SplitOperations {
                 numValues++;
             } else if (r.getClusterId() == context.getClusterId() 
                     && !changes.contains(r)) {
-                // OAK-2528: _commitRoot entry without associated
-                // change -> consider as garbage
-                addGarbage(r, COMMIT_ROOT);
+                // OAK-2528: _commitRoot entry without associated change
+                // consider all but most recent as garbage (OAK-3333)
+                if (mostRecent) {
+                    mostRecent = false;
+                } else {
+                    addGarbage(r, COMMIT_ROOT);
+                }
             }
         }
         committedChanges.put(COMMIT_ROOT, commitRoot);

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=1700749&r1=1700748&r2=1700749&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 Sep  2 10:01:40 2015
@@ -740,6 +740,40 @@ public class DocumentSplitTest extends B
         assertTrue(doc.getLocalCommitRoot().size() < NUM_REVS_THRESHOLD);
     }
 
+    // OAK-3333
+    @Test
+    public void purgeAllButMostRecentCommitRoot() 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).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);
+        }
+        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 {


Reply via email to