Author: manik.surtani(a)jboss.com
Date: 2007-12-19 07:50:02 -0500 (Wed, 19 Dec 2007)
New Revision: 4875
Added:
core/branches/1.4.X/tests/perf/org/jboss/cache/manualtests/OptimisticMemLeakTest.java
Modified:
core/branches/1.4.X/src/org/jboss/cache/interceptors/TxInterceptor.java
Log:
JBCACHE-1246 - memory leak when using fail silently option
Modified: core/branches/1.4.X/src/org/jboss/cache/interceptors/TxInterceptor.java
===================================================================
--- core/branches/1.4.X/src/org/jboss/cache/interceptors/TxInterceptor.java 2007-12-18
20:45:17 UTC (rev 4874)
+++ core/branches/1.4.X/src/org/jboss/cache/interceptors/TxInterceptor.java 2007-12-19
12:50:02 UTC (rev 4875)
@@ -92,7 +92,12 @@
if (optionOverride!= null && optionOverride.isFailSilently() &&
ctx.getTransaction() != null)
{
- suspendedTransaction = txManager.suspend();
+ // make sure we remove the tx and global tx from the transaction table, since
we don't care about this transaction
+ // and will just suspend it. - JBCACHE-1246
+ GlobalTransaction gtx = txTable.remove(ctx.getTransaction());
+ if (gtx != null) txTable.remove(gtx);
+
+ suspendedTransaction = txManager.suspend();
// set the tx in the invocation context to null now! - JBCACHE-785
ctx.setTransaction(null);
ctx.setGlobalTransaction(null);
Added:
core/branches/1.4.X/tests/perf/org/jboss/cache/manualtests/OptimisticMemLeakTest.java
===================================================================
--- core/branches/1.4.X/tests/perf/org/jboss/cache/manualtests/OptimisticMemLeakTest.java
(rev 0)
+++
core/branches/1.4.X/tests/perf/org/jboss/cache/manualtests/OptimisticMemLeakTest.java 2007-12-19
12:50:02 UTC (rev 4875)
@@ -0,0 +1,50 @@
+package org.jboss.cache.manualtests;
+
+import junit.framework.TestCase;
+import org.jboss.cache.DummyTransactionManagerLookup;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.TreeCache;
+import org.jboss.cache.config.Option;
+
+import javax.transaction.TransactionManager;
+
+/**
+ * To test memory leak reported in
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4112143#...
+ *
+ * @author Manik Surtani (<a
href="mailto:manik@jboss.org">manik@jboss.org</a>)
+ */
+public class OptimisticMemLeakTest extends TestCase
+{
+ private TreeCache cache;
+ private TransactionManager tm;
+ private Fqn fqn = Fqn.fromString("/a/b/c");
+ private String key = "key", value = "value";
+
+ protected void tearDown()
+ {
+ cache.stop();
+ }
+
+ protected void setUp() throws Exception
+ {
+ cache = new TreeCache();
+ cache.setNodeLockingScheme("OPTIMISTIC");
+
cache.setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
+ cache.startService();
+ tm = cache.getTransactionManager();
+ }
+
+ public void testLeakWithFailSilently() throws Exception
+ {
+ tm.begin();
+ Option option = new Option();
+ option.setFailSilently(true);
+ cache.put(fqn, key, value, option);
+ tm.commit();
+
+ int gtxCnt = cache.getTransactionTable().getNumGlobalTransactions();
+ int txCnt = cache.getTransactionTable().getNumLocalTransactions();
+ assertEquals("Global transaction count is > 0", 0, gtxCnt);
+ assertEquals("Local transaction count is > 0", 0, txCnt);
+ }
+}