[
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)