You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2011/10/18 17:09:09 UTC
svn commit: r1185711 - in /jackrabbit/branches/2.2: ./ jackrabbit-core/
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/
Author: reschke
Date: Tue Oct 18 15:09:09 2011
New Revision: 1185711
URL: http://svn.apache.org/viewvc?rev=1185711&view=rev
Log:
JCR-3115: Versioning fixup leaves persistence in a state where the node can't be made versionable again (ported to 2.2)
Modified:
jackrabbit/branches/2.2/ (props changed)
jackrabbit/branches/2.2/jackrabbit-core/ (props changed)
jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java
jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InconsistentVersioningState.java
jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java
Propchange: jackrabbit/branches/2.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 18 15:09:09 2011
@@ -3,4 +3,4 @@
/jackrabbit/sandbox/JCR-1456:774917-886178
/jackrabbit/sandbox/JCR-2170:812417-816332
/jackrabbit/sandbox/tripod-JCR-2209:795441-795863
-/jackrabbit/trunk:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1043893,1043897,1044239,1044312,1044451,1044613,1049473,1049491,1049514,1049518,1049520,1049859,1049870,1049874,1049878,1049880,1049883,1049889,1049891,1049894-1049895,1049899-1049901,1049909-1049911,1049915-1049916,1049919,1049923,1049925,1049931,1049936,1049939,1050212,1050298,1050346,1050551,1055068,1055070-1055071,1055116-1055117,1055127,1055134,1055164,1055498,1060431,1060434,1060753,1063756,1064670,1065599,1065622,1066059,1066071,1069831,1071562,1071573,1071680,1074140,1079314,1079317,1080186,1080540,1087304,1088991,1089032,1089053,1089436,1092106,1092117,1092683,1097363,1097513-1097514,1098963-1098964,1099033,1099172,1100242,1100286,1101046,1102601,1104027,112
8175,1130192,1130228,1132993,1136353,1136360,1138511,1141141,1141717,1143396,1143738,1144332,1144338,1144695,1152258,1155431,1157175,1165609,1173196,1174822,1174887,1175988,1176423,1176465,1176515,1176546,1177249,1177340,1179548,1180922,1183409
+/jackrabbit/trunk:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1043893,1043897,1044239,1044312,1044451,1044613,1049473,1049491,1049514,1049518,1049520,1049859,1049870,1049874,1049878,1049880,1049883,1049889,1049891,1049894-1049895,1049899-1049901,1049909-1049911,1049915-1049916,1049919,1049923,1049925,1049931,1049936,1049939,1050212,1050298,1050346,1050551,1055068,1055070-1055071,1055116-1055117,1055127,1055134,1055164,1055498,1060431,1060434,1060753,1063756,1064670,1065599,1065622,1066059,1066071,1069831,1071562,1071573,1071680,1074140,1079314,1079317,1080186,1080540,1087304,1088991,1089032,1089053,1089436,1092106,1092117,1092683,1097363,1097513-1097514,1098963-1098964,1099033,1099172,1100242,1100286,1101046,1102601,1104027,112
8175,1130192,1130228,1132993,1136353,1136360,1138511,1141141,1141717,1143396,1143738,1144332,1144338,1144695,1152258,1155431,1157175,1165609,1173196,1174822,1174887,1175988,1176423,1176465,1176515,1176546,1177249,1177340,1179548,1180922,1183409,1185691
Propchange: jackrabbit/branches/2.2/jackrabbit-core/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 18 15:09:09 2011
@@ -3,4 +3,4 @@
/jackrabbit/sandbox/JCR-1456/jackrabbit-core:774917-886178
/jackrabbit/sandbox/JCR-2170/jackrabbit-core:812417-816332
/jackrabbit/sandbox/tripod-JCR-2209/jackrabbit-core:795441-795863
-/jackrabbit/trunk/jackrabbit-core:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1043893,1043897,1044239,1044312,1044451,1044613,1049473,1049491,1049514,1049518,1049520,1049859,1049870,1049874,1049878,1049880,1049883,1049889,1049891,1049894-1049895,1049899-1049901,1049909-1049911,1049915-1049916,1049919,1049923,1049925,1049931,1049936,1049939,1050212,1050298,1050346,1050551,1055068,1055070-1055071,1055116-1055117,1055127,1055134,1055164,1055498,1060431,1060434,1060753,1063756,1064670,1065599,1065622,1066059,1066071,1069831,1071562,1071573,1071680,1074140,1079314,1079317,1080186,1080540,1087304,1088991,1089032,1089053,1089436,1092106,1092117,1092683,1097363,1097513-1097514,1098963-1098964,1099033,1099172,1100242,1100286,1101046,110
2601,1104027,1128175,1130192,1130228,1132993,1136353,1136360,1138511,1141141,1141717,1143396,1143738,1144332,1144338,1144695,1152258,1155431,1157175,1165609,1173196,1174822,1174887,1175988,1176423,1176465,1176515,1176546,1177249,1177340,1179548,1180922,1182713,1182835,1183240,1183409
+/jackrabbit/trunk/jackrabbit-core:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1043893,1043897,1044239,1044312,1044451,1044613,1049473,1049491,1049514,1049518,1049520,1049859,1049870,1049874,1049878,1049880,1049883,1049889,1049891,1049894-1049895,1049899-1049901,1049909-1049911,1049915-1049916,1049919,1049923,1049925,1049931,1049936,1049939,1050212,1050298,1050346,1050551,1055068,1055070-1055071,1055116-1055117,1055127,1055134,1055164,1055498,1060431,1060434,1060753,1063756,1064670,1065599,1065622,1066059,1066071,1069831,1071562,1071573,1071680,1074140,1079314,1079317,1080186,1080540,1087304,1088991,1089032,1089053,1089436,1092106,1092117,1092683,1097363,1097513-1097514,1098963-1098964,1099033,1099172,1100242,1100286,1101046,110
2601,1104027,1128175,1130192,1130228,1132993,1136353,1136360,1138511,1141141,1141717,1143396,1143738,1144332,1144338,1144695,1152258,1155431,1157175,1165609,1173196,1174822,1174887,1175988,1176423,1176465,1176515,1176546,1177249,1177340,1179548,1180922,1182713,1182835,1183240,1183409,1185691
Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java?rev=1185711&r1=1185710&r2=1185711&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java Tue Oct 18 15:09:09 2011
@@ -24,6 +24,7 @@ import static org.apache.jackrabbit.spi.
import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_VERSIONHISTORY;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.MIX_VERSIONABLE;
+import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;
@@ -39,8 +40,11 @@ import org.apache.jackrabbit.core.state.
import org.apache.jackrabbit.core.version.InconsistentVersioningState;
import org.apache.jackrabbit.core.version.InternalVersion;
import org.apache.jackrabbit.core.version.InternalVersionHistory;
-import org.apache.jackrabbit.core.version.InternalVersionManager;
+import org.apache.jackrabbit.core.version.InternalVersionManagerImpl;
import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
+import org.apache.jackrabbit.util.ISO8601;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,13 +66,16 @@ class RepositoryChecker {
private final ChangeLog workspaceChanges;
- private final InternalVersionManager versionManager;
+ private final ChangeLog vworkspaceChanges;
+
+ private final InternalVersionManagerImpl versionManager;
public RepositoryChecker(
PersistenceManager workspace,
- InternalVersionManager versionManager) {
+ InternalVersionManagerImpl versionManager) {
this.workspace = workspace;
this.workspaceChanges = new ChangeLog();
+ this.vworkspaceChanges = new ChangeLog();
this.versionManager = versionManager;
}
@@ -91,25 +98,33 @@ class RepositoryChecker {
}
}
- public void fix() throws RepositoryException {
- if (workspaceChanges.hasUpdates()) {
- log.warn("Fixing repository inconsistencies");
+ private void fix(PersistenceManager pm, ChangeLog changes, String store)
+ throws RepositoryException {
+ if (changes.hasUpdates()) {
+ log.warn("Fixing " + store + " inconsistencies");
try {
- workspace.store(workspaceChanges);
+ pm.store(changes);
} catch (ItemStateException e) {
- e.printStackTrace();
- throw new RepositoryException(
- "Failed to fix workspace inconsistencies", e);
+ String message = "Failed to fix " + store + " inconsistencies (aborting)";
+ log.error(message, e);
+ throw new RepositoryException(message, e);
}
} else {
- log.info("No repository inconcistencies found");
+ log.info("No " + store + " inconsistencies found");
}
}
+ public void fix() throws RepositoryException {
+ fix(workspace, workspaceChanges, "workspace");
+ fix(versionManager.getPersistenceManager(), vworkspaceChanges,
+ "versioning workspace");
+ }
+
private void checkVersionHistory(NodeState node) {
if (node.hasPropertyName(JCR_VERSIONHISTORY)) {
String message = null;
NodeId nid = node.getNodeId();
+ NodeId vhid = null;
try {
log.debug("Checking version history of node {}", nid);
@@ -117,6 +132,8 @@ class RepositoryChecker {
message = "Removing references to a missing version history of node " + nid;
InternalVersionHistory vh = versionManager.getVersionHistoryOfNode(nid);
+ vhid = vh.getId();
+
// additional checks, see JCR-3101
String intro = "Removing references to an inconsistent version history of node "
+ nid;
@@ -144,14 +161,25 @@ class RepositoryChecker {
message = intro + " (root version is missing)";
throw new InconsistentVersioningState("root version of " + nid +" is missing.");
}
+ } catch (InconsistentVersioningState e) {
+ log.info(message, e);
+ NodeId nvhid = e.getVersionHistoryNodeId();
+ if (nvhid != null) {
+ if (vhid != null && !nvhid.equals(vhid)) {
+ log.error("vhrid returned with InconsistentVersioningState does not match the id we already had: "
+ + vhid + " vs " + nvhid);
+ }
+ vhid = nvhid;
+ }
+ removeVersionHistoryReferences(node, vhid);
} catch (Exception e) {
log.info(message, e);
- removeVersionHistoryReferences(node);
+ removeVersionHistoryReferences(node, vhid);
}
}
}
- private void removeVersionHistoryReferences(NodeState node) {
+ private void removeVersionHistoryReferences(NodeState node, NodeId vhid) {
NodeState modified =
new NodeState(node, NodeState.STATUS_EXISTING_MODIFIED, true);
@@ -166,6 +194,44 @@ class RepositoryChecker {
removeProperty(modified, JCR_ISCHECKEDOUT);
workspaceChanges.modified(modified);
+
+ if (vhid != null) {
+ // attempt to rename the version history, so it doesn't interfere with
+ // a future attempt to put the node under version control again
+ // (see JCR-3115)
+
+ log.info("trying to rename version history of node " + node.getId());
+
+ NameFactory nf = NameFactoryImpl.getInstance();
+
+ // Name of VHR in parent folder is ID of versionable node
+ Name vhrname = nf.create(Name.NS_DEFAULT_URI, node.getId().toString());
+
+ try {
+ NodeState vhrState = versionManager.getPersistenceManager().load(vhid);
+ NodeState vhrParentState = versionManager.getPersistenceManager().load(vhrState.getParentId());
+
+ if (vhrParentState.hasChildNodeEntry(vhrname)) {
+ NodeState modifiedParent = (NodeState) vworkspaceChanges.get(vhrState.getParentId());
+ if (modifiedParent == null) {
+ modifiedParent = new NodeState(vhrParentState, NodeState.STATUS_EXISTING_MODIFIED, true);
+ }
+
+ Calendar now = Calendar.getInstance();
+ String appendme = " (disconnected by RepositoryChecker on "
+ + ISO8601.format(now) + ")";
+ modifiedParent.renameChildNodeEntry(vhid,
+ nf.create(vhrname.getNamespaceURI(), vhrname.getLocalName() + appendme));
+
+ vworkspaceChanges.modified(modifiedParent);
+ }
+ else {
+ log.info("child node entry " + vhrname + " for version history not found inside parent folder.");
+ }
+ } catch (Exception ex) {
+ log.error("while trying to rename the version history", ex);
+ }
+ }
}
private void removeProperty(NodeState node, Name name) {
Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InconsistentVersioningState.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InconsistentVersioningState.java?rev=1185711&r1=1185710&r2=1185711&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InconsistentVersioningState.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InconsistentVersioningState.java Tue Oct 18 15:09:09 2011
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.core.version;
+import org.apache.jackrabbit.core.id.NodeId;
+
/**
* The <code>InconsistentVersionControlState</code> is used to signal
* inconsistencies in the versioning related state of a node, such
@@ -23,6 +25,8 @@ package org.apache.jackrabbit.core.versi
*/
public class InconsistentVersioningState extends RuntimeException {
+ private final NodeId versionHistoryNodeId;
+
/**
* Constructs a new instance of this class with the specified detail
* message.
@@ -32,18 +36,28 @@ public class InconsistentVersioningState
*/
public InconsistentVersioningState(String message) {
super(message);
+ this.versionHistoryNodeId = null;
}
/**
* Constructs a new instance of this class with the specified detail
- * message and root cause.
+ * message.
*
- * @param message the detail message. The detail message is saved for
- * later retrieval by the {@link #getMessage()} method.
- * @param rootCause root failure cause
+ * @param message the detail message. The detail message is saved for
+ * later retrieval by the {@link #getMessage()} method.
+ * @param rootCause root cause (or otherwise <code>null</code>)
+ * @param versionHistoryNodeId NodeId of the version history that has problems (or otherwise <code>null</code>
*/
- public InconsistentVersioningState(String message, Throwable rootCause) {
+ public InconsistentVersioningState(String message, NodeId versionHistoryNodeId, Throwable rootCause) {
super(message, rootCause);
+ this.versionHistoryNodeId = versionHistoryNodeId;
}
+ /**
+ * @return the NodeId of the version history having problems or <code>null</code>
+ * when unknown.
+ */
+ public NodeId getVersionHistoryNodeId() {
+ return this.versionHistoryNodeId;
+ }
}
Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java?rev=1185711&r1=1185710&r2=1185711&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java Tue Oct 18 15:09:09 2011
@@ -213,7 +213,7 @@ class InternalVersionHistoryImpl extends
}
return v;
} catch (RepositoryException e) {
- throw new IllegalArgumentException("Failed to create version " + name + ".");
+ throw new InconsistentVersioningState("Failed to create version " + name + " in VHR " + historyId + ".", historyId, null);
}
}
@@ -238,7 +238,7 @@ class InternalVersionHistoryImpl extends
v = new InternalVersionImpl(this, child, child.getName());
}
} catch (RepositoryException e) {
- throw new InconsistentVersioningState("Version does not have a jcr:frozenNode: " + child.getNodeId(), e);
+ throw new InconsistentVersioningState("Version does not have a jcr:frozenNode: " + child.getNodeId(), historyId, e);
}
}
return v;
Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java?rev=1185711&r1=1185710&r2=1185711&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java Tue Oct 18 15:09:09 2011
@@ -119,7 +119,7 @@ class InternalVersionImpl extends Intern
try {
return (InternalFrozenNode) vMgr.getItem(getFrozenNodeId());
} catch (RepositoryException e) {
- throw new InconsistentVersioningState("unable to retrieve frozen node: " + e, e);
+ throw new InconsistentVersioningState("unable to retrieve frozen node: " + e, null, e);
}
}
Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java?rev=1185711&r1=1185710&r2=1185711&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java Tue Oct 18 15:09:09 2011
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.core.version;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_ACTIVITY;
+import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_ROOTVERSION;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_VERSIONHISTORY;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.MIX_VERSIONABLE;
@@ -30,6 +31,7 @@ import javax.jcr.version.VersionExceptio
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
+import org.apache.jackrabbit.core.state.ChildNodeEntry;
import org.apache.jackrabbit.core.state.ItemStateException;
import org.apache.jackrabbit.core.state.LocalItemStateManager;
import org.apache.jackrabbit.core.state.NodeReferences;
@@ -314,12 +316,14 @@ abstract class InternalVersionManagerBas
if (parent != null && parent.hasNode(name)) {
NodeStateEx history = parent.getNode(name, 1);
if (history == null) {
- throw new InconsistentVersioningState("Unexpected failure to get child node " + name + " on parent node" + parent.getNodeId());
+ throw new InconsistentVersioningState("Unexpected failure to get child node " + name + " on parent node " + parent.getNodeId());
+ }
+ ChildNodeEntry rootv = history.getState().getChildNodeEntry(JCR_ROOTVERSION, 1);
+ if (rootv == null) {
+ throw new InconsistentVersioningState("missing child node entry for " + JCR_ROOTVERSION + " on version history node " + history.getNodeId());
}
- Name root = NameConstants.JCR_ROOTVERSION;
- info = new VersionHistoryInfo(
- history.getNodeId(),
- history.getState().getChildNodeEntry(root, 1).getId());
+ info = new VersionHistoryInfo(history.getNodeId(),
+ rootv.getId());
}
} finally {
lock.release();