Author: manik.surtani(a)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(a)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)