geode-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Barry Oglesby (JIRA)" <j...@apache.org>
Subject [jira] [Created] (GEODE-2878) 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
Date Thu, 04 May 2017 23:55:04 GMT
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)

Mime
View raw message