Index: src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java (revision 1067462) +++ src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java (working copy) @@ -27,6 +27,7 @@ import org.apache.jackrabbit.core.cluster.WorkspaceRecord.CreateWorkspaceAction; import org.apache.jackrabbit.core.config.ClusterConfig; import org.apache.jackrabbit.core.id.NodeId; +import org.apache.jackrabbit.core.journal.AbstractJournal; import org.apache.jackrabbit.core.journal.InstanceRevision; import org.apache.jackrabbit.core.journal.Journal; import org.apache.jackrabbit.core.journal.JournalException; @@ -36,6 +37,7 @@ import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException; import org.apache.jackrabbit.core.observation.EventState; import org.apache.jackrabbit.core.state.ChangeLog; +import org.apache.jackrabbit.core.version.InternalVersionManagerImpl; import org.apache.jackrabbit.core.xml.ClonedInputSource; import org.apache.jackrabbit.spi.QNodeTypeDefinition; import org.slf4j.Logger; @@ -636,6 +638,11 @@ public void setListener(UpdateEventListener listener) { if (workspace == null) { versionUpdateListener = listener; + if (journal instanceof AbstractJournal && + versionUpdateListener instanceof InternalVersionManagerImpl) { + ((AbstractJournal) journal).setInternalVersionManager( + (InternalVersionManagerImpl) versionUpdateListener); + } } else { wspUpdateListeners.remove(workspace); if (listener != null) { Index: src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java (revision 1067462) +++ src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java (working copy) @@ -21,6 +21,8 @@ import java.util.HashMap; import java.util.Map; +import org.apache.jackrabbit.core.version.InternalVersionManagerImpl; +import org.apache.jackrabbit.core.version.VersioningLock; import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver; @@ -86,6 +88,11 @@ private File repHome; /** + * Internal version manager. + */ + private InternalVersionManagerImpl internalVersionManager; + + /** * {@inheritDoc} */ public void init(String id, NamespaceResolver resolver) throws JournalException { @@ -176,6 +183,20 @@ * {@inheritDoc} */ public void sync() throws JournalException { + if (internalVersionManager != null) { + VersioningLock.ReadLock lock = + internalVersionManager.acquireReadLock(); + try { + internalSync(); + } finally { + lock.release(); + } + } else { + internalSync(); + } + } + + private void internalSync() throws JournalException { try { rwLock.readLock().acquire(); } catch (InterruptedException e) { @@ -237,6 +258,20 @@ * @throws JournalException if an error occurs */ public void lockAndSync() throws JournalException { + if (internalVersionManager != null) { + VersioningLock.ReadLock lock = + internalVersionManager.acquireReadLock(); + try { + internalLockAndSync(); + } finally { + lock.release(); + } + } else { + internalLockAndSync(); + } + } + + private void internalLockAndSync() throws JournalException { try { rwLock.writeLock().acquire(); } catch (InterruptedException e) { @@ -354,6 +389,13 @@ } /** + * Set the version manager. + */ + public void setInternalVersionManager(InternalVersionManagerImpl internalVersionManager) { + this.internalVersionManager = internalVersionManager; + } + + /** * Return the repository home. * * @return the repository home Index: src/main/java/org/apache/jackrabbit/core/version/VersioningLock.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/version/VersioningLock.java (revision 1067462) +++ src/main/java/org/apache/jackrabbit/core/version/VersioningLock.java (working copy) @@ -32,7 +32,7 @@ * to be re-entered not just by a thread that's already holding the lock but * by any thread within the same transaction. */ -class VersioningLock { +public class VersioningLock { /** * The internal read-write lock. @@ -127,7 +127,7 @@ /** * {@inheritDoc} - */ + */ protected synchronized boolean startWrite() { Xid currentXid = TransactionContext.getCurrentXid(); if (activeXid != null && isSameGlobalTx(currentXid)) { // already held; re-acquire Index: src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java (revision 1067462) +++ src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java (working copy) @@ -187,7 +187,7 @@ * acquires the read lock on this version manager. * @return returns the read lock */ - protected VersioningLock.ReadLock acquireReadLock() { + public VersioningLock.ReadLock acquireReadLock() { while (true) { try { return rwLock.acquireReadLock(); @@ -725,7 +725,7 @@ /** * Set version label on the specified version. - * + * * @param history version history * @param version version name * @param label version label