You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/12/02 14:58:09 UTC
svn commit: r1041379 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version:
InternalVersionManagerBase.java InternalVersionManagerImpl.java
InternalXAVersionManager.java
Author: jukka
Date: Thu Dec 2 13:58:09 2010
New Revision: 1041379
URL: http://svn.apache.org/viewvc?rev=1041379&view=rev
Log:
JCR-2828: InternalVersionManager deadlock
Move the write lock higher up in the call chain to prevent this problem.
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java?rev=1041379&r1=1041378&r2=1041379&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java Thu Dec 2 13:58:09 2010
@@ -16,6 +16,10 @@
*/
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_VERSIONHISTORY;
+import static org.apache.jackrabbit.spi.commons.name.NameConstants.MIX_VERSIONABLE;
+
import java.util.Calendar;
import javax.jcr.ItemNotFoundException;
@@ -554,6 +558,45 @@ abstract class InternalVersionManagerBas
}
/**
+ * Creates a new version of the given node using the given version
+ * creation time.
+ *
+ * @param node the node to be checked in
+ * @param created version creation time
+ * @return the new version
+ * @throws RepositoryException if an error occurs
+ */
+ protected InternalVersion checkin(NodeStateEx node, Calendar created)
+ throws RepositoryException {
+ WriteOperation operation = startWriteOperation();
+ try {
+ boolean simple =
+ !node.getEffectiveNodeType().includesNodeType(MIX_VERSIONABLE);
+ InternalVersionHistoryImpl vh;
+ if (simple) {
+ // in simple versioning the history id needs to be calculated
+ vh = (InternalVersionHistoryImpl) getVersionHistoryOfNode(
+ node.getNodeId());
+ } else {
+ // in full versioning, the history id can be retrieved via
+ // the property
+ vh = (InternalVersionHistoryImpl) getVersionHistory(
+ node.getPropertyValue(JCR_VERSIONHISTORY).getNodeId());
+ }
+
+ InternalVersion version =
+ internalCheckin(vh, node, simple, created);
+
+ operation.save();
+ return version;
+ } catch (ItemStateException e) {
+ throw new RepositoryException(e);
+ } finally {
+ operation.close();
+ }
+ }
+
+ /**
* Checks in a node
*
* @param history the version history
@@ -568,26 +611,19 @@ abstract class InternalVersionManagerBas
InternalVersionHistoryImpl history,
NodeStateEx node, boolean simple, Calendar created)
throws RepositoryException {
- WriteOperation operation = startWriteOperation();
- try {
- String versionName = calculateCheckinVersionName(history, node, simple);
- InternalVersionImpl v = history.checkin(
- NameFactoryImpl.getInstance().create("", versionName),
- node, created);
-
- // check for jcr:activity
- if (node.hasProperty(NameConstants.JCR_ACTIVITY)) {
- NodeId actId = node.getPropertyValue(NameConstants.JCR_ACTIVITY).getNodeId();
- InternalActivityImpl act = (InternalActivityImpl) getItem(actId);
- act.addVersion(v);
- }
- operation.save();
- return v;
- } catch (ItemStateException e) {
- throw new RepositoryException(e);
- } finally {
- operation.close();
+ String versionName = calculateCheckinVersionName(history, node, simple);
+ InternalVersionImpl v = history.checkin(
+ NameFactoryImpl.getInstance().create("", versionName),
+ node, created);
+
+ // check for jcr:activity
+ if (node.hasProperty(JCR_ACTIVITY)) {
+ NodeId actId = node.getPropertyValue(JCR_ACTIVITY).getNodeId();
+ InternalActivityImpl act = (InternalActivityImpl) getItem(actId);
+ act.addVersion(v);
}
+
+ return v;
}
/**
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerImpl.java?rev=1041379&r1=1041378&r2=1041379&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerImpl.java Thu Dec 2 13:58:09 2010
@@ -401,26 +401,15 @@ public class InternalVersionManagerImpl
* item-reading listeners in the observation thread.
*/
public InternalVersion checkin(
- final Session session,
- final NodeStateEx node, final Calendar created)
+ Session session, final NodeStateEx node, final Calendar created)
throws RepositoryException {
- return (InternalVersion)
- escFactory.doSourced((SessionImpl) session, new SourcedTarget() {
- public Object run() throws RepositoryException {
- InternalVersionHistoryImpl vh;
- if (node.getEffectiveNodeType().includesNodeType(NameConstants.MIX_VERSIONABLE)) {
- // in full versioning, the history id can be retrieved via
- // the property
- NodeId histId = node.getPropertyValue(NameConstants.JCR_VERSIONHISTORY).getNodeId();
- vh = (InternalVersionHistoryImpl) getVersionHistory(histId);
- return internalCheckin(vh, node, false, created);
- } else {
- // in simple versioning the history id needs to be calculated
- vh = (InternalVersionHistoryImpl) getVersionHistoryOfNode(node.getNodeId());
- return internalCheckin(vh, node, true, created);
- }
- }
- });
+ return (InternalVersion) escFactory.doSourced(
+ (SessionImpl) session,
+ new SourcedTarget() {
+ public Object run() throws RepositoryException {
+ return checkin(node, created);
+ }
+ });
}
/**
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java?rev=1041379&r1=1041378&r2=1041379&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java Thu Dec 2 13:58:09 2010
@@ -233,20 +233,7 @@ public class InternalXAVersionManager ex
Session session, NodeStateEx node, Calendar created)
throws RepositoryException {
if (isInXA()) {
- InternalVersionHistoryImpl vh;
- InternalVersion version;
- if (node.getEffectiveNodeType().includesNodeType(NameConstants.MIX_VERSIONABLE)) {
- // in full versioning, the history id can be retrieved via
- // the property
- NodeId histId = node.getPropertyValue(NameConstants.JCR_VERSIONHISTORY).getNodeId();
- vh = (InternalVersionHistoryImpl) getVersionHistory(histId);
- version = internalCheckin(vh, node, false, created);
- } else {
- // in simple versioning the history id needs to be calculated
- vh = (InternalVersionHistoryImpl) getVersionHistoryOfNode(node.getNodeId());
- version = internalCheckin(vh, node, true, created);
- }
- return version;
+ return checkin(node, created);
} else {
return vMgr.checkin(session, node, created);
}
@@ -480,6 +467,7 @@ public class InternalXAVersionManager ex
* <p/>
* Before modifying version history given, make a local copy of it.
*/
+ @Override
protected InternalVersion internalCheckin(
InternalVersionHistoryImpl history,
NodeStateEx node, boolean simple, Calendar created)