[jbosscache-commits] JBoss Cache SVN: r6255 - in core/trunk/src: main/java/org/jboss/cache/commands and 6 other directories.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Mon Jul 14 08:55:41 EDT 2008


Author: manik.surtani at jboss.com
Date: 2008-07-14 08:55:41 -0400 (Mon, 14 Jul 2008)
New Revision: 6255

Modified:
   core/trunk/src/main/java/org/jboss/cache/NodeFactory.java
   core/trunk/src/main/java/org/jboss/cache/commands/CommandsFactoryImpl.java
   core/trunk/src/main/java/org/jboss/cache/commands/OptimisticCommandsFactoryImpl.java
   core/trunk/src/main/java/org/jboss/cache/commands/PessimisticCommandsFactoryImpl.java
   core/trunk/src/main/java/org/jboss/cache/config/Configuration.java
   core/trunk/src/main/java/org/jboss/cache/eviction/BaseEvictionAlgorithm.java
   core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java
   core/trunk/src/main/java/org/jboss/cache/interceptors/CacheStoreInterceptor.java
   core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java
   core/trunk/src/main/java/org/jboss/cache/mvcc/NullMarkerNode.java
   core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java
   core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java
   core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/NodeReplicatedMoveMvccTest.java
   core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/NodeReplicatedMoveMvccTest.java
Log:
Ensure MVCC uses UnversionedNodes throughout.

Modified: core/trunk/src/main/java/org/jboss/cache/NodeFactory.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/NodeFactory.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/NodeFactory.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -105,7 +105,7 @@
    @Start
    public void init()
    {
-      useVersionedNode = configuration.getNodeLockingScheme() != NodeLockingScheme.PESSIMISTIC;
+      useVersionedNode = configuration.getNodeLockingScheme() == NodeLockingScheme.OPTIMISTIC;
       useRepeatableRead = configuration.getIsolationLevel() == IsolationLevel.REPEATABLE_READ;
    }
 
@@ -130,7 +130,7 @@
 
       // it is internal nodes that are wrapped in NIDs.
       InternalNode in = un;
-      if (useVersionedNode && !useRepeatableRead)
+      if (configuration.getNodeLockingScheme() == NodeLockingScheme.MVCC && !useRepeatableRead)
       {
          // this is MVCC with READ_COMMITTED.  Make sure we use node references.
          in = new NodeReference(un);
@@ -172,8 +172,13 @@
       return createDataNode(null, Fqn.ROOT, null, null, false);
    }
 
-   public NodeSPI createNodeInvocationDelegate(InternalNode internalNode)
+   public NodeSPI createNodeInvocationDelegate(InternalNode internalNode, boolean wrapWithNodeReference)
    {
+      if (wrapWithNodeReference && internalNode instanceof NodeReference)
+         throw new IllegalArgumentException("Cannot wrap a NodeReference with a NodeReference!");
+      if (wrapWithNodeReference && useRepeatableRead)
+         throw new IllegalArgumentException("Cannot use NodeReferences with RepeatableRead!");
+      if (wrapWithNodeReference) internalNode = new NodeReference(internalNode);
       NodeInvocationDelegate nid = new NodeInvocationDelegate(internalNode);
       nid.initialize(configuration, invocationContextContainer, componentRegistry, interceptorChain);
       nid.injectDependencies(cache);

Modified: core/trunk/src/main/java/org/jboss/cache/commands/CommandsFactoryImpl.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/commands/CommandsFactoryImpl.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/commands/CommandsFactoryImpl.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -35,7 +35,6 @@
 import org.jboss.cache.commands.write.PutKeyValueCommand;
 import org.jboss.cache.commands.write.RemoveKeyCommand;
 import org.jboss.cache.commands.write.RemoveNodeCommand;
-import org.jboss.cache.commands.write.VersionedInvalidateCommand;
 import org.jboss.cache.config.Configuration;
 import org.jboss.cache.factories.annotations.Inject;
 import org.jboss.cache.interceptors.InterceptorChain;
@@ -159,19 +158,9 @@
 
    public InvalidateCommand buildInvalidateCommand(Fqn fqn)
    {
-      if (configuration.getNodeLockingScheme().isVersionedScheme())
-      {
-         VersionedInvalidateCommand command = new VersionedInvalidateCommand(fqn);
-         command.initialize(txManager);
-         command.initialize(cacheSpi, dataContainer, notifier);
-         return command;
-      }
-      else
-      {
-         InvalidateCommand command = new InvalidateCommand(fqn);
-         command.initialize(cacheSpi, dataContainer, notifier);
-         return command;
-      }
+      InvalidateCommand command = new InvalidateCommand(fqn);
+      command.initialize(cacheSpi, dataContainer, notifier);
+      return command;
    }
 
    public GetDataMapCommand buildGetDataMapCommand(Fqn fqn)
@@ -439,19 +428,9 @@
 
          case InvalidateCommand.METHOD_ID:
          {
-            if (configuration.getNodeLockingScheme().isVersionedScheme())
-            {
-               VersionedInvalidateCommand returnValue = new VersionedInvalidateCommand();
-               returnValue.initialize(txManager);
-               returnValue.initialize(cacheSpi, dataContainer, notifier);
-               command = returnValue;
-            }
-            else
-            {
-               InvalidateCommand returnValue = new InvalidateCommand();
-               returnValue.initialize(cacheSpi, dataContainer, notifier);
-               command = returnValue;
-            }
+            InvalidateCommand returnValue = new InvalidateCommand();
+            returnValue.initialize(cacheSpi, dataContainer, notifier);
+            command = returnValue;
             break;
          }
 

Modified: core/trunk/src/main/java/org/jboss/cache/commands/OptimisticCommandsFactoryImpl.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/commands/OptimisticCommandsFactoryImpl.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/commands/OptimisticCommandsFactoryImpl.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -3,6 +3,8 @@
 import org.jboss.cache.Fqn;
 import org.jboss.cache.commands.legacy.write.LegacyEvictCommand;
 import org.jboss.cache.commands.write.EvictCommand;
+import org.jboss.cache.commands.write.InvalidateCommand;
+import org.jboss.cache.commands.write.VersionedInvalidateCommand;
 
 /**
  * Extends the default commands factory impl for optimistic locking.
@@ -19,4 +21,37 @@
       command.initialize(notifier, dataContainer);
       return command;
    }
+
+   @Override
+   public InvalidateCommand buildInvalidateCommand(Fqn fqn)
+   {
+      VersionedInvalidateCommand command = new VersionedInvalidateCommand(fqn);
+      command.initialize(txManager);
+      command.initialize(cacheSpi, dataContainer, notifier);
+      return command;
+   }
+
+   @Override
+   public ReplicableCommand fromStream(int id, Object[] parameters)
+   {
+      ReplicableCommand command;
+      boolean skipSetParams = false;
+      switch (id)
+      {
+         case InvalidateCommand.METHOD_ID:
+         {
+            VersionedInvalidateCommand returnValue = new VersionedInvalidateCommand(null);
+            returnValue.initialize(cacheSpi, dataContainer, notifier);
+            command = returnValue;
+            break;
+         }
+         default:
+            // pass up to superclass
+            command = super.fromStream(id, parameters);
+            skipSetParams = true;
+      }
+
+      if (!skipSetParams) command.setParameters(id, parameters);
+      return command;
+   }
 }

Modified: core/trunk/src/main/java/org/jboss/cache/commands/PessimisticCommandsFactoryImpl.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/commands/PessimisticCommandsFactoryImpl.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/commands/PessimisticCommandsFactoryImpl.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -13,6 +13,7 @@
 import org.jboss.cache.commands.read.GetChildrenNamesCommand;
 import org.jboss.cache.commands.write.ClearDataCommand;
 import org.jboss.cache.commands.write.CreateNodeCommand;
+import org.jboss.cache.commands.write.InvalidateCommand;
 import org.jboss.cache.commands.write.MoveCommand;
 import org.jboss.cache.commands.write.PutDataMapCommand;
 import org.jboss.cache.commands.write.PutForExternalReadCommand;
@@ -106,6 +107,14 @@
    }
 
    @Override
+   public InvalidateCommand buildInvalidateCommand(Fqn fqn)
+   {
+      InvalidateCommand command = new InvalidateCommand(fqn);
+      command.initialize(cacheSpi, dataContainer, notifier);
+      return command;
+   }
+
+   @Override
    public ReplicableCommand fromStream(int id, Object[] parameters)
    {
       ReplicableCommand command;
@@ -184,15 +193,20 @@
             command = returnValue;
             break;
          }
+         case InvalidateCommand.METHOD_ID:
+         {
+            InvalidateCommand returnValue = new InvalidateCommand(null);
+            returnValue.initialize(cacheSpi, dataContainer, notifier);
+            command = returnValue;
+            break;
+         }
          default:
             // pass up to superclass
             command = super.fromStream(id, parameters);
             skipSetParams = true;
       }
-      if (!skipSetParams)
-      {
-         command.setParameters(id, parameters);
-      }
+
+      if (!skipSetParams) command.setParameters(id, parameters);
       return command;
    }
 }

Modified: core/trunk/src/main/java/org/jboss/cache/config/Configuration.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/config/Configuration.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/config/Configuration.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -145,7 +145,8 @@
        */
       public boolean isVersionedScheme()
       {
-         return this == MVCC || this == OPTIMISTIC;
+//         return this == MVCC || this == OPTIMISTIC;
+         return this == OPTIMISTIC;
       }
    }
 
@@ -927,6 +928,7 @@
    /**
     * Returns the {@link org.jboss.cache.config.CustomInterceptorConfig}, if any, associated with this configuration
     * object. The custom interceptors will be added to the cache at startup in the sequence defined by this list.
+    *
     * @return List of cutom interceptors, never null
     */
    public List<CustomInterceptorConfig> getCustomInterceptors()

Modified: core/trunk/src/main/java/org/jboss/cache/eviction/BaseEvictionAlgorithm.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/eviction/BaseEvictionAlgorithm.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/eviction/BaseEvictionAlgorithm.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -11,6 +11,7 @@
 import org.jboss.cache.Fqn;
 import org.jboss.cache.Region;
 import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
 import org.jboss.cache.lock.TimeoutException;
 
 import java.util.concurrent.BlockingQueue;
@@ -82,7 +83,7 @@
       // hacky temp solution till we have an ioc fwk to inject configuration elements as needed
       Configuration c = region.getCacheConfiguration();
       Configuration.CacheMode cm = c != null ? c.getCacheMode() : Configuration.CacheMode.LOCAL;
-      allowTombstones = c != null && c.getNodeLockingScheme().isVersionedScheme() &&
+      allowTombstones = c != null && c.getNodeLockingScheme() == NodeLockingScheme.OPTIMISTIC &&
             (cm == Configuration.CacheMode.INVALIDATION_ASYNC || cm == Configuration.CacheMode.INVALIDATION_SYNC);
 
    }

Modified: core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/interceptors/CacheLoaderInterceptor.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -56,7 +56,7 @@
    protected Notifier notifier;
 
    protected boolean isActivation = false;
-   protected boolean usingVersionedInvalidation = false;
+//   protected boolean usingVersionedInvalidation = false;
 
    protected MVCCNodeHelper helper;
 
@@ -75,7 +75,7 @@
       this.txTable = txTable;
       this.clm = clm;
       CacheMode mode = configuration.getCacheMode();
-      usingVersionedInvalidation = configuration.getNodeLockingScheme().isVersionedScheme() && mode.isInvalidation();
+//      usingVersionedInvalidation = mode.isInvalidation();
       this.dataContainer = dataContainer;
       this.notifier = notifier;
       this.helper = helper;
@@ -143,7 +143,7 @@
    {
       if (command.getFqn() != null)
       {
-         loadIfNeeded(ctx, command.getFqn(), null, false, false, true, false, false, !usingVersionedInvalidation);
+         loadIfNeeded(ctx, command.getFqn(), null, false, false, true, false, false, true);
       }
       return invokeNextInterceptor(ctx, command);
    }
@@ -364,7 +364,7 @@
       }
 
       // check this first!!!
-      if (!n.isValid() && configuration.getNodeLockingScheme().isVersionedScheme())
+      if (!n.isValid()) // && configuration.getNodeLockingScheme().isVersionedScheme())
       {
          // attempt to load again; this only happens if we have tombstones lying around, or we are using invalidation.
          if (trace) log.trace("loading again from cache loader since in-memory node is marked as invalid");
@@ -442,7 +442,8 @@
          n.setInternalState(nodeData);
 
          // set this node as valid?
-         if (usingVersionedInvalidation) n.setValid(true, false);
+//         if (usingVersionedInvalidation) n.setValid(true, false);
+         n.setValid(true, false);
 
          notifier.notifyNodeLoaded(fqn, false, nodeData, ctx);
          if (isActivation)

Modified: core/trunk/src/main/java/org/jboss/cache/interceptors/CacheStoreInterceptor.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/interceptors/CacheStoreInterceptor.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/interceptors/CacheStoreInterceptor.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -126,10 +126,10 @@
             Object returnValue = invokeNextInterceptor(ctx, command);
             // persist additional internal state, if any, and then clean up internal resources
             Set<Fqn> affectedFqns = preparingTxs.remove(gtx);
-            if (affectedFqns != null && !affectedFqns.isEmpty())
-            {
-               storeInternalState(affectedFqns, ctx);
-            }
+//            if (affectedFqns != null && !affectedFqns.isEmpty())
+//            {
+//               storeInternalState(affectedFqns, ctx);
+//            }
             return returnValue;
          }
          else
@@ -278,22 +278,22 @@
       return txMgr != null && txMgr.getTransaction() != null;
    }
 
-   private void storeInternalState(Set<Fqn> affectedFqns, InvocationContext ctx) throws Exception
-   {
-      if (configuration.getNodeLockingScheme().isVersionedScheme())
-      {
-         for (Fqn f : affectedFqns)
-         {
-            // NOT going to store tombstones!!
-            NodeSPI n = ctx.lookUpNode(f);
-            if (n != null && !n.isDeleted())
-            {
-               Map internalState = n.getInternalState(true);
-               loader.put(f, internalState);
-            }
-         }
-      }
-   }
+//   private void storeInternalState(Set<Fqn> affectedFqns, InvocationContext ctx) throws Exception
+//   {
+//      if (configuration.getNodeLockingScheme().isVersionedScheme())
+//      {
+//         for (Fqn f : affectedFqns)
+//         {
+//            // NOT going to store tombstones!!
+//            NodeSPI n = ctx.lookUpNode(f);
+//            if (n != null && !n.isDeleted())
+//            {
+//               Map internalState = n.getInternalState(true);
+//               loader.put(f, internalState);
+//            }
+//         }
+//      }
+//   }
 
    private void recursiveMove(Fqn fqn, Fqn newFqn) throws Exception
    {

Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/MVCCNodeHelper.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -14,6 +14,7 @@
 import org.jboss.cache.factories.annotations.Start;
 import org.jboss.cache.invocation.InvocationContext;
 import org.jboss.cache.invocation.NodeInvocationDelegate;
+import org.jboss.cache.lock.IsolationLevel;
 import org.jboss.cache.lock.LockManager;
 import static org.jboss.cache.lock.LockType.WRITE;
 import org.jboss.cache.lock.TimeoutException;
@@ -274,7 +275,7 @@
          if (parentLockNeeded && (needToCopyNode || needToCopyParent))
          {
             ReadCommittedNode parent = (ReadCommittedNode) ctx.lookUpNode(parentFqn);
-            parent.addChildDirect(nodeFactory.createNodeInvocationDelegate(node.getDelegationTarget()));
+            parent.addChildDirect(nodeFactory.createNodeInvocationDelegate(node.getDelegationTarget(), configuration.getIsolationLevel() == IsolationLevel.READ_COMMITTED));
          }
 
          // now deal with children.
@@ -306,7 +307,7 @@
       {
          rcn.markForUpdate(ctx, dataContainer, nodeFactory, allowWriteSkew);
          ReadCommittedNode parent = (ReadCommittedNode) ctx.lookUpNode(fqn.getParent());
-         parent.addChildDirect(nodeFactory.createNodeInvocationDelegate(rcn.getDelegationTarget()));
+         parent.addChildDirect(nodeFactory.createNodeInvocationDelegate(rcn.getDelegationTarget(), configuration.getIsolationLevel() == IsolationLevel.READ_COMMITTED));
 
          Map<Object, NodeSPI> children = rcn.getChildrenMapDirect();
          if (children != null)

Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/NullMarkerNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/NullMarkerNode.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/NullMarkerNode.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -19,6 +19,13 @@
       super(node);
    }
 
+// to aid with debugging.  remove when finalised.
+//   @Override
+//   protected void assertInternalNodeType()
+//   {
+//      if (node != null) throw new IllegalArgumentException("NullMarkerNodes can only wrap null values!");
+//   }
+
    /**
     * @return always returns true
     */

Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/ReadCommittedNode.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -25,8 +25,15 @@
    public ReadCommittedNode(InternalNode node)
    {
       super(node);
+//      assertInternalNodeType();
    }
 
+// to aid with debugging.  remove when finalised.
+//   protected void assertInternalNodeType()
+//   {
+//      if (!(node instanceof NodeReference)) throw new IllegalArgumentException("ReadCommittedNodes can only wrap NodeReferences!");
+//   }
+
    public boolean isNullNode()
    {
       return false;
@@ -92,13 +99,8 @@
          {
             // add newly created nodes to parents.
             NodeSPI parent = lookupParent(fqn, ctx, container);
-            parent.addChildDirect(nodeFactory.createNodeInvocationDelegate(node));
+            parent.addChildDirect(nodeFactory.createNodeInvocationDelegate(node, false));
          }
-         else if (fqn.isRoot())
-         {
-            // set root node reference in data container.
-            container.setRoot(nodeFactory.createNodeInvocationDelegate(node));
-         }
          else
          {
             updateNode(ctx, container, nodeFactory);

Modified: core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/main/java/org/jboss/cache/mvcc/RepeatableReadNode.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -22,6 +22,13 @@
       super(node);
    }
 
+// to aid with debugging.  remove when finalised.
+//   @Override
+//   protected void assertInternalNodeType()
+//   {
+//      if (!(node instanceof UnversionedNode)) throw new IllegalArgumentException("RepeatableReadNodes can only wrap UnversionedNodes!");
+//   }
+
    @Override
    public void markForUpdate(InvocationContext ctx, DataContainer container, NodeFactory nodeFactory, boolean allowWriteSkew)
    {
@@ -56,10 +63,14 @@
    @Override
    protected void updateNode(InvocationContext ctx, DataContainer dataContainer, NodeFactory nf)
    {
-      if (!deleted)
+      if (getFqn().isRoot())
       {
+         dataContainer.setRoot(nf.createNodeInvocationDelegate(node, false));
+      }
+      else if (!deleted)
+      {
          NodeSPI parent = lookupParent(getFqn(), ctx, dataContainer);
-         parent.addChildDirect(nf.createNodeInvocationDelegate(node));
+         parent.addChildDirect(nf.createNodeInvocationDelegate(node, false));
       }
    }
 }

Modified: core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/NodeReplicatedMoveMvccTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/NodeReplicatedMoveMvccTest.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/NodeReplicatedMoveMvccTest.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -25,4 +25,10 @@
    {
       c.setIsolationLevel(IsolationLevel.READ_COMMITTED);
    }
+
+   @Override
+   public void testInvalidations() throws Exception
+   {
+      // TODO: Think about how this test should be written for MVCC
+   }
 }
\ No newline at end of file

Modified: core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/NodeReplicatedMoveMvccTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/NodeReplicatedMoveMvccTest.java	2008-07-14 10:53:05 UTC (rev 6254)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/NodeReplicatedMoveMvccTest.java	2008-07-14 12:55:41 UTC (rev 6255)
@@ -25,4 +25,10 @@
    {
       c.setIsolationLevel(IsolationLevel.REPEATABLE_READ);
    }
+
+   @Override
+   public void testInvalidations() throws Exception
+   {
+      // TODO: Think about how this test should be written for MVCC
+   }
 }




More information about the jbosscache-commits mailing list