From 73e3f5c7264db923edeb7d85e23bacd06bc8e5b6 Mon Sep 17 00:00:00 2001 From: Manik Surtani Date: Fri, 7 Jan 2011 18:21:59 +0000 Subject: [PATCH] ISPN-845 - Memory leaks for 2 phase commit readonly transaction --- .../transaction/xa/TransactionXaAdapter.java | 3 ++ .../infinispan/tx/ReadOnlyTxCleanupTest.java | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 core/src/test/java/org/infinispan/tx/ReadOnlyTxCleanupTest.java diff --git a/core/src/main/java/org/infinispan/transaction/xa/TransactionXaAdapter.java b/core/src/main/java/org/infinispan/transaction/xa/TransactionXaAdapter.java index be8090c46135..041c7d05ecc5 100644 --- a/core/src/main/java/org/infinispan/transaction/xa/TransactionXaAdapter.java +++ b/core/src/main/java/org/infinispan/transaction/xa/TransactionXaAdapter.java @@ -158,6 +158,9 @@ public void start(Xid xid, int i) throws XAException { public void end(Xid xid, int i) throws XAException { if (trace) log.trace("end called on tx " + this.localTransaction.getGlobalTransaction()); + // force a cleanup to release any objects held. Some TMs don't call commit if it is a READ ONLY tx. See ISPN-845 + LocalTransaction localTransaction = txTable.getLocalTransaction(xid); + if (localTransaction != null && localTransaction.isReadOnly()) commit(xid, false); } public void forget(Xid xid) throws XAException { diff --git a/core/src/test/java/org/infinispan/tx/ReadOnlyTxCleanupTest.java b/core/src/test/java/org/infinispan/tx/ReadOnlyTxCleanupTest.java new file mode 100644 index 000000000000..2c75a08937f3 --- /dev/null +++ b/core/src/test/java/org/infinispan/tx/ReadOnlyTxCleanupTest.java @@ -0,0 +1,49 @@ +package org.infinispan.tx; + +import org.infinispan.Cache; +import org.infinispan.config.Configuration; +import org.infinispan.manager.EmbeddedCacheManager; +import org.infinispan.test.SingleCacheManagerTest; +import org.infinispan.test.TestingUtil; +import org.infinispan.test.fwk.CleanupAfterMethod; +import org.infinispan.test.fwk.TestCacheManagerFactory; +import org.infinispan.transaction.xa.TransactionTable; +import org.testng.annotations.Test; + +import javax.transaction.HeuristicMixedException; +import javax.transaction.HeuristicRollbackException; +import javax.transaction.NotSupportedException; +import javax.transaction.RollbackException; +import javax.transaction.SystemException; +import javax.transaction.TransactionManager; + +@Test(testName = "tx.ReadOnlyTxCleanupTest", groups = "functional") +@CleanupAfterMethod +public class ReadOnlyTxCleanupTest extends SingleCacheManagerTest { + @Override + protected EmbeddedCacheManager createCacheManager() throws Exception { + Configuration c = new Configuration(); + return TestCacheManagerFactory.createCacheManager(c, true); + } + + public void testReadOnlyTx() throws SystemException, RollbackException, HeuristicRollbackException, HeuristicMixedException, NotSupportedException { + Cache c1 = cacheManager.getCache(); + Cache c2 = cacheManager.getCache("two"); + + c1.put("c1", "c1"); + c2.put("c2", "c2"); + + TransactionManager tm1 = tm(); + tm1.begin(); + c1.get("c1"); + c2.get("c2"); + tm1.commit(); + + TransactionTable tt1 = TestingUtil.extractComponent(c1, TransactionTable.class); + TransactionTable tt2 = TestingUtil.extractComponent(c2, TransactionTable.class); + + assert tt1.getLocalTxCount() == 0; + assert tt2.getLocalTxCount() == 0; + } + +}