Author: djencks Date: Tue Aug 11 16:18:57 2009 New Revision: 803183 URL: http://svn.apache.org/viewvc?rev=803183&view=rev Log: GERONIMO-4786 Fix the thread caching interceptor, improve logging, add some docs Modified: geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionReturnAction.java geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ManagedConnectionInfo.java geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java Modified: geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java?rev=803183&r1=803182&r2=803183&view=diff ============================================================================== --- geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java (original) +++ geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractSinglePoolConnectionInterceptor.java Tue Aug 11 16:18:57 2009 @@ -103,7 +103,7 @@ public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) { if (log.isTraceEnabled()) { - log.trace("returning connection " + connectionInfo.getConnectionHandle() + " for MCI " + connectionInfo.getManagedConnectionInfo() + " and MC " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " to pool " + this); + log.trace("returning connection " + connectionInfo.getConnectionHandle() + " for MCI " + connectionInfo.getManagedConnectionInfo() + " to pool " + this); } // not strictly synchronized with destroy(), but pooled operations in internalReturn() are... @@ -120,9 +120,7 @@ try { ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); if (connectionReturnAction == ConnectionReturnAction.RETURN_HANDLE && mci.hasConnectionHandles()) { - if (log.isTraceEnabled()) { - log.trace("Return request at pool with connection handles! " + connectionInfo.getConnectionHandle() + " for MCI " + connectionInfo.getManagedConnectionInfo() + " and MC " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " to pool " + this, new Exception("Stack trace")); - } + log.warn("Return request at pool with connection handles! " + connectionInfo.getConnectionHandle() + " for MCI " + connectionInfo.getManagedConnectionInfo() + " and MC " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " to pool " + this, new Exception("Stack trace")); return; } @@ -136,6 +134,14 @@ } } + + /** + * + * @param connectionInfo connection info to return to pool + * @param connectionReturnAction whether to return to pool or destroy + * @return true if a connection for which a permit was issued was returned (so the permit should be released), + * false if no permit was issued (for instance if the connection was already in the pool and we are destroying it). + */ protected boolean internalReturn(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) { ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); ManagedConnection mc = mci.getManagedConnection(); Modified: geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionReturnAction.java URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionReturnAction.java?rev=803183&r1=803182&r2=803183&view=diff ============================================================================== --- geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionReturnAction.java (original) +++ geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ConnectionReturnAction.java Tue Aug 11 16:18:57 2009 @@ -27,12 +27,18 @@ * @version 1.0 */ public class ConnectionReturnAction { + private final String name; public final static ConnectionReturnAction RETURN_HANDLE = - new ConnectionReturnAction(); + new ConnectionReturnAction("RETURN_HANDLE"); public final static ConnectionReturnAction DESTROY = - new ConnectionReturnAction(); + new ConnectionReturnAction("DESTROY"); - private ConnectionReturnAction() { + private ConnectionReturnAction(String name) { + this.name = name; } + @Override + public String toString() { + return "ConnectionReturnAction{" + name + '}'; + } } Modified: geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ManagedConnectionInfo.java URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ManagedConnectionInfo.java?rev=803183&r1=803182&r2=803183&view=diff ============================================================================== --- geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ManagedConnectionInfo.java (original) +++ geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ManagedConnectionInfo.java Tue Aug 11 16:18:57 2009 @@ -151,4 +151,9 @@ return listener.isFirstConnectionInfo(connectionInfo); } + @Override + public String toString() { + return "ManagedConnectionInfo: " + super.toString() + ". mc: " + managedConnection + "]"; + } + } Modified: geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java?rev=803183&r1=803182&r2=803183&view=diff ============================================================================== --- geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java (original) +++ geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/SinglePoolConnectionInterceptor.java Tue Aug 11 16:18:57 2009 @@ -45,7 +45,6 @@ private boolean selectOneAssumeMatch; //pool is mutable but only changed when protected by write lock on resizelock in superclass -// private PoolDeque pool; private final List pool; public SinglePoolConnectionInterceptor(final ConnectionInterceptor next, @@ -55,7 +54,6 @@ int idleTimeoutMinutes, boolean selectOneAssumeMatch) { super(next, maxSize, minSize, blockingTimeoutMilliseconds, idleTimeoutMinutes); -// pool = new PoolDeque(maxSize); pool = new ArrayList(maxSize); this.selectOneAssumeMatch = selectOneAssumeMatch; } @@ -71,7 +69,7 @@ next.getConnection(connectionInfo); connectionCount++; if (log.isTraceEnabled()) { - log.trace("Supplying new connection MCI: " + connectionInfo.getManagedConnectionInfo() + " MC: " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " from pool: " + this); + log.trace("Supplying new connection MCI: " + connectionInfo.getManagedConnectionInfo() + " from pool: " + this); } return; } else { @@ -83,27 +81,16 @@ if (selectOneAssumeMatch) { connectionInfo.setManagedConnectionInfo(newMCI); if (log.isTraceEnabled()) { - log.trace("Supplying pooled connection without checking matching MCI: " + connectionInfo.getManagedConnectionInfo() + " MC: " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " from pool: " + this); + log.trace("Supplying pooled connection without checking matching MCI: " + connectionInfo.getManagedConnectionInfo() + " from pool: " + this); } return; } + ManagedConnection matchedMC; try { ManagedConnectionInfo mci = connectionInfo.getManagedConnectionInfo(); - ManagedConnection matchedMC = newMCI.getManagedConnectionFactory().matchManagedConnections(Collections.singleton(newMCI.getManagedConnection()), + matchedMC = newMCI.getManagedConnectionFactory().matchManagedConnections(Collections.singleton(newMCI.getManagedConnection()), mci.getSubject(), mci.getConnectionRequestInfo()); - if (matchedMC != null) { - connectionInfo.setManagedConnectionInfo(newMCI); - if (log.isTraceEnabled()) { - log.trace("Supplying pooled connection MCI: " + connectionInfo.getManagedConnectionInfo() + " MC: " + connectionInfo.getManagedConnectionInfo().getManagedConnection() + " from pool: " + this); - } - } else { - //matching failed. - ConnectionInfo returnCI = new ConnectionInfo(); - returnCI.setManagedConnectionInfo(newMCI); - returnConnection(returnCI, ConnectionReturnAction.RETURN_HANDLE); - throw new ResourceException("The pooling strategy does not match the MatchManagedConnections implementation. Please investigate and reconfigure this pool"); - } } catch (ResourceException e) { //something is wrong: destroy connection, rethrow, release permit ConnectionInfo returnCI = new ConnectionInfo(); @@ -111,6 +98,18 @@ returnConnection(returnCI, ConnectionReturnAction.DESTROY); throw e; } + if (matchedMC != null) { + connectionInfo.setManagedConnectionInfo(newMCI); + if (log.isTraceEnabled()) { + log.trace("Supplying pooled connection MCI: " + connectionInfo.getManagedConnectionInfo() + " from pool: " + this); + } + } else { + //matching failed. + ConnectionInfo returnCI = new ConnectionInfo(); + returnCI.setManagedConnectionInfo(newMCI); + returnConnection(returnCI, ConnectionReturnAction.RETURN_HANDLE); + throw new ResourceException("The pooling strategy does not match the MatchManagedConnections implementation. Please investigate and reconfigure this pool"); + } } } @@ -138,7 +137,12 @@ pool.add(mci); } + /** + * @param mci managedConnectionInfo to remove from pool + * @return true if mci was not in pool already, false if mci was in pool already. + */ protected boolean doRemove(ManagedConnectionInfo mci) { + log.info("Removing " + mci + " from pool " + this); return !pool.remove(mci); } Modified: geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java URL: http://svn.apache.org/viewvc/geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java?rev=803183&r1=803182&r2=803183&view=diff ============================================================================== --- geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java (original) +++ geronimo/components/txmanager/branches/geronimo-txmanager-parent-2.1/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/ThreadLocalCachingConnectionInterceptor.java Tue Aug 11 16:18:57 2009 @@ -72,7 +72,12 @@ } public void returnConnection(ConnectionInfo connectionInfo, ConnectionReturnAction connectionReturnAction) { - if (connectionReturnAction == ConnectionReturnAction.DESTROY || connectionInfo.isUnshareable()) { + if (connectionReturnAction == ConnectionReturnAction.DESTROY + || connectionInfo.isUnshareable() + || !connectionInfo.getManagedConnectionInfo().hasConnectionHandles()) { + if (connections.get() == connectionInfo.getManagedConnectionInfo()) { + connections.remove(); + } next.returnConnection(connectionInfo, connectionReturnAction); } }