You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2004/12/20 15:11:33 UTC
svn commit: r122850 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: nodetype version version/persistence
Author: tripod
Date: Mon Dec 20 06:11:31 2004
New Revision: 122850
URL: http://svn.apache.org/viewcvs?view=rev&rev=122850
Log:
- fixing deadlock in persistence version manager
- fixing issues with frozen version histories
Modified:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml?view=diff&rev=122850&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml&r1=122849&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml&r2=122850
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml Mon Dec 20 06:11:31 2004
@@ -312,5 +312,10 @@
<supertype>nt:unstructured</supertype>
</supertypes>
</nodeType>
+ <nodeType name="rep:frozenVersionHistory" mixin="false" orderableChildNodes="true">
+ <supertypes>
+ <supertype>nt:unstructured</supertype>
+ </supertypes>
+ </nodeType>
</nodeTypes>
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java?view=diff&rev=122850&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java&r1=122849&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java&r2=122850
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java Mon Dec 20 06:11:31 2004
@@ -207,10 +207,11 @@
VirtualNodeState parent = getNodeState(new NodeId(fn.getParent().getId()));
state = createNodeState(
parent,
- VersionManager.NODENAME_FROZEN,
+ fn.getName(),
id.getUUID(),
NodeTypeRegistry.NT_FROZEN_VERSIONABLE_CHILD);
- mapFrozenNode(state, fn);
+ state.setPropertyValue(VersionManager.PROPNAME_BASE_VERSION, InternalValue.create(UUID.fromString(fn.getBaseVersionId())));
+ state.setPropertyValue(VersionManager.PROPNAME_VERSION_HISTORY, InternalValue.create(UUID.fromString(fn.getVersionHistoryId())));
} else {
// not found, throw
throw new NoSuchItemStateException(id.toString());
@@ -358,23 +359,6 @@
for (int i=0; i<nodes.length; i++) {
state.addChildNodeEntry(nodes[i].getName(), nodes[i].getId());
}
- return state;
- }
-
- /**
- * maps a frozen node
- * @param state
- * @param node
- * @return
- * @throws RepositoryException
- */
- private VirtualNodeState mapFrozenNode(VirtualNodeState state,
- InternalFrozenVersionHistory node)
- throws RepositoryException {
-
- // map properties
- state.setPropertyValue(VersionManager.PROPNAME_BASE_VERSION, InternalValue.create(node.getBaseVersionId()));
- state.setPropertyValue(VersionManager.PROPNAME_VERSION_HISTORY, InternalValue.create(node.getVersionHistoryId()));
return state;
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java?view=diff&rev=122850&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java&r1=122849&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java&r2=122850
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java Mon Dec 20 06:11:31 2004
@@ -236,7 +236,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized Version checkin(NodeImpl node) throws RepositoryException {
+ public Version checkin(NodeImpl node) throws RepositoryException {
InternalVersion version = vMgr.checkin(node);
return (Version) node.getSession().getNodeByUUID(version.getId());
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java?view=diff&rev=122850&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java&r1=122849&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java&r2=122850
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java Mon Dec 20 06:11:31 2004
@@ -289,11 +289,11 @@
case OnParentVersionAction.VERSION:
if (child.isNodeType(NodeTypeRegistry.MIX_VERSIONABLE)) {
// create frozen versionable child
- PersistentNode newChild = node.addNode(child.getQName(), NodeTypeRegistry.NT_FROZEN_VERSIONABLE_CHILD);
+ PersistentNode newChild = node.addNode(child.getQName(), NativePVM.NT_REP_FROZEN_HISTORY);
newChild.setPropertyValue(VersionManager.PROPNAME_VERSION_HISTORY,
- InternalValue.create(UUID.fromString(child.getVersionHistory().getUUID())));
+ InternalValue.create(child.getVersionHistory().getUUID()));
newChild.setPropertyValue(VersionManager.PROPNAME_BASE_VERSION,
- InternalValue.create(UUID.fromString(child.getBaseVersion().getUUID())));
+ InternalValue.create(child.getBaseVersion().getUUID()));
break;
}
// else copy
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java?view=diff&rev=122850&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java&r1=122849&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java&r2=122850
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java Mon Dec 20 06:11:31 2004
@@ -49,6 +49,8 @@
* <p>
* on startup, the entire structure is traversed, in order to get a mapping
* from real to persistent uuids.
+ * <p>
+ * todo: the persistence is not synchronized yet and could lead to multi-threading issues
*/
public class NativePVM implements PersistentVersionManager {
@@ -108,6 +110,11 @@
protected static final QName NT_REP_FROZEN = new QName(NamespaceRegistryImpl.NS_REP_URI, "frozen");
/**
+ * the nodetype name of a persistent frozen history
+ */
+ protected static final QName NT_REP_FROZEN_HISTORY = new QName(NamespaceRegistryImpl.NS_REP_URI, "frozenVersionHistory");
+
+ /**
* the persistent root node of the version histories
*/
private final PersistentNode historyRoot;
@@ -212,8 +219,10 @@
throws ItemStateException, RepositoryException {
PersistentId id = new PersistentId(realUUID, state);
if (id.type != PersistentId.TYPE_UNDEFINED) {
- idsByExternal.put(id.externalId, id);
- idsByInternal.put(id.internalId, id);
+ synchronized(idsByExternal) {
+ idsByExternal.put(id.externalId, id);
+ idsByInternal.put(id.internalId, id);
+ }
if (id.type == PersistentId.TYPE_HISTORY) {
histories.add(id.externalId);
}
@@ -227,7 +236,9 @@
* @return
*/
private PersistentId getIdByExternal(String uuid) {
- return (PersistentId) idsByExternal.get(uuid);
+ synchronized(idsByExternal) {
+ return (PersistentId) idsByExternal.get(uuid);
+ }
}
/**
@@ -246,8 +257,10 @@
* @return
*/
private PersistentId getIdByExternal(String uuid, int type) {
- PersistentId id = (PersistentId) idsByExternal.get(uuid);
- return id != null && id.type == type ? id : null;
+ synchronized(idsByExternal) {
+ PersistentId id = (PersistentId) idsByExternal.get(uuid);
+ return id != null && id.type == type ? id : null;
+ }
}
/**
@@ -257,7 +270,7 @@
* @return the newly created version history.
* @throws RepositoryException
*/
- public synchronized InternalVersionHistory createVersionHistory(NodeImpl node)
+ public InternalVersionHistory createVersionHistory(NodeImpl node)
throws RepositoryException {
// create deep path
@@ -292,7 +305,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized InternalVersionHistory getVersionHistory(String histId)
+ public InternalVersionHistory getVersionHistory(String histId)
throws RepositoryException {
PersistentId pid = getIdByExternal(histId, PersistentId.TYPE_HISTORY);
@@ -305,7 +318,7 @@
* @param histId
* @return
*/
- public synchronized boolean hasVersionHistory(String histId) {
+ public boolean hasVersionHistory(String histId) {
return getIdByExternal(histId, PersistentId.TYPE_HISTORY) != null;
}
@@ -315,7 +328,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized Iterator getVersionHistoryIds() throws RepositoryException {
+ public Iterator getVersionHistoryIds() throws RepositoryException {
return histories.iterator();
}
@@ -325,7 +338,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized int getNumVersionHistories() throws RepositoryException {
+ public int getNumVersionHistories() throws RepositoryException {
return histories.size();
}
@@ -336,7 +349,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized InternalVersion getVersion(String histId, String versionId)
+ public InternalVersion getVersion(String histId, String versionId)
throws RepositoryException {
InternalVersionHistory history = getVersionHistory(histId);
return history.getVersion(versionId);
@@ -349,7 +362,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized InternalVersion getVersion(String versionId)
+ public InternalVersion getVersion(String versionId)
throws RepositoryException {
PersistentId pid = getIdByExternal(versionId, PersistentId.TYPE_VERSION);
@@ -362,7 +375,7 @@
* @param versionId
* @return
*/
- public synchronized boolean hasVersion(String versionId) {
+ public boolean hasVersion(String versionId) {
return getIdByExternal(versionId, PersistentId.TYPE_VERSION) != null;
}
@@ -371,7 +384,7 @@
* @param externalId
* @return
*/
- public synchronized boolean hasItem(String externalId) {
+ public boolean hasItem(String externalId) {
return getIdByExternal(externalId) != null;
}
@@ -381,7 +394,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized InternalVersionItem getItemByExternal(String externalId)
+ public InternalVersionItem getItemByExternal(String externalId)
throws RepositoryException {
PersistentId pid = getIdByExternal(externalId);
return pid==null ? null : getItem(pid);
@@ -393,7 +406,7 @@
* @return
* @throws RepositoryException
*/
- public synchronized InternalVersionItem getItemByInternal(String internalId)
+ public InternalVersionItem getItemByInternal(String internalId)
throws RepositoryException {
PersistentId pid = getIdByInternal(internalId);
return pid==null ? null : getItem(pid);
@@ -405,7 +418,7 @@
* @return
* @throws RepositoryException
*/
- synchronized private InternalVersionItem getItem(PersistentId pid)
+ private InternalVersionItem getItem(PersistentId pid)
throws RepositoryException {
InternalVersionItem item =(InternalVersionItem) items.get(pid);
@@ -440,7 +453,7 @@
* @throws RepositoryException
* @see javax.jcr.Node#checkin()
*/
- public synchronized InternalVersion checkin(NodeImpl node) throws RepositoryException {
+ public InternalVersion checkin(NodeImpl node) throws RepositoryException {
// assuming node is versionable and checkout (check in nodeimpl)
// To create a new version of a versionable node N, the client calls N.checkin.
// This causes the following series of events:
@@ -501,7 +514,7 @@
private static final int TYPE_HISTORY = 1;
private static final int TYPE_VERSION = 2;
private static final int TYPE_FROZEN = 3;
- private static final int TYPE_FROZEN_HISTORY = 3;
+ private static final int TYPE_FROZEN_HISTORY = 4;
/** the type of the persistent node */
private final int type;
@@ -530,7 +543,7 @@
// ignore given externalid, and generate new one
this.externalId = UUID.randomUUID().toString();
type = TYPE_FROZEN;
- } else if (state.getNodeTypeName().equals(NodeTypeRegistry.NT_FROZEN_VERSIONABLE_CHILD)) {
+ } else if (state.getNodeTypeName().equals(NT_REP_FROZEN_HISTORY)) {
// ignore given externalid, and generate new one
this.externalId = UUID.randomUUID().toString();
type = TYPE_FROZEN_HISTORY;