You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2006/10/28 20:37:55 UTC
svn commit: r468719 - in
/geronimo/server/trunk/modules/geronimo-connector/src:
main/java/org/apache/geronimo/connector/
main/java/org/apache/geronimo/connector/outbound/
test/java/org/apache/geronimo/connector/outbound/
Author: djencks
Date: Sat Oct 28 11:37:55 2006
New Revision: 468719
URL: http://svn.apache.org/viewvc?view=rev&rev=468719
Log:
GERONIMO-2529 track connections closed in afterCompletion better
Modified:
geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/ConnectorTransactionContext.java
geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
geronimo/server/trunk/modules/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptorTest.java
Modified: geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/ConnectorTransactionContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/ConnectorTransactionContext.java?view=diff&rev=468719&r1=468718&r2=468719
==============================================================================
--- geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/ConnectorTransactionContext.java (original)
+++ geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/ConnectorTransactionContext.java Sat Oct 28 11:37:55 2006
@@ -26,6 +26,7 @@
import javax.transaction.SystemException;
import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
+import org.apache.geronimo.connector.outbound.TransactionCachingInterceptor;
/**
* @version $Rev$ $Date$
@@ -59,20 +60,30 @@
return ctx;
}
+ public static TransactionCachingInterceptor.ManagedConnectionInfos get(Transaction transaction, ConnectionReleaser key) {
+ ConnectorTransactionContext ctx = get(transaction);
+ TransactionCachingInterceptor.ManagedConnectionInfos infos = ctx.getManagedConnectionInfo(key);
+ if (infos == null) {
+ infos = new TransactionCachingInterceptor.ManagedConnectionInfos();
+ ctx.setManagedConnectionInfo(key, infos);
+ }
+ return infos;
+ }
+
private static void remove(Transaction transaction) {
DATA_INDEX.remove(transaction);
}
private Map managedConnections;
- public synchronized Object getManagedConnectionInfo(ConnectionReleaser key) {
+ private synchronized TransactionCachingInterceptor.ManagedConnectionInfos getManagedConnectionInfo(ConnectionReleaser key) {
if (managedConnections == null) {
return null;
}
- return managedConnections.get(key);
+ return (TransactionCachingInterceptor.ManagedConnectionInfos) managedConnections.get(key);
}
- public synchronized void setManagedConnectionInfo(ConnectionReleaser key, Object info) {
+ private synchronized void setManagedConnectionInfo(ConnectionReleaser key, TransactionCachingInterceptor.ManagedConnectionInfos info) {
if (managedConnections == null) {
managedConnections = new HashMap();
}
Modified: geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java?view=diff&rev=468719&r1=468718&r2=468719
==============================================================================
--- geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java (original)
+++ geronimo/server/trunk/modules/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptor.java Sat Oct 28 11:37:55 2006
@@ -24,6 +24,7 @@
import javax.resource.ResourceException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
+import javax.transaction.SystemException;
import org.apache.geronimo.connector.ConnectorTransactionContext;
import org.apache.geronimo.connector.ConnectionReleaser;
@@ -65,12 +66,7 @@
// get the current transation and status... if there is a problem just assume there is no transaction present
Transaction transaction = TxUtil.getTransactionIfActive(transactionManager);
if (transaction != null) {
- ConnectorTransactionContext connectorTransactionContext = ConnectorTransactionContext.get(transaction);
- ManagedConnectionInfos managedConnectionInfos = (ManagedConnectionInfos) connectorTransactionContext.getManagedConnectionInfo(this);
- if (managedConnectionInfos == null) {
- managedConnectionInfos = new ManagedConnectionInfos();
- connectorTransactionContext.setManagedConnectionInfo(this, managedConnectionInfos);
- }
+ ManagedConnectionInfos managedConnectionInfos = ConnectorTransactionContext.get(transaction, this);
if (connectionInfo.isUnshareable()) {
if (!managedConnectionInfos.containsUnshared(connectionInfo.getManagedConnectionInfo())) {
next.getConnection(connectionInfo);
@@ -80,7 +76,7 @@
ManagedConnectionInfo managedConnectionInfo = managedConnectionInfos.getShared();
if (managedConnectionInfo != null) {
connectionInfo.setManagedConnectionInfo(managedConnectionInfo);
- return;
+ //return;
} else {
next.getConnection(connectionInfo);
managedConnectionInfos.setShared(connectionInfo.getManagedConnectionInfo());
@@ -97,9 +93,20 @@
next.returnConnection(connectionInfo, connectionReturnAction);
return;
}
-
- if (TxUtil.isTransactionActive(transactionManager)) {
- return;
+ Transaction transaction;
+ try {
+ transaction = transactionManager.getTransaction();
+ if (transaction != null) {
+ if (TxUtil.isActive(transaction)) {
+ return;
+ }
+ //We are called from an afterCompletion synchronization. Remove the MCI from the ManagedConnectionInfos
+ //so we don't close it twice
+ ManagedConnectionInfos managedConnectionInfos = ConnectorTransactionContext.get(transaction, this);
+ managedConnectionInfos.remove(connectionInfo.getManagedConnectionInfo());
+ }
+ } catch (SystemException e) {
+ //ignore
}
internalReturn(connectionInfo, connectionReturnAction);
}
@@ -134,7 +141,7 @@
internalReturn(connectionInfo, ConnectionReturnAction.RETURN_HANDLE);
}
- static class ManagedConnectionInfos {
+ public static class ManagedConnectionInfos {
private ManagedConnectionInfo shared;
private Set unshared = Collections.EMPTY_SET;
@@ -159,6 +166,14 @@
public boolean containsUnshared(ManagedConnectionInfo unsharedMCI) {
return this.unshared.contains(unsharedMCI);
+ }
+
+ public void remove(ManagedConnectionInfo managedConnectionInfo) {
+ if (shared == managedConnectionInfo) {
+ shared = null;
+ } else {
+ unshared.remove(managedConnectionInfo);
+ }
}
}
Modified: geronimo/server/trunk/modules/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptorTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptorTest.java?view=diff&rev=468719&r1=468718&r2=468719
==============================================================================
--- geronimo/server/trunk/modules/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptorTest.java (original)
+++ geronimo/server/trunk/modules/geronimo-connector/src/test/java/org/apache/geronimo/connector/outbound/TransactionCachingInterceptorTest.java Sat Oct 28 11:37:55 2006
@@ -110,8 +110,7 @@
private ManagedConnectionInfo getSharedManagedConnectionInfo(Transaction transaction) {
if (transaction == null) return null;
- ConnectorTransactionContext connectorTransactionContext = ConnectorTransactionContext.get(transaction);
- return ((TransactionCachingInterceptor.ManagedConnectionInfos)connectorTransactionContext.getManagedConnectionInfo(transactionCachingInterceptor)).getShared();
+ return ConnectorTransactionContext.get(transaction, transactionCachingInterceptor).getShared();
}
public void testGetConnectionOutsideTransaction() throws Exception {