[jbosscache-commits] JBoss Cache SVN: r7247 - in core/branches/flat/src/main/java/org/jboss/starobrno: atomic and 4 other directories.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Wed Dec 3 11:29:44 EST 2008


Author: manik.surtani at jboss.com
Date: 2008-12-03 11:29:44 -0500 (Wed, 03 Dec 2008)
New Revision: 7247

Modified:
   core/branches/flat/src/main/java/org/jboss/starobrno/CacheDelegate.java
   core/branches/flat/src/main/java/org/jboss/starobrno/CacheSPI.java
   core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java
   core/branches/flat/src/main/java/org/jboss/starobrno/batch/AutoBatchSupport.java
   core/branches/flat/src/main/java/org/jboss/starobrno/batch/BatchContainer.java
   core/branches/flat/src/main/java/org/jboss/starobrno/interceptors/BatchingInterceptor.java
   core/branches/flat/src/main/java/org/jboss/starobrno/tree/NodeImpl.java
   core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeCacheImpl.java
   core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeStructureSupport.java
   core/branches/flat/src/main/java/org/jboss/starobrno/util/Immutables.java
Log:
Improvements in auto batching

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/CacheDelegate.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/CacheDelegate.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/CacheDelegate.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -21,14 +21,6 @@
  */
 package org.jboss.starobrno;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-
 import org.jboss.cache.CacheStatus;
 import org.jboss.cache.Version;
 import org.jboss.cache.buddyreplication.BuddyManager;
@@ -40,12 +32,7 @@
 import org.jboss.starobrno.commands.CommandsFactory;
 import org.jboss.starobrno.commands.read.GetKeyValueCommand;
 import org.jboss.starobrno.commands.read.SizeCommand;
-import org.jboss.starobrno.commands.write.ClearCommand;
-import org.jboss.starobrno.commands.write.EvictCommand;
-import org.jboss.starobrno.commands.write.PutKeyValueCommand;
-import org.jboss.starobrno.commands.write.PutMapCommand;
-import org.jboss.starobrno.commands.write.RemoveCommand;
-import org.jboss.starobrno.commands.write.ReplaceCommand;
+import org.jboss.starobrno.commands.write.*;
 import org.jboss.starobrno.config.Configuration;
 import org.jboss.starobrno.config.ConfigurationException;
 import org.jboss.starobrno.container.DataContainer;
@@ -65,6 +52,13 @@
 import org.jboss.starobrno.transaction.TransactionTable;
 import org.jgroups.Address;
 
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * @author Mircea.Markus at jboss.com
  */
@@ -434,4 +428,9 @@
    {
       return getAtomicMap(key);
    }
+
+   public BatchContainer getBatchContainer()
+   {
+      return batchContainer;
+   }
 }

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/CacheSPI.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/CacheSPI.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/CacheSPI.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -21,18 +21,13 @@
  */
 package org.jboss.starobrno;
 
-import java.util.List;
-
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-
 import net.jcip.annotations.ThreadSafe;
-
 import org.jboss.cache.Node;
 import org.jboss.cache.NodeSPI;
 import org.jboss.cache.buddyreplication.BuddyManager;
 import org.jboss.cache.buddyreplication.GravitateResult;
 import org.jboss.cache.marshall.Marshaller;
+import org.jboss.starobrno.batch.BatchContainer;
 import org.jboss.starobrno.context.InvocationContext;
 import org.jboss.starobrno.factories.ComponentRegistry;
 import org.jboss.starobrno.interceptors.base.CommandInterceptor;
@@ -45,6 +40,10 @@
 import org.jboss.starobrno.transaction.GlobalTransaction;
 import org.jboss.starobrno.transaction.TransactionTable;
 
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import java.util.List;
+
 /**
  * A more detailed interface to {@link Cache}, which is used when writing plugins for or extending JBoss Cache.  A reference
  * to this interface should only be obtained when it is passed in to your code, for example when you write an
@@ -215,4 +214,6 @@
    Object getDirect(Object key);
 
    LockManager getLockManager();
+
+   BatchContainer getBatchContainer();
 }

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -22,6 +22,7 @@
 package org.jboss.starobrno.atomic;
 
 import org.jboss.starobrno.Cache;
+import org.jboss.starobrno.CacheSPI;
 import org.jboss.starobrno.batch.AutoBatchSupport;
 
 import java.util.Collection;
@@ -36,11 +37,14 @@
 public class AtomicHashMapProxy<K, V> extends AutoBatchSupport implements AtomicMap<K, V>
 {
    Object deltaMapKey;
+   Cache cache;
 
    public AtomicHashMapProxy(Cache cache, Object deltaMapKey)
    {
       this.cache = cache;
       this.deltaMapKey = deltaMapKey;
+      assertBatchingSupported(cache.getConfiguration());
+      this.batchContainer = ((CacheSPI) cache).getBatchContainer();
    }
 
    // internal helper, reduces lots of casts.

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/batch/AutoBatchSupport.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/batch/AutoBatchSupport.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/batch/AutoBatchSupport.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -22,7 +22,8 @@
 package org.jboss.starobrno.batch;
 
 import net.jcip.annotations.NotThreadSafe;
-import org.jboss.starobrno.Cache;
+import org.jboss.starobrno.config.Configuration;
+import org.jboss.starobrno.config.ConfigurationException;
 
 /**
  * Enables for automatic batching.
@@ -40,12 +41,18 @@
          return new BatchDetails();
       }
    };
-   protected Cache cache;
+   protected BatchContainer batchContainer;
 
+   protected void assertBatchingSupported(Configuration c)
+   {
+      if (!c.isInvocationBatchingEnabled())
+         throw new ConfigurationException("Invocation batching not enabled in current configuration!  Please use the <invocationBatching /> element.");
+   }
+
    protected void startAtomic()
    {
       BatchDetails bd = batchDetails.get();
-      if (!bd.startedBatch) bd.startedBatch = cache.startBatch();
+      if (!bd.startedBatch) bd.startedBatch = batchContainer.startBatch(true);
       bd.invocationCount++;
    }
 
@@ -55,7 +62,7 @@
       bd.invocationCount--;
       if (bd.startedBatch && bd.invocationCount == 0)
       {
-         cache.endBatch(true);
+         batchContainer.endBatch(true, true);
          bd.startedBatch = false;
       }
    }

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/batch/BatchContainer.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/batch/BatchContainer.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/batch/BatchContainer.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -38,6 +38,14 @@
 {
    TransactionManager transactionManager;
    private ThreadLocal<Transaction> batchTransactionContainer = new ThreadLocal<Transaction>();
+   private ThreadLocal<Boolean> suspendTxAfterInvocation = new ThreadLocal<Boolean>()
+   {
+      @Override
+      protected Boolean initialValue()
+      {
+         return false;
+      }
+   };
 
    @Inject
    void inject(TransactionManager transactionManager)
@@ -53,12 +61,22 @@
     */
    public boolean startBatch() throws CacheException
    {
+      return startBatch(false);
+   }
+
+   public boolean startBatch(boolean autoBatch) throws CacheException
+   {
       try
       {
          if (transactionManager.getTransaction() == null && batchTransactionContainer.get() == null)
          {
             transactionManager.begin();
-            batchTransactionContainer.set(transactionManager.suspend());
+            suspendTxAfterInvocation.set(!autoBatch);
+
+            if (autoBatch)
+               batchTransactionContainer.set(transactionManager.getTransaction());
+            else
+               batchTransactionContainer.set(transactionManager.suspend());  // do not suspend if this is from an AutoBatch!
             return true;
          }
          return false;
@@ -71,13 +89,21 @@
 
    public void endBatch(boolean success)
    {
+      endBatch(false, success);
+   }
+
+   public void endBatch(boolean autoBatch, boolean success)
+   {
       Transaction tx = batchTransactionContainer.get();
       if (tx == null) return;
       Transaction existingTx = null;
       try
       {
          existingTx = transactionManager.getTransaction();
-         transactionManager.resume(tx);
+
+         if ((existingTx == null && !autoBatch) || !tx.equals(existingTx))
+            transactionManager.resume(tx);
+
          if (success)
             tx.commit();
          else
@@ -92,7 +118,7 @@
          batchTransactionContainer.remove();
          try
          {
-            if (existingTx != null) transactionManager.resume(existingTx);
+            if (!autoBatch && existingTx != null) transactionManager.resume(existingTx);
          }
          catch (Exception e)
          {
@@ -105,4 +131,9 @@
    {
       return batchTransactionContainer.get();
    }
+
+   public boolean isSuspendTxAfterInvocation()
+   {
+      return suspendTxAfterInvocation.get();
+   }
 }

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/interceptors/BatchingInterceptor.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/interceptors/BatchingInterceptor.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/interceptors/BatchingInterceptor.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -72,7 +72,7 @@
       }
       finally
       {
-         if (tx != null && transactionManager.getTransaction() != null)
+         if (tx != null && transactionManager.getTransaction() != null && batchContainer.isSuspendTxAfterInvocation())
             transactionManager.suspend();
       }
    }

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/tree/NodeImpl.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/tree/NodeImpl.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/tree/NodeImpl.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -26,9 +26,7 @@
 import org.jboss.starobrno.util.Immutables;
 import org.jboss.starobrno.util.Util;
 
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
  * Implementation backed by an {@link AtomicMap}
@@ -78,9 +76,11 @@
       return Immutables.immutableSetCopy(getStructure().keySet());
    }
 
+   @SuppressWarnings("unchecked")
    public Map<K, V> getData()
    {
-      return Immutables.immutableMapCopy(getDataInternal());
+      return Collections.unmodifiableMap(new HashMap(getDataInternal()));
+//      return Immutables.immutableMapCopy(getDataInternal());
    }
 
    public Set<K> getKeys()
@@ -358,7 +358,7 @@
 
    AtomicMap<K, V> getDataInternal()
    {
-      return (AtomicMap<K, V>) atomicMapCache.getAtomicMap(dataKey);
+      return (AtomicMap<K, V>) cache.getAtomicMap(dataKey);
    }
 
 //   void updateStructure(FastCopyHashMap<Object, Fqn> s)
@@ -368,7 +368,7 @@
 
    AtomicMap<Object, Fqn> getStructure()
    {
-      return atomicMapCache.getAtomicMap(structureKey, Object.class, Fqn.class);
+      return cache.getAtomicMap(structureKey, Object.class, Fqn.class);
    }
 
    public boolean equals(Object o)

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeCacheImpl.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeCacheImpl.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeCacheImpl.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -91,7 +91,7 @@
       startAtomic();
       try
       {
-         AtomicMap map = atomicMapCache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.DATA));
+         AtomicMap map = cache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.DATA));
          return map == null ? null : (V) map.remove(key);
       }
       finally
@@ -148,7 +148,7 @@
    @SuppressWarnings("unchecked")
    public V get(Fqn fqn, K key)
    {
-      Map m = atomicMapCache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.DATA));
+      Map m = cache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.DATA));
       if (m == null) return null;
       return (V) m.get(key);
    }
@@ -296,7 +296,7 @@
       try
       {
          createNodeInCache(fqn);
-         return (V) atomicMapCache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.DATA)).put(key, value);
+         return (V) cache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.DATA)).put(key, value);
       }
       finally
       {

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeStructureSupport.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeStructureSupport.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/tree/TreeStructureSupport.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -29,12 +29,13 @@
 
 public class TreeStructureSupport extends AutoBatchSupport
 {
-   AtomicMapCache atomicMapCache;
+   AtomicMapCache cache;
 
    public TreeStructureSupport(Cache cache)
    {
-      this.cache = cache;
-      atomicMapCache = (AtomicMapCache) cache;
+      this.cache = (AtomicMapCache) cache;
+      assertBatchingSupported(cache.getConfiguration());
+      batchContainer = ((CacheSPI) cache).getBatchContainer();
    }
 
    public boolean exists(Fqn f)
@@ -76,8 +77,8 @@
          }
 //         FastCopyHashMap<Object, Fqn> structure = new FastCopyHashMap<Object, Fqn>();
 //         cache.put(structureKey, structure);
-         atomicMapCache.getAtomicMap(structureKey);
-         atomicMapCache.getAtomicMap(dataKey);
+         cache.getAtomicMap(structureKey);
+         cache.getAtomicMap(dataKey);
          return true;
       }
       finally
@@ -88,7 +89,7 @@
 
    AtomicMap<Object, Fqn> getStructure(Fqn fqn)
    {
-      return atomicMapCache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.STRUCTURE), Object.class, Fqn.class);
+      return cache.getAtomicMap(new NodeKey(fqn, NodeKey.Type.STRUCTURE), Object.class, Fqn.class);
    }
 
 //   void updateStructure(Fqn fqn, FastCopyHashMap<Object, Fqn> structure)

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/util/Immutables.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/util/Immutables.java	2008-12-03 16:28:05 UTC (rev 7246)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/util/Immutables.java	2008-12-03 16:29:44 UTC (rev 7247)
@@ -22,7 +22,6 @@
 package org.jboss.starobrno.util;
 
 import org.jboss.cache.util.ImmutableListCopy;
-import org.jboss.starobrno.atomic.AtomicHashMapProxy;
 
 import java.io.Serializable;
 import java.lang.reflect.Array;
@@ -189,8 +188,6 @@
    @SuppressWarnings("unchecked")
    private static <T extends Map> T attemptKnownMapCopy(T map)
    {
-      if (map instanceof AtomicHashMapProxy)
-         return map; // just a proxy!!
       if (map instanceof FastCopyHashMap)
          return (T) ((FastCopyHashMap) map).clone();
       if (map instanceof HashMap)




More information about the jbosscache-commits mailing list