OAK-8585: Improve exception message on conflict
git-svn-id: https://svn.apache.org/repos/asf/jackrabbit/oak/trunk@1866080 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
index 089f3d4..db03fd6 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
@@ -288,6 +288,20 @@
return Iterables.concat(paths);
}
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ base.toStringBuilder(sb).append("[");
+ String separator = "";
+ for (Map.Entry<Revision, BranchCommit> c : commits.entrySet()) {
+ sb.append(separator);
+ separator = ",";
+ sb.append(c.getKey()).append("->").append(c.getValue());
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+
/**
* Information about a commit within a branch.
*/
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java
index b080990..d4d12cd 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Commit.java
@@ -551,13 +551,15 @@
collisions.clear();
if (baseRevision != null) {
Revision newestRev = null;
+ Branch branch = null;
if (before != null) {
RevisionVector base = baseRevision;
if (nodeStore.isDisableBranches()) {
base = base.asTrunkRevision();
}
+ branch = getBranch();
newestRev = before.getNewestRevision(
- nodeStore, base, revision, getBranch(), collisions);
+ nodeStore, base, revision, branch, collisions);
}
String conflictMessage = null;
Set<Revision> conflictRevisions = Sets.newHashSet();
@@ -565,7 +567,8 @@
if ((op.isDelete() || !op.isNew())
&& !allowConcurrentAddRemove(before, op)) {
conflictMessage = "The node " +
- op.getId() + " does not exist or is already deleted";
+ op.getId() + " does not exist or is already deleted " +
+ "at base revision " + baseRevision + ", branch: " + branch;
if (before != null && !before.getLocalDeleted().isEmpty()) {
conflictRevisions.add(before.getLocalDeleted().firstKey());
}
@@ -614,7 +617,7 @@
}
}
if (conflictMessage != null) {
- conflictMessage += ", before\n" + revision;
+ conflictMessage += ", commit revision: " + revision;
if (LOG.isDebugEnabled()) {
LOG.debug(conflictMessage + "; document:\n" +
(before == null ? "" : before.format()));
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitTest.java
index 152e050..76c3368 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitTest.java
@@ -22,10 +22,14 @@
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.hamcrest.Matchers;
import org.junit.Rule;
import org.junit.Test;
+import static org.apache.jackrabbit.oak.plugins.document.TestUtils.merge;
import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -132,4 +136,33 @@
ns.canceled(c);
}
}
+
+ // OAK-8585
+ @Test
+ public void alreadyDeletedMessage() throws Exception {
+ DocumentNodeStore ns = builderProvider.newBuilder().getNodeStore();
+
+ NodeBuilder builder = ns.getRoot().builder();
+ builder.child("foo");
+ merge(ns, builder);
+ builder = ns.getRoot().builder();
+ builder.child("foo").remove();
+ merge(ns, builder);
+
+ Commit c = ns.newCommit(changes -> {
+ changes.removeNode(Path.fromString("/foo"), EMPTY_NODE);
+ }, ns.getHeadRevision().asBranchRevision(ns.getClusterId()), null);
+ try {
+ try {
+ c.apply();
+ fail("commit must fail");
+ } catch (ConflictException e) {
+ // expected
+ assertThat(e.getMessage(), containsString("base revision"));
+ assertThat(e.getMessage(), containsString("branch"));
+ }
+ } finally {
+ ns.canceled(c);
+ }
+ }
}