We recently upgraded to SDK 3.5a (LCDS 2.6.1) and started to see sporadic
deadlocks in LCDS's rtmp thread. These are difficult to reproduce in test
environment but happens in production once every couple of days, sometimes even
more frequently.
Here is the thread dump of the threads in lock.
Found one Java-level deadlock
"my-rtmp-SocketServer-WorkerThread-300":
waiting to lock monitor 0x6a949ba4 (object 0x0b27f6e0, a
flex.data.SequenceManager),
which is held by "my-rtmp-SocketServer-Reactor4Writer"
"my-rtmp-SocketServer-Reactor4Writer":
waiting to lock monitor 0x6a90f2d4 (object 0x0b321d90, a java.util.ArrayList),
which is held by "my-rtmp-SocketServer-Reactor2Writer"
"my-rtmp-SocketServer-Reactor2Writer":
waiting to lock monitor 0x6a6304a4 (object 0x0b27fc88, a java.util.HashMap),
which is held by "my-rtmp-SocketServer-Reactor4Writer"
Java stack information for the threads listed above
"my-rtmp-SocketServer-WorkerThread-300":
at flex.data.SequenceManager.createSequence(SequenceManager.java:2245)
- waiting to lock <0x0b27f6e0> (a flex.data.SequenceManager)
at flex.data.SequenceManager.manageSequence(SequenceManager.java:786)
at flex.data.SequenceManager.manageSequence(SequenceManager.java:755)
at flex.data.DataService.serviceMessage(DataService.java:571)
at
flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1495)
at
flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:882)
at
flex.messaging.endpoints.RTMPConnection.handleTCCommand(RTMPConnection.java:722)
at
flex.messaging.endpoints.RTMPConnection.serviceTCMessage(RTMPConnection.java:1021)
at
flex.messaging.endpoints.RTMPConnection.doRead(RTMPConnection.java:514)
at
flex.messaging.endpoints.RTMPProtocolHandler.doRead(RTMPProtocolHandler.java:123)
at
flex.messaging.socketserver.Connection$ConnectionReader.run(Connection.java:778)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Thread.java:619)
"my-rtmp-SocketServer-Reactor4Writer":
at flex.data.SequenceManager.getSequence(SequenceManager.java:373)
- waiting to lock <0x0b321d90> (a java.util.ArrayList)
at
flex.data.SequenceManager.removeItemIfNecessary(SequenceManager.java:3652)
at
flex.data.SequenceManager.removeItemIdentityFromSequence(SequenceManager.java:3108)
- locked <0x0b27fc88> (a java.util.HashMap)
at
flex.data.SequenceManager.unsafeRemoveItemIdentitiesFromSequence(SequenceManager.java:747)
at flex.data.SequenceManager.removeSequence(SequenceManager.java:639)
at flex.data.SequenceManager.removeSequence(SequenceManager.java:621)
at flex.data.SequenceManager.unsubscribeClient(SequenceManager.java:548)
- locked <0x0b27fc70> (a java.util.ArrayList)
- locked <0x0b27f6e0> (a flex.data.SequenceManager)
at
flex.data.SequenceManager.messageClientDestroyed(SequenceManager.java:3950)
at flex.messaging.MessageClient.invalidate(MessageClient.java:764)
at flex.messaging.MessageClient.invalidate(MessageClient.java:716)
at flex.messaging.client.FlexClient.invalidate(FlexClient.java:480)
at
flex.messaging.client.FlexClient.unregisterFlexSession(FlexClient.java:1286)
at flex.messaging.FlexSession.unregisterFlexClient(FlexSession.java:850)
at flex.messaging.FlexSession.invalidate(FlexSession.java:666)
at
flex.messaging.endpoints.RTMPProtocolHandler$DirectRTMPConnection.close(RTMPProtocolHandler.java:306)
at
flex.messaging.endpoints.RTMPConnection.close(RTMPConnection.java:212)
at
flex.messaging.endpoints.RTMPProtocolHandler.closed(RTMPProtocolHandler.java:100)
at
flex.messaging.socketserver.Connection.closeImmediate(Connection.java:422)
at
flex.messaging.socketserver.Connection$ConnectionWriter.run(Connection.java:965)
at flex.messaging.socketserver.Reactor$Writer.run(Reactor.java:675)
at java.lang.Thread.run(Thread.java:619)
"my-rtmp-SocketServer-Reactor2Writer":
at
flex.data.SequenceManager.isItemReferencedInternal(SequenceManager.java:3555)
- waiting to lock <0x0b27fc88> (a java.util.HashMap)
at flex.data.SequenceManager.isItemReferenced(SequenceManager.java:3540)
at
flex.data.SequenceManager.isItemReferencedInternal(SequenceManager.java:3567)
- locked <0x0b321da8> (a java.util.HashMap)
at flex.data.SequenceManager.isItemReferenced(SequenceManager.java:3540)
at
flex.data.SequenceManager.isItemReferencedInternal(SequenceManager.java:3567)
- locked <0x0b27bd10> (a java.util.HashMap)
at flex.data.SequenceManager.isItemReferenced(SequenceManager.java:3540)
at
flex.data.SequenceManager.removeItemIfNecessary(SequenceManager.java:3630)
at
flex.data.SequenceManager.removeItemIdentityFromSequence(SequenceManager.java:3108)
- locked <0x0b27bd10> (a java.util.HashMap)
at
flex.data.SequenceManager.unsafeRemoveItemIdentitiesFromSequence(SequenceManager.java:747)
at flex.data.SequenceManager.removeSequence(SequenceManager.java:639)
at
flex.data.SequenceManager.removeItemIfNecessary(SequenceManager.java:3654)
at
flex.data.SequenceManager.removeItemIdentityFromSequence(SequenceManager.java:3108)
- locked <0x0b321da8> (a java.util.HashMap)
at
flex.data.SequenceManager.unsafeRemoveItemIdentitiesFromSequence(SequenceManager.java:747)
at flex.data.SequenceManager.removeSequence(SequenceManager.java:639)
at flex.data.SequenceManager.removeSequence(SequenceManager.java:621)
at flex.data.SequenceManager.unsubscribeClient(SequenceManager.java:548)
- locked <0x0b321d90> (a java.util.ArrayList)
- locked <0x0b3217b0> (a flex.data.SequenceManager)
at
flex.data.SequenceManager.messageClientDestroyed(SequenceManager.java:3950)
at flex.messaging.MessageClient.invalidate(MessageClient.java:764)
at flex.messaging.MessageClient.invalidate(MessageClient.java:716)
at flex.messaging.client.FlexClient.invalidate(FlexClient.java:480)
at
flex.messaging.client.FlexClient.unregisterFlexSession(FlexClient.java:1286)
at flex.messaging.FlexSession.unregisterFlexClient(FlexSession.java:850)
at flex.messaging.FlexSession.invalidate(FlexSession.java:666)
at
flex.messaging.endpoints.RTMPProtocolHandler$DirectRTMPConnection.close(RTMPProtocolHandler.java:306)
at
flex.messaging.endpoints.RTMPConnection.close(RTMPConnection.java:212)
at
flex.messaging.endpoints.RTMPProtocolHandler.closed(RTMPProtocolHandler.java:100)
at
flex.messaging.socketserver.Connection.closeImmediate(Connection.java:422)
at
flex.messaging.socketserver.Connection$ConnectionWriter.run(Connection.java:965)
at flex.messaging.socketserver.Reactor$Writer.run(Reactor.java:675)
at java.lang.Thread.run(Thread.java:619)
-Shailesh