[jbosscache-commits] JBoss Cache SVN: r7969 - core/trunk/src/main/java/org/jboss/cache/mvcc.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Thu Apr 2 07:30:08 EDT 2009


Author: manik.surtani at 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;
    }




More information about the jbosscache-commits mailing list