I've narrowed down the problem to AutoConnectionTracker. It's not
completing, which isn't allowing the connections to be returned to the pool.
https://github.com/apache/tomee/blob/master/container/openejb-core/src/main/java/org/apache/openejb/resource/AutoConnectionTracker.java#L174

getResource() is throwing an IllegalStateException. The JavaDoc (
https://docs.oracle.com/javaee/7/api/javax/transaction/TransactionSynchronizationRegistry.html#getResource-java.lang.Object-)
states it should throw an ISE if a current transaction is not Active. The
transaction is in the state ROLLED_BACK when AutoConnectionTracker tries to
call getResource().

I think the Geronimo implementation (
https://github.com/apache/geronimo-txmanager/blame/trunk/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java#L203)
maybe be a little too strict. The JTA Spec pdf doesn't offer exact hints of
which statuses (
https://docs.oracle.com/javaee/7/api/javax/transaction/Status.html) should
be have getResource _not_ throw an ISE unfortunately. I was thinking of
changing Geronimo's implementation to check for anything
but STATUS_UNKNOWN, and STATUS_NO_TRANSACTION.

The other way is to cast Transaction to the Geronimo implementation and use
Geronimo specific APIs to get call getResource(). Do you guys have any
preference which route I should take to fix?


On Mon, Aug 26, 2019 at 9:15 AM Jonathan S. Fisher <exabr...@gmail.com>
wrote:

> https://github.com/exabrial/tomee-jms2-bug/tree/connection-pool-leak
>
> Here's a project that reproduces the bug. This project intentionally
> exceeds the transaction timeout (of 1s). Each invocation, the connection is
> not returned to the pool and eventually you run out, causing your
> application to freeze.
>
>
>
> On Fri, Aug 23, 2019 at 2:37 PM Jonathan S. Fisher <exabr...@gmail.com>
> wrote:
>
>> Hello Apache friends :) I have a question about the JTA and JMS/RA specs:
>>
>> If you borrow something from a RA, like a JMS Connection, and you're in
>> XA Transaction, is it necessary to call connection.close()? It would seem
>> JTA should be smart enough to know the connection is enrolled for 2 phase
>> commit and should be smart enough to close it, but I'm not sure if that's
>> part of the spec.
>>
>> In TomEE 7.0.6 we're noticing that if you borrow a JMS Connection with
>> connectionFactory.createConnection(), and your code fails to call close()
>> before the transaction completion, the connection leaks. (And
>> unfortunately, calling close() after the transaction completes doesn't
>> mitigate the problem). It took awhile for us to track this down.
>>
>> This becomes a huge problem if you're calling external services in your
>> transaction. Let's say you have a reasonable transaction timeout of 30s
>> set. You call three services, and they end up taking 15s a piece. Even if
>> you're doing the right thing and you have connection.close() in a finally
>> block, because your transaction isn't active when you call close, it leaks
>> and it just gets "stuck" as an active connection, which eventually you hit
>> the pool limit and your app freezes.
>>
>> On a separate note, we noticed if you open a connection outside of the
>> scope of a transaction, then start a transaction, then create a session
>> with session_transacted option, the session does not participate in the JTA
>> (which seems out of spec). One most open the connection inside the
>> transaction, AND open the session in the transaction, and close the
>> connection in the transaction for everything to work.
>>
>> I'll get a reproducing project created, but I was curious if anyone knew
>> offhand what the spec says.
>>
>> cheers, and thanks,
>> -[the other] Jonathan
>>
>> --
>> Jonathan | exabr...@gmail.com
>> Pessimists, see a jar as half empty. Optimists, in contrast, see it as
>> half full.
>> Engineers, of course, understand the glass is twice as big as it needs to
>> be.
>>
>
>
> --
> Jonathan | exabr...@gmail.com
> Pessimists, see a jar as half empty. Optimists, in contrast, see it as
> half full.
> Engineers, of course, understand the glass is twice as big as it needs to
> be.
>


-- 
Jonathan | exabr...@gmail.com
Pessimists, see a jar as half empty. Optimists, in contrast, see it as half
full.
Engineers, of course, understand the glass is twice as big as it needs to
be.

Reply via email to