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;