Barry Oglesby created GEODE-2878:
------------------------------------
Summary: If an exception occurs after retrieving an XAConnection
from the ConnectionProvider but before returning it to the application, the
GemFireTransactionDataSource doesn't return it to the pool
Key: GEODE-2878
URL: https://issues.apache.org/jira/browse/GEODE-2878
Project: Geode
Issue Type: Bug
Components: transactions
Reporter: Barry Oglesby
In my test, I have 5 threads inserting rows into a derby database.
At first, as connections are being used and returned, the {{activeConnections}}
is updated correctly:
{noformat}
Thread-16: AbstractPoolCache.getPooledConnectionFromPool activeConnections=1
Thread-15: AbstractPoolCache.getPooledConnectionFromPool activeConnections=2
Thread-17: AbstractPoolCache.getPooledConnectionFromPool activeConnections=3
Thread-14: AbstractPoolCache.getPooledConnectionFromPool activeConnections=4
Thread-18: AbstractPoolCache.getPooledConnectionFromPool activeConnections=5
Thread-16: AbstractPoolCache.returnPooledConnectionToPool activeConnections=4
Thread-14: AbstractPoolCache.returnPooledConnectionToPool activeConnections=3
Thread-18: AbstractPoolCache.returnPooledConnectionToPool activeConnections=2
Thread-17: AbstractPoolCache.returnPooledConnectionToPool activeConnections=1
Thread-15: AbstractPoolCache.returnPooledConnectionToPool activeConnections=0
{noformat}
But, then if an exception occurs after retrieving the {{XAConnection}}, it is
not return to the {{ConnectionProvider}}.
In my test, the exception occurs in
{{GemFireTransactionDataSource.registerTranxConnection}}:
{noformat}
java.lang.Exception: GemFireTransactionDataSource-registerTranxConnection().
Exception in registering the XAResource with the Transaction.Exception
occurred= javax.transaction.SystemException:
GlobalTransaction::enlistResource::error while enlisting XAResource
org.apache.derby.client.am.XaException: XAER_RMFAIL : An error occurred during
a deferred connect reset and the connection has been terminated.
at
org.apache.geode.internal.datasource.GemFireTransactionDataSource.registerTranxConnection(GemFireTransactionDataSource.java:218)
at
org.apache.geode.internal.datasource.GemFireTransactionDataSource.getConnection(GemFireTransactionDataSource.java:127)
at TestServer.saveToDB(TestServer.java:177)
at TestServer.save(TestServer.java:154)
at TestServer.loadEntriesIntoDerby(TestServer.java:127)
at TestServer$1.run(TestServer.java:112)
at java.lang.Thread.run(Thread.java:745)
{noformat}
This is after the {{XAConnection}} has been retrieved from the
{{ConnectionProvider}} and the {{activeConnections}} incremented, but before it
has been returned to the application. Neither the {{registerTranxConnection}}
method nor its caller ({{getConnection}}) does anything other than to throw the
exception. The {{XAConnection}} is not returned to the pool nor is the
{{activeConnections}} decremented.
Finally, if enough of these exceptions occur, the test stops because all 30
(default max) connections are in use. They aren't really in use, its just that
the activeConnections counter hasn't been properly maintained.
{noformat}
Thread-14: AbstractPoolCache.returnPooledConnectionToPool activeConnections=28
Thread-15: AbstractPoolCache.getPooledConnectionFromPool activeConnections=29
Thread-14: AbstractPoolCache.getPooledConnectionFromPool activeConnections=30
Thread-16: AbstractPoolCache.returnPooledConnectionToPool activeConnections=29
Thread-18: AbstractPoolCache.returnPooledConnectionToPool activeConnections=28
Thread-15: AbstractPoolCache.getPooledConnectionFromPool activeConnections=29
Thread-17: AbstractPoolCache.getPooledConnectionFromPool activeConnections=30
Thread-14: AbstractPoolCache.returnPooledConnectionToPool activeConnections=29
Thread-18: AbstractPoolCache.getPooledConnectionFromPool activeConnections=30
Thread-17: AbstractPoolCache.returnPooledConnectionToPool activeConnections=29
Thread-14: AbstractPoolCache.getPooledConnectionFromPool activeConnections=30
{noformat}
It doesn't really matter what the exception is. If one occurs after retrieving
the {{XAConnection}}, it needs to be returned to the {{ConnectionProvider}} or
at the very least, the {{activeConnections}} must be decremented.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)