Hi Guus,
indeed, this is what I was looking for.
So this thread (TaskEngine-pool-3) is locking the StreamManager class
(the synchrinized on streamManager) and the global StreamManager class
lock done by thread socket_c2s_ssl-thread-2 in the StreamManager.java
class, function validateClientAcknowledgement
private synchronized boolean validateClientAcknowledgement(long h) {
return h <= ( unacknowledgedServerStanzas.isEmpty() ?
clientProcessedStanzas.get() : unacknowledgedServerStanzas.getLast().x );
}
The stack trace is:
"socket_c2s_ssl-thread-2" #78 daemon prio=5 waiting on lock
java.lang.Thread.State: BLOCKED
- blocked on
org.jivesoftware.openfire.streammanagement.StreamManager@7e024771 (owned
by TaskEngine-pool-3 id=40)
at
org.jivesoftware.openfire.streammanagement.StreamManager.processClientAcknowledgement(StreamManager.java:493)
at
org.jivesoftware.openfire.streammanagement.StreamManager.process(StreamManager.java:185)
at
org.jivesoftware.openfire.net.StanzaHandler.process(StanzaHandler.java:223)
at
org.jivesoftware.openfire.nio.ConnectionHandler.messageReceived(ConnectionHandler.java:178)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:1015)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
at
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:122)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
at
org.apache.mina.filter.codec.AbstractProtocolDecoderOutput.flush(AbstractProtocolDecoderOutput.java:64)
at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:249)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
at
org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:236)
at
org.apache.mina.filter.ssl.SSLHandlerG0.receive(SSLHandlerG0.java:162)
- locked org.apache.mina.filter.ssl.SSLHandlerG0@99f49e2
Sothe deadlock in your code is on the StreamManager class.
On 20/12/2022 14:09, Guus der Kinderen wrote:
Hi Emmanuel,
I'm not sure if I understand what you're saying or asking. My email
client doesn't do a great job of formatting all that code in the email
either, which might add to the confusion.
The code that you seem to refer to is here:
https://github.com/igniterealtime/Openfire/blob/cd28f39c411a0faede6d04454caf865d1695928f/xmppserver/src/main/java/org/jivesoftware/openfire/session/LocalClientSession.java#L923-L932 <https://github.com/igniterealtime/Openfire/blob/cd28f39c411a0faede6d04454caf865d1695928f/xmppserver/src/main/java/org/jivesoftware/openfire/session/LocalClientSession.java#L923-L932>
There is a lock that intends to ensure that the 'streammanager' (which
keeps statistics on data sent, received and acknowledged) is not used
while data is being sent over the outbound connection.
Does that make sense and answer your question?
Kind regards,
Guus
On Mon, Dec 19, 2022 at 4:00 AM Emmanuel Lécharny <elecha...@gmail.com
<mailto:elecha...@gmail.com>> wrote:
Hi Guus,
thanks for teh full stack trace.
I've some concern about this blocked thread:
"TaskEngine-pool-3" #40 daemon prio=5 waiting on lock
java.lang.Thread.State: BLOCKED
- blocked on
org.apache.mina.filter.ssl.SSLHandlerG0@99f49e2 (owned by
socket_c2s_ssl-thread-2 id=78)
at
org.apache.mina.filter.ssl.SSLHandlerG0.write(SSLHandlerG0.java:312)
at
org.apache.mina.filter.ssl.SslFilter.filterWrite(SslFilter.java:380)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
at
org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:301)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
at
org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138)
at
org.jivesoftware.openfire.net
<http://org.jivesoftware.openfire.net>.StalledSessionsFilter.filterWrite(StalledSessionsFilter.java:61)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
at
org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterWrite(DefaultIoFilterChain.java:746)
at
org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:575)
at
org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:520)
at
org.jivesoftware.openfire.nio.NIOConnection.deliver(NIOConnection.java:349)
at
org.jivesoftware.openfire.session.LocalClientSession.deliver(LocalClientSession.java:928)
- locked
org.jivesoftware.openfire.streammanagement.StreamManager@7e024771
at
org.jivesoftware.openfire.session.LocalSession.process(LocalSession.java:407)
at
org.jivesoftware.openfire.spi.RoutingTableImpl.routeToLocalDomain(RoutingTableImpl.java:439)
at
org.jivesoftware.openfire.spi.RoutingTableImpl.routePacket(RoutingTableImpl.java:350)
...
As you can see, there is a lock on a StreamManager instance following a
call to org.jivesoftware.openfire.session.La
<http://org.jivesoftware.openfire.session.La> ocalSession.process:
public void process(Packet packet) {
// Check that the requested packet can be processed
if (canProcess(packet)) {
// Perform the actual processing of the packet. This
usually implies sending
// the packet to the entity
try {
// Invoke the interceptors before we send the packet
InterceptorManager.getInstance().invokeInterceptors(packet, this,
false,
false);
deliver(packet);
<<<-------------------------------------Here
but I don't see why a lock is taken, unless I don't have the proper
source code.
Which version are you using when having this deadlock?
On 14/12/2022 09:37, Guus der Kinderen wrote:
> Hi Emmanuel,
>
> I was trying to be helpful by leaving out unimportant details, but I
> seem to have messed up. A third thread is involved. I've now
attached
> the full thread dump to this email.
>
> Kind regards,
>
> Guus
>
>
> On Mon, Dec 12, 2022 at 9:53 AM Emmanuel Lécharny
<elecha...@gmail.com <mailto:elecha...@gmail.com>
> <mailto:elecha...@gmail.com <mailto:elecha...@gmail.com>>> wrote:
>
> Hi Guus,
>
> there is something missing in the stacck trace: the two
threads are
> blocked on different monitors:
> * SSLHandlerG0@99f49e2 owned by socket_c2s_ssl-thread-2
> * StreamManager@7e024771 owned by TaskEngine-pool-3
>
> they are not related, they are not blocking each one other.
>
> Can you provide the full stack trace ?
>
> Thanks !
>
>
> On 09/12/2022 10:02, Guus der Kinderen wrote:
> > Hello,
> >
> > I wonder if MINA 2.2.1 introduces a new potential for
deadlock in its
> > SSLHandler implementation. Did something change there, as
> compared to MINA
> > 2.1.3?
> >
> > Since this upgrade, we consistently run into a thread
deadlock.
> One of the
> > threads that is deadlocking is sending data to the peer, while
> the other is
> > processing data from the peer. The deadlock involves a
MINA-based
> lock (in
> > SSLHandler), and a lock in our code (StreamManager), that is
> responsible
> > for recording what packets that are exchanged have been
> acknowledged by the
> > peer. The latter did not change, so I'm suspecting a change in
> SSLHandler.
> >
> > The stack traces of two deadlocked threads are added to
this email.
> >
> > Kind regards,
> >
> > Guus
> >
> >
> > "TaskEngine-pool-3" #40 daemon prio=5 waiting on lock
> > java.lang.Thread.State: BLOCKED
> > - blocked on
org.apache.mina.filter.ssl.SSLHandlerG0@99f49e2
> (owned by
> > socket_c2s_ssl-thread-2 id=78)
> > at
>
org.apache.mina.filter.ssl.SSLHandlerG0.write(SSLHandlerG0.java:312)
> > at
>
org.apache.mina.filter.ssl.SslFilter.filterWrite(SslFilter.java:380)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
> > at
> >
>
org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:301)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
> > at
> >
>
org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138)
> > at
> > org.jivesoftware.openfire.net
<http://org.jivesoftware.openfire.net>
> <http://org.jivesoftware.openfire.net
<http://org.jivesoftware.openfire.net>>.StalledSessionsFilter.filterWrite(StalledSessionsFilter.java:61)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
> > at
> >
>
org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterWrite(DefaultIoFilterChain.java:746)
> > at
> >
>
org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:575)
> > at
> >
>
org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:520)
> > at
> >
>
org.jivesoftware.openfire.nio.NIOConnection.deliver(NIOConnection.java:349)
> > at
> >
>
org.jivesoftware.openfire.session.LocalClientSession.deliver(LocalClientSession.java:928)
> > - locked
> org.jivesoftware.openfire.streammanagement.StreamManager@7e024771
> > at
> >
>
org.jivesoftware.openfire.session.LocalSession.process(LocalSession.java:407)
> > at
> >
>
org.jivesoftware.openfire.spi.RoutingTableImpl.routeToLocalDomain(RoutingTableImpl.java:439)
> > at
> >
>
org.jivesoftware.openfire.spi.RoutingTableImpl.routePacket(RoutingTableImpl.java:350)
> > at
org.jivesoftware.openfire.IQRouter.handle(IQRouter.java:426)
> > at
org.jivesoftware.openfire.IQRouter.route(IQRouter.java:106)
> > at
> >
>
org.jivesoftware.openfire.spi.PacketRouterImpl.route(PacketRouterImpl.java:74)
> > at
> >
>
org.jivesoftware.openfire.pubsub.PubSubEngine.publishItemsToNode(PubSubEngine.java:428)
> > at
> >
>
org.jivesoftware.openfire.pubsub.PubSubEngine$1.run(PubSubEngine.java:96)
> > at java.base@11.0.17
> >
>
/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
> > at java.base@11.0.17
> > /java.util.concurrent.FutureTask.run(FutureTask.java:264)
> > at java.base@11.0.17
> >
>
/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
> > at java.base@11.0.17
> >
>
/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
> > at java.base@11.0.17/java.lang.Thread.run(Thread.java:829)
> >
> > "socket_c2s_ssl-thread-2" #78 daemon prio=5 waiting on lock
> > java.lang.Thread.State: BLOCKED
> > - blocked on
> >
org.jivesoftware.openfire.streammanagement.StreamManager@7e024771
> (owned by
> > TaskEngine-pool-3 id=40)
> > at
> >
>
org.jivesoftware.openfire.streammanagement.StreamManager.processClientAcknowledgement(StreamManager.java:493)
> > at
> >
>
org.jivesoftware.openfire.streammanagement.StreamManager.process(StreamManager.java:185)
> > at
> > org.jivesoftware.openfire.net
<http://org.jivesoftware.openfire.net>
> <http://org.jivesoftware.openfire.net
<http://org.jivesoftware.openfire.net>>.StanzaHandler.process(StanzaHandler.java:223)
> > at
> >
>
org.jivesoftware.openfire.nio.ConnectionHandler.messageReceived(ConnectionHandler.java:178)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:1015)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
> > at
> >
>
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:122)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
> > at
> >
>
org.apache.mina.filter.codec.AbstractProtocolDecoderOutput.flush(AbstractProtocolDecoderOutput.java:64)
> > at
> >
>
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:249)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
> > at
> >
>
org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:236)
> > at
>
org.apache.mina.filter.ssl.SSLHandlerG0.receive(SSLHandlerG0.java:162)
> > - locked org.apache.mina.filter.ssl.SSLHandlerG0@99f49e2
> > at
> >
>
org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:342)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49)
> > at
> >
>
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128)
> > at
> >
>
org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:106)
> > at
org.apache.mina.core.session.IoEvent.run(IoEvent.java:89)
> > at
> >
>
org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:763)
> > at
> >
>
org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:755)
> > at
> >
>
org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:695)
> > at java.base@11.0.17/java.lang.Thread.run(Thread.java:829)
> >
>
> --
> *Emmanuel Lécharny - CTO* 205 Promenade des Anglais – 06200 NICE
> T. +33 (0)4 89 97 36 50
> P. +33 (0)6 08 33 32 61
> emmanuel.lecha...@busit.com <mailto:emmanuel.lecha...@busit.com>
<mailto:emmanuel.lecha...@busit.com
<mailto:emmanuel.lecha...@busit.com>>
> https://www.busit.com/ <https://www.busit.com/>
<https://www.busit.com/ <https://www.busit.com/>>
>
>
---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@mina.apache.org
<mailto:users-unsubscr...@mina.apache.org>
> <mailto:users-unsubscr...@mina.apache.org
<mailto:users-unsubscr...@mina.apache.org>>
> For additional commands, e-mail: users-h...@mina.apache.org
<mailto:users-h...@mina.apache.org>
> <mailto:users-h...@mina.apache.org
<mailto:users-h...@mina.apache.org>>
>
--
*Emmanuel Lécharny - CTO* 205 Promenade des Anglais – 06200 NICE
T. +33 (0)4 89 97 36 50
P. +33 (0)6 08 33 32 61
emmanuel.lecha...@busit.com <mailto:emmanuel.lecha...@busit.com>
https://www.busit.com/ <https://www.busit.com/>
--
*Emmanuel Lécharny - CTO* 205 Promenade des Anglais – 06200 NICE
T. +33 (0)4 89 97 36 50
P. +33 (0)6 08 33 32 61
emmanuel.lecha...@busit.com https://www.busit.com/
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@mina.apache.org
For additional commands, e-mail: users-h...@mina.apache.org