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 {