Author: manik.surtani(a)jboss.com
Date: 2009-04-02 07:30:07 -0400 (Thu, 02 Apr 2009)
New Revision: 7969
Modified:
core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java
Log:
JBCACHE-1497 When adding node, CacheLoaderInterceptor locks child node before
MVCCLockingInterceptor locks parent
Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java 2009-04-02 10:04:04
UTC (rev 7968)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java 2009-04-02 11:30:07
UTC (rev 7969)
@@ -179,7 +179,13 @@
* @throws InterruptedException if interrupted
*/
@SuppressWarnings("unchecked")
- public ReadCommittedNode wrapNodeForWriting(InvocationContext context, Fqn fqn,
boolean lockForWriting, boolean createIfAbsent, boolean includeInvalidNodes, boolean
forRemoval, boolean force) throws InterruptedException {
+ public ReadCommittedNode wrapNodeForWriting(InvocationContext context, Fqn fqn,
boolean lockForWriting, boolean createIfAbsent, boolean includeInvalidNodes, boolean
forRemoval, boolean force) throws InterruptedException
+ {
+ return wrapNodeForWriting(context, fqn, lockForWriting, createIfAbsent,
includeInvalidNodes, forRemoval, force, false);
+ }
+
+ public ReadCommittedNode wrapNodeForWriting(InvocationContext context, Fqn fqn,
boolean lockForWriting, boolean createIfAbsent, boolean includeInvalidNodes, boolean
forRemoval, boolean force, boolean childIsNull) throws InterruptedException
+ {
Fqn parentFqn = null;
ReadCommittedNode n = (ReadCommittedNode) context.lookUpNode(fqn);
if (createIfAbsent && n != null && n.isNullNode()) n = null;
@@ -242,13 +248,13 @@
if (n == null && force)
{
parentFqn = fqn.getParent();
- if (isParentLockNeeded(parentFqn, context)) wrapNodeForWriting(context,
parentFqn, true, false, includeInvalidNodes, false, force);
+ if (isParentLockNeeded(parentFqn, context) && !childIsNull)
wrapNodeForWriting(context, parentFqn, true, false, includeInvalidNodes, false, force,
true);
acquireLock(context, fqn);
}
// now test if we need to lock the parent as well.
- if ((n != null || force) && forRemoval && (parentFqn == null ?
parentFqn = fqn.getParent() : parentFqn) != null && isParentLockNeeded(parentFqn,
context))
- wrapNodeForWriting(context, parentFqn, true, false, includeInvalidNodes, false,
force);
+ if ((n != null || force) && forRemoval && (parentFqn == null ?
parentFqn = fqn.getParent() : parentFqn) != null && isParentLockNeeded(parentFqn,
context) && !childIsNull)
+ wrapNodeForWriting(context, parentFqn, true, false, includeInvalidNodes, false,
force, n == null);
return n;
}