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);