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 2006/05/31 22:09:23 UTC
svn commit: r410655 - in
/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core:
TransactionContext.java state/SharedItemStateManager.java
version/XAVersionManager.java
Author: tripod
Date: Wed May 31 13:09:22 2006
New Revision: 410655
URL: http://svn.apache.org/viewvc?rev=410655&view=rev
Log:
JCR-447 deadlock on concurrent commit/locking
Modified:
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/TransactionContext.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/TransactionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/TransactionContext.java?rev=410655&r1=410654&r2=410655&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/TransactionContext.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/TransactionContext.java Wed May 31 13:09:22 2006
@@ -135,14 +135,20 @@
afterOperation();
status = Status.STATUS_PREPARED;
- Thread rollbackThread = new Thread(this, "RollbackThread");
- rollbackThread.start();
-
if (txe != null) {
+ // force immediate rollback on error.
+ try {
+ rollback();
+ } catch (XAException e) {
+ /* ignore */
+ }
XAException e = new XAException(XAException.XA_RBOTHER);
e.initCause(txe);
throw e;
}
+
+ // start rollback thread in case the commit is never issued
+ new Thread(this, "RollbackThread").start();
}
/**
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?rev=410655&r1=410654&r2=410655&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Wed May 31 13:09:22 2006
@@ -21,6 +21,7 @@
import org.apache.jackrabbit.core.ItemId;
import org.apache.jackrabbit.core.NodeId;
import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.version.XAVersionManager;
import org.apache.jackrabbit.core.nodetype.EffectiveNodeType;
import org.apache.jackrabbit.core.nodetype.NodeDefId;
import org.apache.jackrabbit.core.nodetype.NodeTypeConflictException;
@@ -150,6 +151,13 @@
new VirtualItemStateProvider[0];
/**
+ * special flag for then this manager is used by the version manager and
+ * transactional versioning operations. in this case, deadlocks could occurr
+ * (see issue JCR-447).
+ */
+ private boolean noLockHack = false;
+
+ /**
* Read-/Write-Lock to synchronize access on this item state manager.
*/
private final ReadWriteLock rwLock =
@@ -157,10 +165,13 @@
/**
* Allow reader when there is no active writer, or current
* thread owns the write lock (reentrant).
+ * <p/>
+ * the 'noLockHack' is only temporary (hopefully)
*/
protected boolean allowReader() {
return activeWriter_ == null
- || activeWriter_ == Thread.currentThread();
+ || activeWriter_ == Thread.currentThread()
+ || noLockHack;
}
};
@@ -185,6 +196,16 @@
if (!hasNonVirtualItemState(rootNodeId)) {
createRootNodeState(rootNodeId, ntReg);
}
+ }
+
+ /**
+ * enables or disables the write-lock hack. this should only be called by
+ * the {@link XAVersionManager}.
+ *
+ * @param noLockHack
+ */
+ public void setNoLockHack(boolean noLockHack) {
+ this.noLockHack = noLockHack;
}
//-----------------------------------------------------< ItemStateManager >
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java?rev=410655&r1=410654&r2=410655&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java Wed May 31 13:09:22 2006
@@ -438,6 +438,7 @@
* Delegate the call to our XA item state manager.
*/
public void prepare(TransactionContext tx) throws TransactionException {
+ vMgr.getSharedStateMgr().setNoLockHack(true);
((XAItemStateManager) stateMgr).prepare(tx);
}
@@ -449,6 +450,7 @@
*/
public void commit(TransactionContext tx) throws TransactionException {
((XAItemStateManager) stateMgr).commit(tx);
+ vMgr.getSharedStateMgr().setNoLockHack(false);
Map xaItems = (Map) tx.getAttribute(ITEMS_ATTRIBUTE_NAME);
vMgr.itemsUpdated(xaItems.values());
@@ -461,6 +463,7 @@
*/
public void rollback(TransactionContext tx) {
((XAItemStateManager) stateMgr).rollback(tx);
+ vMgr.getSharedStateMgr().setNoLockHack(false);
}
/**