From c0c32ff02991ed73f97067be4da7764036db0501 Mon Sep 17 00:00:00 2001 From: Guus der Kinderen Date: Wed, 22 Jan 2025 20:57:48 +0100 Subject: [PATCH] Revert "OF-2921: Prevent deadlock by not broadcasting synchronously" This reverts commit b8b5713c550b3b114020d0b5eb0db4c50660683e. Routing the unavailable presence that's sent out when a session closes cannot be made asynchronous. If the 'next step' is done prior to the routing of unavailable presence having completed, the session seems to be (partially) re-added. This causes an invalid state: the routing table no longer has the session, but caches such as the Routing Users Cache does. This incorrect behavior was introduced by a fix for OF-2921. --- .../java/org/jivesoftware/openfire/SessionManager.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/xmppserver/src/main/java/org/jivesoftware/openfire/SessionManager.java b/xmppserver/src/main/java/org/jivesoftware/openfire/SessionManager.java index 6d736256d8..5daebb039a 100644 --- a/xmppserver/src/main/java/org/jivesoftware/openfire/SessionManager.java +++ b/xmppserver/src/main/java/org/jivesoftware/openfire/SessionManager.java @@ -291,9 +291,7 @@ public synchronized void terminateDetached(LocalSession session) { Presence presence = new Presence(); presence.setType(Presence.Type.unavailable); presence.setFrom(session.getAddress()); - - // Broadcast asynchronously, to reduce the likelihood of the broadcast introducing a deadlock (OF-2921). - TaskEngine.getInstance().submit(() -> router.route(presence)); + router.route(presence); } session.getStreamManager().onClose(router, serverAddress); @@ -1362,9 +1360,7 @@ public void onConnectionClose(Object handback) { Presence presence = new Presence(); presence.setType(Presence.Type.unavailable); presence.setFrom(session.getAddress()); - - // Broadcast asynchronously, to reduce the likelihood of the broadcast introducing a deadlock (OF-2921). - TaskEngine.getInstance().submit(() -> router.route(presence)); + router.route(presence); } session.getStreamManager().onClose(router, serverAddress);