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 {