[ 
https://issues.apache.org/jira/browse/AMQ-6391?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15413721#comment-15413721
 ] 

Patrik Dudits edited comment on AMQ-6391 at 8/9/16 3:26 PM:
------------------------------------------------------------

Apparently sending multiple commit {{TransactionInfo}} commands is not an 
option. This is what the other transaction context will get:
{code}
activemq.TransactionContext: ignoring exception from after completion on ended 
transaction: javax.jms.JMSException: Transaction 
'XID:[86,globalId=0000003ffffffd6,branchId=0000003ffffffd6]' has not been 
started. xaErrorCode:-4
javax.jms.JMSException: Transaction 
'XID:[86,globalId=0000003ffffffd6,branchId=0000003ffffffd6]' has not been 
started. xaErrorCode:-4
        at 
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:54)
        at 
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1399)
        at 
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1428)
        at 
org.apache.activemq.TransactionContext.sendXaCommitInfo(TransactionContext.java:630)
        at 
org.apache.activemq.TransactionContext.commit(TransactionContext.java:595)
        at org.apache.activemq.bugs.AMQ6391Test.commit(AMQ6391Test.java:195)
        at org.apache.activemq.bugs.AMQ6391Test.access$200(AMQ6391Test.java:64)
        at 
org.apache.activemq.bugs.AMQ6391Test$1.onMessage(AMQ6391Test.java:116)
        at 
org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1401)
        at 
org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
        at 
org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
        at 
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
        at 
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javax.transaction.xa.XAException: Transaction 
'XID:[86,globalId=0000003ffffffd6,branchId=0000003ffffffd6]' has not been 
started. xaErrorCode:-4
        at 
org.apache.activemq.transaction.Transaction.newXAException(Transaction.java:212)
        at 
org.apache.activemq.broker.TransactionBroker.getTransaction(TransactionBroker.java:351)
        at 
org.apache.activemq.broker.TransactionBroker.commitTransaction(TransactionBroker.java:251)
        at 
org.apache.activemq.broker.MutableBrokerFilter.commitTransaction(MutableBrokerFilter.java:118)
        at 
org.apache.activemq.broker.TransportConnection.processCommitTransactionOnePhase(TransportConnection.java:535)
        at 
org.apache.activemq.command.TransactionInfo.visit(TransactionInfo.java:100)
        at 
org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:333)
        at 
org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:197)
        at 
org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:116)
        at 
org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
        at 
org.apache.activemq.transport.vm.VMTransport.iterate(VMTransport.java:273)
        ... 5 more
{code}

The code can be seen at 
https://github.com/pdudits/activemq/commit/98985af1d4e5800e550562d68a2879697a5051ea


was (Author: pdudits):
Apparently sending multiple commit {{TransactionInfo}}s is not an option. This 
is what the other transaction context will get:
{code}
activemq.TransactionContext: ignoring exception from after completion on ended 
transaction: javax.jms.JMSException: Transaction 
'XID:[86,globalId=0000003ffffffd6,branchId=0000003ffffffd6]' has not been 
started. xaErrorCode:-4
javax.jms.JMSException: Transaction 
'XID:[86,globalId=0000003ffffffd6,branchId=0000003ffffffd6]' has not been 
started. xaErrorCode:-4
        at 
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:54)
        at 
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1399)
        at 
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1428)
        at 
org.apache.activemq.TransactionContext.sendXaCommitInfo(TransactionContext.java:630)
        at 
org.apache.activemq.TransactionContext.commit(TransactionContext.java:595)
        at org.apache.activemq.bugs.AMQ6391Test.commit(AMQ6391Test.java:195)
        at org.apache.activemq.bugs.AMQ6391Test.access$200(AMQ6391Test.java:64)
        at 
org.apache.activemq.bugs.AMQ6391Test$1.onMessage(AMQ6391Test.java:116)
        at 
org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1401)
        at 
org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
        at 
org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
        at 
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
        at 
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javax.transaction.xa.XAException: Transaction 
'XID:[86,globalId=0000003ffffffd6,branchId=0000003ffffffd6]' has not been 
started. xaErrorCode:-4
        at 
org.apache.activemq.transaction.Transaction.newXAException(Transaction.java:212)
        at 
org.apache.activemq.broker.TransactionBroker.getTransaction(TransactionBroker.java:351)
        at 
org.apache.activemq.broker.TransactionBroker.commitTransaction(TransactionBroker.java:251)
        at 
org.apache.activemq.broker.MutableBrokerFilter.commitTransaction(MutableBrokerFilter.java:118)
        at 
org.apache.activemq.broker.TransportConnection.processCommitTransactionOnePhase(TransportConnection.java:535)
        at 
org.apache.activemq.command.TransactionInfo.visit(TransactionInfo.java:100)
        at 
org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:333)
        at 
org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:197)
        at 
org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:116)
        at 
org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
        at 
org.apache.activemq.transport.vm.VMTransport.iterate(VMTransport.java:273)
        ... 5 more
{code}

The code can be seen at 
https://github.com/pdudits/activemq/commit/98985af1d4e5800e550562d68a2879697a5051ea

> Memory leak with FailoverTransport when sending TX messages from MDB
> --------------------------------------------------------------------
>
>                 Key: AMQ-6391
>                 URL: https://issues.apache.org/jira/browse/AMQ-6391
>             Project: ActiveMQ
>          Issue Type: Bug
>            Reporter: Patrik Dudits
>         Attachments: 0001-AMQ-6391-test.patch
>
>
> We observe memory leak in 
> {{FailoverTransport.stateTracker.connectionStates.transactions}} when using 
> XA Transactions in activemq-rar, sending message within same transaction and 
> not using {{useInboundSession}}.
> In such constellation there are two connections enlisted within same 
> transaction. During commit the transaction manager will execute commit on one 
> of the resources, per JTA 1.2 section 3.3.1 ("(TransactionManager) ensures 
> that the same resource manager only receives one set of prepare-commit calls 
> for completing the target global transaction ".) 
> [TransactionContext|https://github.com/apache/activemq/blob/a65f5e7c2077e048a2664339f6425d73948d71ce/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java#L478]
>  will propagate the afterCommit to all contexts participating in same 
> transaction. However, this is not enough for {{ConnectionStateTracker}}, 
> which only reacts to [TransactionInfo 
> command|https://github.com/apache/activemq/blob/a65f5e7c2077e048a2664339f6425d73948d71ce/activemq-client/src/main/java/org/apache/activemq/TransactionContext.java#L469].
>  In effect, when two connection are enlisted in same transaction, just 
> commands of one of them is cleared upon commit, leading to memory leak.
> Since I presume the {{TransactionInfo}} should be sent only once for commit 
> of single transaction, {{ConnectionStateTracker}} needs to clear state for 
> the acknowledged transactions regardless of connection id in the transaction 
> command.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to