There’s a ClassCastException being raised when resuming a stream management session if the detached session of the user is on another cluster node (I suppose).
The offending code is in the stream manager:
at org.jivesoftware.openfire.streammanagement.StreamManager.startResume(StreamManager.java:298) ~[xmppserver-4.6.0.jar:4.6.0]
The problem is that the code after assumes the returned session is LocalClientSession
. However, with hazelcast clustering, it is actually RemoteClientSession
. Which also extends ClientSession
, but doesn’t inherit from LocalClientSession
.
The rest of the method (after the exception-throwing code) uses some LocalClientSession
specific methods, namely reattach
and getStreamManager
so using ClientSession
instead doesn’t really work.
I’d love to fix that issue, but I don’t know what the right replacement code would be in the RemoteClientSession
case. Any ideas?
The impact for clients is that they get disconnected (socket closed by peer) after they connect and attempt to resume.
Just for reference, this is the stacktrace I’m seeing:
2020.11.16 15:05:39 ERROR [socket_c2s-thread-4]: org.jivesoftware.openfire.nio.ConnectionHandler - Closing connection due to error while processing message: <resume xmlns="urn:xmpp:sm:3" previd="MnZ4cTRrYmpvcgAydnhxNGtiam9y" h="34"/>
java.lang.ClassCastException: class org.jivesoftware.openfire.plugin.session.RemoteClientSession cannot be cast to class org.jivesoftware.openfire.session.LocalClientSession (org.jivesoftware.openfire.plugin.session.RemoteClientSession is in unnamed module of loader org.jivesoftware.openfire.container.PluginClassLoader @44c715d8; org.jivesoftware.openfire.session.LocalClientSession is in unnamed module of loader org.jivesoftware.openfire.starter.JiveClassLoader @14bee915)
at org.jivesoftware.openfire.streammanagement.StreamManager.startResume(StreamManager.java:298) ~[xmppserver-4.6.0.jar:4.6.0]
at org.jivesoftware.openfire.streammanagement.StreamManager.process(StreamManager.java:157) ~[xmppserver-4.6.0.jar:4.6.0]
at org.jivesoftware.openfire.net.StanzaHandler.process(StanzaHandler.java:206) ~[xmppserver-4.6.0.jar:4.6.0]
at org.jivesoftware.openfire.nio.ConnectionHandler.messageReceived(ConnectionHandler.java:183) [xmppserver-4.6.0.jar:4.6.0]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:1015) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:122) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128) [mina-core-2.1.3.jar:?]
at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:413) [mina-core-2.1.3.jar:?]
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:257) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:106) [mina-core-2.1.3.jar:?]
at org.apache.mina.core.session.IoEvent.run(IoEvent.java:89) [mina-core-2.1.3.jar:?]
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:766) [mina-core-2.1.3.jar:?]
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:758) [mina-core-2.1.3.jar:?]
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:697) [mina-core-2.1.3.jar:?]
at java.lang.Thread.run(Unknown Source) [?:?]