Hey - Adrian bug [ 745527 ] race condition not fixed
jamoville May 29, 2003 1:31 PMThis bug is not fixed - I looked at the latest code in cvs and the code has not been changed. While you did fix a deadlock situation in the BasicQueue class you missed fixing the one I was mentioning. Specifically the methods:
hasUnackedMessages
and
checkRemovedSubscribers
when these methods are called by two different threads a deadlock happens. You should be synchronizing on the methods. You are causing too much context switching and it's killing performance. You also wouldn't have to be doing all those nested synchronizations.
here is the stack trace:
FOUND A JAVA LEVEL DEADLOCK:
----------------------------
"Thread-186":
waiting to lock monitor 0x8ed8f4 (object 0x3395af8, a java.util.HashSet),
which is locked by "Thread-184"
"Thread-184":
waiting to lock monitor 0x8eda14 (object 0x3395a68, a java.util.HashMap),
which is locked by "Thread-186"
JAVA STACK INFORMATION FOR THREADS LISTED ABOVE:
------------------------------------------------
Java Stack for "Thread-186":
==========
at org.jboss.mq.server.BasicQueue.checkRemovedSubscribers(BasicQueue.java:508)
at org.jboss.mq.server.BasicQueue.acknowledge(BasicQueue.java:404)
at org.jboss.mq.server.JMSQueue.acknowledge(JMSQueue.java:114)
at org.jboss.mq.server.ClientConsumer.acknowledge(ClientConsumer.java:328)
at org.jboss.mq.server.JMSDestinationManager.acknowledge(JMSDestinationManager.java:529)
at org.jboss.mq.server.JMSDestinationManager.acknowledge(JMSDestinationManager.java:513)
at org.jboss.mq.server.JMSServerInterceptorSupport.acknowledge(JMSServerInterceptorSupport.java:197)
at org.jboss.mq.server.TracingInterceptor.acknowledge(TracingInterceptor.java:405)
at org.jboss.mq.server.JMSServerInvoker.acknowledge(JMSServerInvoker.java:199)
at org.jboss.mq.il.uil2.ServerSocketManagerHandler.handleMsg(ServerSocketManagerHandler.java:81)
at org.jboss.mq.il.uil2.SocketManager$ReadTask.handleMsg(SocketManager.java:355)
at org.jboss.mq.il.uil2.msgs.BaseMsg.run(BaseMsg.java:377)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:732)
at java.lang.Thread.run(Thread.java:479)
Java Stack for "Thread-184":
==========
at org.jboss.mq.server.BasicQueue.hasUnackedMessages(BasicQueue.java:500)
at org.jboss.mq.server.BasicQueue.removeSubscriber(BasicQueue.java:178)
at org.jboss.mq.server.JMSQueue.removeSubscriber(JMSQueue.java:60)
at org.jboss.mq.server.ClientConsumer.removeSubscription(ClientConsumer.java:253)
at org.jboss.mq.server.JMSDestinationManager.unsubscribe(JMSDestinationManager.java:624)
at org.jboss.mq.server.JMSServerInterceptorSupport.unsubscribe(JMSServerInterceptorSupport.java:249)
at org.jboss.mq.server.TracingInterceptor.unsubscribe(TracingInterceptor.java:548)
at org.jboss.mq.server.JMSServerInvoker.unsubscribe(JMSServerInvoker.java:251)
at org.jboss.mq.il.uil2.ServerSocketManagerHandler.handleMsg(ServerSocketManagerHandler.java:171)
at org.jboss.mq.il.uil2.SocketManager$ReadTask.handleMsg(SocketManager.java:355)
at org.jboss.mq.il.uil2.msgs.BaseMsg.run(BaseMsg.java:377)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:732)
at java.lang.Thread.run(Thread.java:479)
Found 1 deadlock.