From fb36cc4d0133c97152be610090fc3b6e48aad200 Mon Sep 17 00:00:00 2001 From: Boris Grozev Date: Wed, 18 Sep 2024 12:39:05 -0500 Subject: [PATCH] fix: Wait for disconnect response before leaving visitor room. --- .../conference/JitsiMeetConferenceImpl.java | 16 +++++++++++----- .../org/jitsi/jicofo/xmpp/VisitorsManager.kt | 13 ++++++++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java b/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java index 4939627a61..c072befe3d 100644 --- a/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java +++ b/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java @@ -2302,8 +2302,19 @@ public void roomDestroyed(String reason) if (chatRoomToLeave != null) { ChatRoom finalChatRoom = chatRoomToLeave; + final String finalVnode = vnode; + TaskPools.getIoPool().submit(() -> { + IQ disconnectResponse + = jicofoServices.getXmppServices().getVisitorsManager().sendIqToComponentAndGetResponse( + roomName, + Collections.singletonList(new DisconnectVnodePacketExtension(finalVnode))); + if (disconnectResponse == null || !disconnectResponse.getType().equals(IQ.Type.result)) + { + logger.warn("Error or no response to disconnect request: " + disconnectResponse); + } + try { logger.info("Removing visitor chat room"); @@ -2315,11 +2326,6 @@ public void roomDestroyed(String reason) } }); - if (vnode != null) - { - jicofoServices.getXmppServices().getVisitorsManager().sendIqToComponent( - roomName, Collections.singletonList(new DisconnectVnodePacketExtension(vnode))); - } } } diff --git a/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/VisitorsManager.kt b/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/VisitorsManager.kt index d63e342176..7340b452af 100644 --- a/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/VisitorsManager.kt +++ b/jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/VisitorsManager.kt @@ -57,17 +57,24 @@ class VisitorsManager( logger.info("VisitorsComponentManager is now ${if (enabled) "en" else "dis"}abled with address $address") } - fun sendIqToComponent(roomJid: EntityBareJid, extensions: List) { + private fun createIq(roomJid: EntityBareJid, extensions: List): VisitorsIq { val address = this.address ?: throw Exception("Component not available.") - val iq = VisitorsIq.Builder(xmppProvider.xmppConnection).apply { + return VisitorsIq.Builder(xmppProvider.xmppConnection).apply { to(address) ofType(IQ.Type.get) room = roomJid addExtensions(extensions) }.build() + } + /** Send an IQ, block for response or timeout, return the result. */ + fun sendIqToComponentAndGetResponse(roomJid: EntityBareJid, extensions: List): IQ? = + xmppProvider.xmppConnection.sendIqAndGetResponse(createIq(roomJid, extensions)) + + /** Send an IQ, return immediately. Log an error if there's no response. */ + fun sendIqToComponent(roomJid: EntityBareJid, extensions: List) { TaskPools.ioPool.submit { - val response = xmppProvider.xmppConnection.sendIqAndGetResponse(iq) + val response = sendIqToComponentAndGetResponse(roomJid, extensions) when { response == null -> logger.warn("Timeout waiting for VisitorsIq response.") response.type == IQ.Type.result -> {