You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Chad Showalter (JIRA)" <ji...@apache.org> on 2009/09/11 22:07:24 UTC

[jira] Commented: (AMQ-2389) ActiveMQ hangs on SocketWrite0() with fast producer / slow consumer after MemoryLimit is reached

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

Chad Showalter commented on AMQ-2389:
-------------------------------------

Note that uncommenting the lines

		activeMQConnectionFactory.setUseAsyncSend( true );
		activeMQConnectionFactory.setProducerWindowSize(1024*1024);

in the attached test results in ActiveMQ blocking before the MemoryLimit is reached.  This feels like a separate bug.

The following thread dump signature results in this case:

...
"main" prio=5 tid=0x0000000101805000 nid=0x101201000 in Object.wait() [0x0000000101200000..0x0000000101200ba0]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000107c43ad8> (a java.lang.Object)
	at java.lang.Object.wait(Object.java:485)
	at org.apache.activemq.usage.MemoryUsage.waitForSpace(MemoryUsage.java:67)
	- locked <0x0000000107c43ad8> (a java.lang.Object)
	at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:221)
	at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:300)
	at com.chad.test.ActiveMQSpamTest1.runTest(ActiveMQSpamTest1.java:74)
	- locked <0x0000000107c93088> (a org.apache.activemq.ActiveMQMessageProducer)
	at com.chad.test.ActiveMQSpamTest1.main(ActiveMQSpamTest1.java:117)
...

> ActiveMQ hangs on SocketWrite0() with fast producer / slow consumer after MemoryLimit is reached
> ------------------------------------------------------------------------------------------------
>
>                 Key: AMQ-2389
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2389
>             Project: ActiveMQ
>          Issue Type: Bug
>    Affects Versions: 5.2.0
>         Environment: $ cat /proc/version
> Linux version 2.6.18-6-amd64 (Debian 2.6.18.dfsg.1-23etch1) (dannf@debian.org) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Fri Dec 12 05:49:32 UTC 2008
> OS X
>            Reporter: Chad Showalter
>             Fix For: 5.2.0
>
>         Attachments: ActiveMQSpamTest1.java, screenshot-1.jpg
>
>
> When persistent=true for the broker, a fast producer / slow consumer may cause ActiveMQ to block on a SocketWrite0() call.  The following thread dump signature results:
> ...
> "ActiveMQ Transport: tcp://localhost/127.0.0.1:61610" prio=5 tid=0x0000000101942000 nid=0x1548c4000 waiting for monitor entry [0x00000001548c3000..0x00000001548c3a50]
>    java.lang.Thread.State: BLOCKED (on object monitor)
> 	at org.apache.activemq.transport.InactivityMonitor.oneway(InactivityMonitor.java:220)
> 	- waiting to lock <0x0000000107d29848> (a java.util.concurrent.atomic.AtomicBoolean)
> 	at org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:185)
> 	at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:84)
> 	at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:203)
> 	at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:185)
> 	at java.lang.Thread.run(Thread.java:637) 
> ...
> "main" prio=5 tid=0x0000000101805000 nid=0x101201000 runnable [0x0000000101200000..0x0000000101200ba0]
>    java.lang.Thread.State: RUNNABLE
> 	at java.net.SocketOutputStream.socketWrite0(Native Method)
> 	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
> 	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
> 	at org.apache.activemq.transport.tcp.TcpBufferedOutputStream.flush(TcpBufferedOutputStream.java:115)
> 	at java.io.DataOutputStream.flush(DataOutputStream.java:106)
> 	at org.apache.activemq.transport.tcp.TcpTransport.oneway(TcpTransport.java:167)
> 	at org.apache.activemq.transport.InactivityMonitor.oneway(InactivityMonitor.java:233)
> 	- locked <0x0000000107d29848> (a java.util.concurrent.atomic.AtomicBoolean)
> 	at org.apache.activemq.transport.TransportFilter.oneway(TransportFilter.java:83)
> 	at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:100)
> 	at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:40)
> 	- locked <0x0000000107d299b0> (a java.lang.Object)
> 	at org.apache.activemq.transport.ResponseCorrelator.oneway(ResponseCorrelator.java:60)
> 	at org.apache.activemq.ActiveMQConnection.doAsyncSendPacket(ActiveMQConnection.java:1214)
> 	at org.apache.activemq.ActiveMQConnection.asyncSendPacket(ActiveMQConnection.java:1208)
> 	at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1643)
> 	- locked <0x0000000107d35a68> (a java.lang.Object)
> 	at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:227)
> 	at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:300)
> 	at com.chad.test.ActiveMQSpamTest1.runTest(ActiveMQSpamTest1.java:73)
> 	- locked <0x0000000107ca6680> (a org.apache.activemq.ActiveMQMessageProducer)
> 	at com.chad.test.ActiveMQSpamTest1.main(ActiveMQSpamTest1.java:117)
> The attached test instantiates an embedded broker and consistently duplicates the problem on my machine (Macbook Pro running Leopard).  The test duplicates behavior we see in production code, which is running an embedded broker on Debian Linux.
> I run the test in Eclipse with -Xmx1100mb.  The output I see (after a minute or so) is:
> ...
> SENT a (mod 10000) message: i=0
> SENT a (mod 10000) message: i=10000
> SENT a (mod 10000) message: i=20000
> SENT a (mod 10000) message: i=30000
> SENT a (mod 10000) message: i=40000
> SENT a (mod 10000) message: i=50000
> Sep 11, 2009 3:28:13 PM org.apache.activemq.kaha.impl.KahaStore initialize
> INFO: Kaha Store using data directory activemq-data/localhost/tmp_storage
> RECEIVED a (mod 10000) message: i=10000
> RECEIVED a (mod 10000) message: i=20000
> RECEIVED a (mod 10000) message: i=30000
> RECEIVED a (mod 10000) message: i=40000
> RECEIVED a (mod 10000) message: i=50000 
> after which no further messages are processed, and a thread dump includes the signature shown above.  Uncommenting the line
> broker.setPersistent(false);
> results in the test running to completion (all messages are sent/consumed), with the following output:
> SENT a (mod 10000) message: i=0
> SENT a (mod 10000) message: i=10000
> SENT a (mod 10000) message: i=20000
> SENT a (mod 10000) message: i=30000
> SENT a (mod 10000) message: i=40000
> SENT a (mod 10000) message: i=50000
> SENT a (mod 10000) message: i=60000
> RECEIVED a (mod 10000) message: i=10000
> DONE sending messages
> RECEIVED a (mod 10000) message: i=20000
> RECEIVED a (mod 10000) message: i=30000
> RECEIVED a (mod 10000) message: i=40000
> RECEIVED a (mod 10000) message: i=50000
> RECEIVED a (mod 10000) message: i=60000

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.