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 al...@apache.org on 2015/07/09 12:18:49 UTC
svn commit: r1690049 - in /jackrabbit/oak/branches/1.2: ./
oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/junit/
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/
oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ o...
Author: alexparvulescu
Date: Thu Jul 9 10:18:49 2015
New Revision: 1690049
URL: http://svn.apache.org/r1690049
Log:
OAK-3057 Simplify debugging conflict related errors
- merged r1690043, r1690047
Added:
jackrabbit/oak/branches/1.2/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/junit/LogCustomizer.java
- copied unchanged from r1690043, jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/junit/LogCustomizer.java
jackrabbit/oak/branches/1.2/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/junit/LogCustomizerTest.java
- copied unchanged from r1690043, jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/junit/LogCustomizerTest.java
jackrabbit/oak/branches/1.2/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ConflictResolutionTest.java
- copied unchanged from r1690047, jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ConflictResolutionTest.java
Modified:
jackrabbit/oak/branches/1.2/ (props changed)
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidator.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/package-info.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/package-info.java
Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jul 9 10:18:49 2015
@@ -1,3 +1,3 @@
/jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820,1684868,1685023,1685370,1685552
,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689833,1689903,1690017
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820,1684868,1685023,1685370,1685552
,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689833,1689903,1690017,1690043,1690047
/jackrabbit/trunk:1345480
Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidator.java?rev=1690049&r1=1690048&r2=1690049&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidator.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidator.java Thu Jul 9 10:18:49 2015
@@ -16,23 +16,25 @@
*/
package org.apache.jackrabbit.oak.plugins.commit;
-import com.google.common.base.Joiner;
+import static org.apache.jackrabbit.oak.api.Type.STRINGS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.MIX_REP_MERGE_CONFLICT;
+
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
import org.apache.jackrabbit.oak.spi.commit.DefaultValidator;
import org.apache.jackrabbit.oak.spi.commit.Validator;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
import org.apache.jackrabbit.oak.spi.state.ConflictType;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static com.google.common.collect.Iterables.transform;
-import static org.apache.jackrabbit.oak.api.Type.STRINGS;
-import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.MIX_REP_MERGE_CONFLICT;
+import com.google.common.base.Joiner;
/**
* {@link Validator} which checks the presence of conflict markers
@@ -43,10 +45,50 @@ import static org.apache.jackrabbit.oak.
public class ConflictValidator extends DefaultValidator {
private static Logger log = LoggerFactory.getLogger(ConflictValidator.class);
- private final Tree parentAfter;
+ /**
+ * Current processed path, or null if the debug log is not enabled at the
+ * beginning of the call. The null check will also be used to verify if a
+ * debug log will be needed or not
+ */
+ private final String path;
+ private NodeState after;
+
+ @Deprecated
public ConflictValidator(Tree parentAfter) {
- this.parentAfter = parentAfter;
+ this();
+ }
+
+ ConflictValidator() {
+ if (log.isDebugEnabled()) {
+ this.path = "/";
+ } else {
+ this.path = null;
+ }
+ }
+
+ private ConflictValidator(String path, String name) {
+ if (path != null) {
+ this.path = PathUtils.concat(path, name);
+ } else {
+ this.path = null;
+ }
+ }
+
+ private boolean isLogEnabled() {
+ return path != null;
+ }
+
+ @Override
+ public void enter(NodeState before, NodeState after)
+ throws CommitFailedException {
+ this.after = after;
+ }
+
+ @Override
+ public void leave(NodeState before, NodeState after)
+ throws CommitFailedException {
+ this.after = null;
}
@Override
@@ -62,12 +104,13 @@ public class ConflictValidator extends D
@Override
public Validator childNodeAdded(String name, NodeState after) {
- return new ConflictValidator(parentAfter.getChild(name));
+ return new ConflictValidator(path, name);
}
@Override
- public Validator childNodeChanged(String name, NodeState before, NodeState after) {
- return new ConflictValidator(parentAfter.getChild(name));
+ public Validator childNodeChanged(String name, NodeState before,
+ NodeState after) {
+ return new ConflictValidator(path, name);
}
@Override
@@ -82,12 +125,12 @@ public class ConflictValidator extends D
if (MIX_REP_MERGE_CONFLICT.equals(v)) {
CommitFailedException ex = new CommitFailedException(
- CommitFailedException.STATE, 1, "Unresolved conflicts in " + parentAfter.getPath());
+ CommitFailedException.STATE, 1, "Unresolved conflicts in " + path);
//Conflict details are not made part of ExceptionMessage instead they are
//logged. This to avoid exposing property details to the caller as it might not have
//permission to access it
- if (log.isDebugEnabled()) {
+ if (isLogEnabled()) {
log.debug(getConflictMessage(), ex);
}
throw ex;
@@ -98,16 +141,17 @@ public class ConflictValidator extends D
private String getConflictMessage() {
StringBuilder sb = new StringBuilder("Commit failed due to unresolved conflicts in ");
- sb.append(parentAfter.getPath());
+ sb.append(path);
sb.append(" = {");
- for (Tree conflict : parentAfter.getChild(NodeTypeConstants.REP_OURS).getChildren()) {
- ConflictType ct = ConflictType.fromName(conflict.getName());
+ for (ChildNodeEntry conflict : after.getChildNode(NodeTypeConstants.REP_OURS).getChildNodeEntries()) {
+ ConflictType ct = ConflictType.fromName(conflict.getName());
+ NodeState node = conflict.getNodeState();
sb.append(ct.getName()).append(" = {");
if (ct.effectsNode()) {
- sb.append(getChildNodeNamesAsString(conflict));
+ sb.append(getChildNodeNamesAsString(node));
} else {
- for (PropertyState ps : conflict.getProperties()) {
+ for (PropertyState ps : node.getProperties()) {
PropertyState ours = null, theirs = null;
switch (ct) {
case DELETE_CHANGED_PROPERTY:
@@ -117,7 +161,7 @@ public class ConflictValidator extends D
case ADD_EXISTING_PROPERTY:
case CHANGE_CHANGED_PROPERTY:
ours = ps;
- theirs = parentAfter.getProperty(ps.getName());
+ theirs = after.getProperty(ps.getName());
break;
case CHANGE_DELETED_PROPERTY:
ours = ps;
@@ -145,8 +189,8 @@ public class ConflictValidator extends D
return sb.toString();
}
- private static String getChildNodeNamesAsString(Tree t) {
- return Joiner.on(',').join(transform(t.getChildren(), Tree.GET_NAME));
+ private static String getChildNodeNamesAsString(NodeState ns) {
+ return Joiner.on(',').join(ns.getChildNodeNames());
}
private static String toString(PropertyState ps) {
@@ -154,7 +198,7 @@ public class ConflictValidator extends D
return "<N/A>";
}
- final Type type = ps.getType();
+ final Type<?> type = ps.getType();
if (type.isArray()) {
return "<ARRAY>";
}
Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java?rev=1690049&r1=1690048&r2=1690049&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java Thu Jul 9 10:18:49 2015
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.plugin
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
-import org.apache.jackrabbit.oak.plugins.tree.TreeFactory;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
import org.apache.jackrabbit.oak.spi.commit.Validator;
@@ -35,7 +34,7 @@ public class ConflictValidatorProvider e
@Override
public Validator getRootValidator(
NodeState before, NodeState after, CommitInfo info) {
- return new ConflictValidator(TreeFactory.createReadOnlyTree(after));
+ return new ConflictValidator();
}
}
Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java?rev=1690049&r1=1690048&r2=1690049&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java Thu Jul 9 10:18:49 2015
@@ -32,6 +32,7 @@ import java.util.Map;
import com.google.common.collect.ImmutableMap;
import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.json.JsopDiff;
import org.apache.jackrabbit.oak.plugins.memory.PropertyBuilder;
import org.apache.jackrabbit.oak.plugins.tree.impl.TreeConstants;
import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
@@ -112,6 +113,13 @@ public final class MergingNodeStateDiff
NodeState theirs = parent.getChildNode(name);
Resolution resolution = nodeConflictHandler.resolve(name, ours, theirs);
applyResolution(resolution, conflictType, name, ours);
+ if (LOG.isDebugEnabled()) {
+ String diff = JsopDiff.diffToJsop(ours, theirs);
+ LOG.debug(
+ "{} resolved conflict of type {} with resolution {}, conflict trace {}",
+ nodeConflictHandler, conflictType, resolution,
+ diff);
+ }
}
}
else {
@@ -179,30 +187,55 @@ public final class MergingNodeStateDiff
public Resolution resolve(PropertyState ours, PropertyState theirs) {
return conflictHandler.addExistingProperty(target, ours, theirs);
}
+
+ @Override
+ public String toString() {
+ return "PropertyConflictHandler<ADD_EXISTING_PROPERTY>";
+ }
},
CHANGE_DELETED_PROPERTY, new PropertyConflictHandler() {
@Override
public Resolution resolve(PropertyState ours, PropertyState theirs) {
return conflictHandler.changeDeletedProperty(target, ours);
}
+
+ @Override
+ public String toString() {
+ return "PropertyConflictHandler<CHANGE_DELETED_PROPERTY>";
+ }
},
CHANGE_CHANGED_PROPERTY, new PropertyConflictHandler() {
@Override
public Resolution resolve(PropertyState ours, PropertyState theirs) {
return conflictHandler.changeChangedProperty(target, ours, theirs);
}
+
+ @Override
+ public String toString() {
+ return "PropertyConflictHandler<CHANGE_CHANGED_PROPERTY>";
+ }
},
DELETE_DELETED_PROPERTY, new PropertyConflictHandler() {
@Override
public Resolution resolve(PropertyState ours, PropertyState theirs) {
return conflictHandler.deleteDeletedProperty(target, ours);
}
+
+ @Override
+ public String toString() {
+ return "PropertyConflictHandler<DELETE_DELETED_PROPERTY>";
+ }
},
DELETE_CHANGED_PROPERTY, new PropertyConflictHandler() {
@Override
public Resolution resolve(PropertyState ours, PropertyState theirs) {
return conflictHandler.deleteChangedProperty(target, theirs);
}
+
+ @Override
+ public String toString() {
+ return "PropertyConflictHandler<DELETE_CHANGED_PROPERTY>";
+ }
}
);
@@ -212,24 +245,44 @@ public final class MergingNodeStateDiff
public Resolution resolve(String name, NodeState ours, NodeState theirs) {
return conflictHandler.addExistingNode(target, name, ours, theirs);
}
+
+ @Override
+ public String toString() {
+ return "NodeConflictHandler<ADD_EXISTING_NODE>";
+ }
},
CHANGE_DELETED_NODE, new NodeConflictHandler() {
@Override
public Resolution resolve(String name, NodeState ours, NodeState theirs) {
return conflictHandler.changeDeletedNode(target, name, ours);
}
+
+ @Override
+ public String toString() {
+ return "NodeConflictHandler<CHANGE_DELETED_NODE>";
+ }
},
DELETE_CHANGED_NODE, new NodeConflictHandler() {
@Override
public Resolution resolve(String name, NodeState ours, NodeState theirs) {
return conflictHandler.deleteChangedNode(target, name, theirs);
}
+
+ @Override
+ public String toString() {
+ return "NodeConflictHandler<DELETE_CHANGED_NODE>";
+ }
},
DELETE_DELETED_NODE, new NodeConflictHandler() {
@Override
public Resolution resolve(String name, NodeState ours, NodeState theirs) {
return conflictHandler.deleteDeletedNode(target, name);
}
+
+ @Override
+ public String toString() {
+ return "NodeConflictHandler<DELETE_DELETED_NODE>";
+ }
}
);
Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/package-info.java?rev=1690049&r1=1690048&r2=1690049&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/package-info.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/package-info.java Thu Jul 9 10:18:49 2015
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@Version("1.0")
+@Version("1.1.0")
@Export(optional = "provide:=true")
package org.apache.jackrabbit.oak.plugins.commit;
Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java?rev=1690049&r1=1690048&r2=1690049&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java Thu Jul 9 10:18:49 2015
@@ -21,6 +21,7 @@ import static com.google.common.base.Pre
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
+import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
@@ -80,4 +81,49 @@ public final class NodeStateUtils {
return node;
}
+ /**
+ * Provides a string representation of the given node state
+ *
+ * @param node
+ * node state
+ * @return a string representation of {@code node}.
+ */
+ public static String toString(NodeState node) {
+ if (node == null) {
+ return "[null]";
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(toString(node, 1, " ", "/"));
+ return sb.toString();
+ }
+
+ private static String toString(NodeState ns, int level, String prepend,
+ String name) {
+ StringBuilder node = new StringBuilder();
+ node.append(prepend).append(name);
+
+ StringBuilder props = new StringBuilder();
+ boolean first = true;
+ for (PropertyState ps : ns.getProperties()) {
+ if (!first) {
+ props.append(", ");
+ } else {
+ first = false;
+ }
+ props.append(ps);
+ }
+
+ if (props.length() > 0) {
+ node.append("{");
+ node.append(props);
+ node.append("}");
+ }
+ for (ChildNodeEntry c : ns.getChildNodeEntries()) {
+ node.append(IOUtils.LINE_SEPARATOR);
+ node.append(toString(c.getNodeState(), level++, prepend + prepend,
+ c.getName()));
+ }
+ return node.toString();
+ }
+
}
Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/package-info.java?rev=1690049&r1=1690048&r2=1690049&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/package-info.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/package-info.java Thu Jul 9 10:18:49 2015
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@Version("1.1.0")
+@Version("1.2.0")
@Export(optional = "provide:=true")
package org.apache.jackrabbit.oak.spi.state;