You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Patrik Dudits (JIRA)" <ji...@apache.org> on 2016/08/09 15:27:23 UTC

[jira] [Comment Edited] (AMQ-6391) Memory leak with FailoverTransport when sending TX messages from MDB

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