Author: mreutegg
Date: Tue Dec 12 14:52:20 2017
New Revision: 1817922

URL: http://svn.apache.org/viewvc?rev=1817922&view=rev
Log:
OAK-7053: Commit fails even though change made it to the DocumentStore

Add ignored test

Modified:
    
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitRootUpdateTest.java

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitRootUpdateTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitRootUpdateTest.java?rev=1817922&r1=1817921&r2=1817922&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitRootUpdateTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitRootUpdateTest.java
 Tue Dec 12 14:52:20 2017
@@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -100,6 +101,61 @@ public class CommitRootUpdateTest {
         assertFalse(throwAfterUpdate.get());
     }
 
+    @Ignore
+    @Test
+    public void exceptionOnSingleUpdate() throws Exception {
+        final AtomicBoolean throwAfterUpdate = new AtomicBoolean(false);
+        MemoryDocumentStore store = new MemoryDocumentStore(true) {
+            @Override
+            public <T extends Document> T findAndUpdate(Collection<T> 
collection,
+                                                        UpdateOp update) {
+                T doc = super.findAndUpdate(collection, update);
+                if (isCommitRootUpdate(update) &&
+                        throwAfterUpdate.compareAndSet(true, false)) {
+                    throw new DocumentStoreException("communication failure");
+                }
+                return doc;
+            }
+
+            private boolean isCommitRootUpdate(UpdateOp update) {
+                boolean isCommitRootUpdate = false;
+                for (Map.Entry<Key, Operation> op : 
update.getChanges().entrySet()) {
+                    String name = op.getKey().getName();
+                    if (NodeDocument.isRevisionsEntry(name)) {
+                        isCommitRootUpdate = true;
+                        break;
+                    }
+                }
+                return isCommitRootUpdate;
+            }
+        };
+
+        DocumentNodeStore ns = builderProvider.newBuilder()
+                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+        NodeBuilder b = ns.getRoot().builder();
+        b.child("foo");
+        merge(ns, b);
+
+        throwAfterUpdate.set(true);
+        boolean success = false;
+        Commit c = ns.newCommit(ns.getHeadRevision(), null);
+        try {
+            c.updateProperty("/foo", "p", "v");
+            c.apply();
+            success = true;
+        } finally {
+            if (success) {
+                ns.done(c, false, CommitInfo.EMPTY);
+            } else {
+                ns.canceled(c);
+            }
+        }
+
+        NodeState root = ns.getRoot();
+        assertTrue(root.getChildNode("foo").hasProperty("p"));
+        assertFalse(throwAfterUpdate.get());
+    }
+
     private NodeState merge(NodeStore store, NodeBuilder builder)
             throws Exception {
         return store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);


Reply via email to