[jbosscache-commits] JBoss Cache SVN: r7427 - in core/trunk/src: main/java/org/jboss/cache/mvcc and 1 other directories.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Fri Jan 9 09:08:22 EST 2009


Author: manik.surtani at jboss.com
Date: 2009-01-09 09:08:22 -0500 (Fri, 09 Jan 2009)
New Revision: 7427

Modified:
   core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java
   core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java
   core/trunk/src/test/java/org/jboss/cache/loader/CacheLoaderWithRollbackTest.java
Log:
JBCACHE-1455 -  Rollback corrupts nodes loaded from cache loader

Modified: core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java	2009-01-09 12:45:40 UTC (rev 7426)
+++ core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java	2009-01-09 14:08:22 UTC (rev 7427)
@@ -117,11 +117,11 @@
       {
          if (command.isErase())
          {
-             replace(ctx, command.getFqn());
+            replace(ctx, command.getFqn());
          }
          else
          {
-             loadIfNeeded(ctx, command.getFqn(), null, true, true, false, false, false, false, true);
+            loadIfNeeded(ctx, command.getFqn(), null, true, true, false, false, false, false, true);
          }
       }
       return invokeNextInterceptor(ctx, command);
@@ -215,7 +215,7 @@
    public Object visitRollbackCommand(InvocationContext ctx, RollbackCommand command) throws Throwable
    {
       // clean up nodesCreated map
-      if (trace) log.trace("Removing temporarily created nodes from treecache");
+      if (trace) log.trace("Removing temporarily created nodes");
 
       // this needs to be done in reverse order.
       List list = ctx.getTransactionContext().getDummyNodesCreatedByCacheLoader();
@@ -268,7 +268,7 @@
       }
       return invokeNextInterceptor(ctx, command);
    }
-   
+
    private void replace(InvocationContext ctx, Fqn fqn) throws InterruptedException
    {
       NodeSPI n = helper.wrapNodeForReading(ctx, fqn, true);

Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java	2009-01-09 12:45:40 UTC (rev 7426)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java	2009-01-09 14:08:22 UTC (rev 7427)
@@ -50,7 +50,7 @@
 
    protected static enum Flags
    {
-      CHANGED(0x1), CREATED(0x2), DELETED(0x4);
+      CHANGED(0x1), CREATED(0x2), DELETED(0x4), ORIG_DATA_LOADED(0x8), ORIG_CHILDREN_LOADED(0x16);
       final byte mask;
 
       Flags(int mask)
@@ -132,7 +132,9 @@
       {
          Fqn fqn = getFqn();
          if (trace)
+         {
             log.trace("Updating node [" + fqn + "].  deleted=" + isDeleted() + " valid=" + isValid() + " changed=" + isChanged() + " created=" + isFlagSet(CREATED));
+         }
 
          // check if node has been deleted.
          if (isFlagSet(DELETED))
@@ -170,6 +172,8 @@
    private void reset()
    {
       backup = null;
+      super.setChildrenLoaded(isFlagSet(ORIG_CHILDREN_LOADED));
+      super.setDataLoaded(isFlagSet(ORIG_DATA_LOADED));
       flags = 0;
    }
 
@@ -201,7 +205,9 @@
          retval = container.peekInternalNode(parentFqn, false);
       }
       if (retval == null)
+      {
          throw new NodeNotExistsException("Node " + parentFqn + " cannot be found in any context or data container!");
+      }
       return retval;
    }
 
@@ -242,9 +248,13 @@
    public void setCreated(boolean created)
    {
       if (created)
+      {
          setFlag(CREATED);
+      }
       else
+      {
          unsetFlag(CREATED);
+      }
    }
 
    // do not delegate deletion flags to the InternalNode since this will cause problems with concurrent readers.  Maintain
@@ -260,9 +270,13 @@
    public void markAsDeleted(boolean deleted)
    {
       if (deleted)
+      {
          setFlag(DELETED);
+      }
       else
+      {
          unsetFlag(DELETED);
+      }
    }
 
    @Override
@@ -270,4 +284,18 @@
    {
       throw new UnsupportedOperationException("Recursive deletion not allowed!");
    }
+
+   @Override
+   public void setChildrenLoaded(boolean loaded)
+   {
+      if (node.isChildrenLoaded()) setFlag(ORIG_CHILDREN_LOADED);
+      super.setChildrenLoaded(loaded);
+   }
+
+   @Override
+   public void setDataLoaded(boolean loaded)
+   {
+      if (node.isDataLoaded()) setFlag(ORIG_DATA_LOADED);
+      super.setDataLoaded(loaded);
+   }
 }

Modified: core/trunk/src/test/java/org/jboss/cache/loader/CacheLoaderWithRollbackTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/loader/CacheLoaderWithRollbackTest.java	2009-01-09 12:45:40 UTC (rev 7426)
+++ core/trunk/src/test/java/org/jboss/cache/loader/CacheLoaderWithRollbackTest.java	2009-01-09 14:08:22 UTC (rev 7427)
@@ -19,10 +19,17 @@
    final Fqn fqn = Fqn.fromString("/a/b");
    final String key = "key";
 
+   protected Configuration.NodeLockingScheme getNodeLockingScheme()
+   {
+      return Configuration.NodeLockingScheme.MVCC;
+   }
+
+
    public Cache<String, String> init(boolean passivation) throws Exception
    {
       CacheLoaderConfig cacheLoaderConfig = UnitTestConfigurationFactory.buildSingleCacheLoaderConfig(passivation, "", DummyInMemoryCacheLoader.class.getName(), "", false, true, false, false, false);
       Configuration cfg = new Configuration();
+      cfg.setNodeLockingScheme(getNodeLockingScheme());
       cfg.setCacheLoaderConfig(cacheLoaderConfig);
       cfg.getRuntimeConfig().setTransactionManager(new DummyTransactionManager());
       Cache<String, String> cache = new DefaultCacheFactory<String, String>().createCache(cfg);




More information about the jbosscache-commits mailing list