Skip to content

Commit 52ba365

Browse files
damenchobgrozev
andauthored
fix(visitors): Make sure we disconnect vnodes before leaving rooms. (#1170)
* fix(visitors): Make sure we disconnect vnodes before leaving rooms. Use case is a single main participant and a visitor node. If jicofo leaves visitor room before disconnecting, the client will reload seeing jicofo leaving. If we disconnect first, we destroy the room with an appropriate message shown to visitors. * squash: synchronize, refactor. --------- Co-authored-by: Boris Grozev <[email protected]>
1 parent 57134d4 commit 52ba365

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -640,17 +640,31 @@ private void leaveTheRoom()
640640
chatRoomRoleManager.stop();
641641
}
642642

643-
chatRoom.leave();
643+
// first disconnect vnodes before leaving
644+
final List<ExtensionElement> disconnectVnodeExtensions;
645+
final List<ChatRoom> visitorChatRoomsToLeave;
646+
synchronized (visitorChatRooms)
647+
{
648+
disconnectVnodeExtensions = visitorChatRooms.keySet().stream()
649+
.map(DisconnectVnodePacketExtension::new).collect(Collectors.toList());
650+
visitorChatRoomsToLeave = new ArrayList<>(visitorChatRooms.values());
651+
visitorChatRooms.clear();
652+
}
644653

654+
final ChatRoom chatRoomToLeave = chatRoom;
645655
chatRoom.removeListener(chatRoomListener);
646656
chatRoom = null;
647657

648-
List<ExtensionElement> disconnectVnodeExtensions = new ArrayList<>();
649-
synchronized (visitorChatRooms)
658+
TaskPools.getIoPool().submit(() ->
650659
{
651-
visitorChatRooms.forEach((vnode, visitorChatRoom) ->
660+
if (!disconnectVnodeExtensions.isEmpty())
661+
{
662+
jicofoServices.getXmppServices().getVisitorsManager()
663+
.sendIqToComponentAndGetResponse(roomName, disconnectVnodeExtensions);
664+
}
665+
666+
visitorChatRoomsToLeave.forEach(visitorChatRoom ->
652667
{
653-
disconnectVnodeExtensions.add(new DisconnectVnodePacketExtension(vnode));
654668
try
655669
{
656670
visitorChatRoom.removeAllListeners();
@@ -661,14 +675,9 @@ private void leaveTheRoom()
661675
logger.error("Failed to leave visitor room", e);
662676
}
663677
});
664-
visitorChatRooms.clear();
665-
}
666678

667-
if (!disconnectVnodeExtensions.isEmpty())
668-
{
669-
jicofoServices.getXmppServices().getVisitorsManager()
670-
.sendIqToComponent(roomName, disconnectVnodeExtensions);
671-
}
679+
chatRoomToLeave.leave();
680+
});
672681
}
673682

674683
/**
@@ -2372,6 +2381,7 @@ public void memberKicked(@NotNull ChatRoomMember member)
23722381
if (member.getRole() != MemberRole.VISITOR)
23732382
{
23742383
logger.debug("Member kicked for non-visitor member of visitor room: " + member);
2384+
return;
23752385
}
23762386
onMemberKicked(member);
23772387
}
@@ -2382,6 +2392,7 @@ public void memberLeft(@NotNull ChatRoomMember member)
23822392
if (member.getRole() != MemberRole.VISITOR)
23832393
{
23842394
logger.debug("Member left for non-visitor member of visitor room: " + member);
2395+
return;
23852396
}
23862397
onMemberLeft(member);
23872398
}

jicofo/src/main/kotlin/org/jitsi/jicofo/xmpp/VisitorsManager.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,24 @@ class VisitorsManager(
5757
logger.info("VisitorsComponentManager is now ${if (enabled) "en" else "dis"}abled with address $address")
5858
}
5959

60-
fun sendIqToComponent(roomJid: EntityBareJid, extensions: List<ExtensionElement>) {
60+
private fun createIq(roomJid: EntityBareJid, extensions: List<ExtensionElement>): VisitorsIq {
6161
val address = this.address ?: throw Exception("Component not available.")
62-
val iq = VisitorsIq.Builder(xmppProvider.xmppConnection).apply {
62+
return VisitorsIq.Builder(xmppProvider.xmppConnection).apply {
6363
to(address)
6464
ofType(IQ.Type.get)
6565
room = roomJid
6666
addExtensions(extensions)
6767
}.build()
68+
}
6869

70+
/** Send an IQ, block for response or timeout, return the result. */
71+
fun sendIqToComponentAndGetResponse(roomJid: EntityBareJid, extensions: List<ExtensionElement>): IQ? =
72+
xmppProvider.xmppConnection.sendIqAndGetResponse(createIq(roomJid, extensions))
73+
74+
/** Send an IQ, return immediately. Log an error if there's no response. */
75+
fun sendIqToComponent(roomJid: EntityBareJid, extensions: List<ExtensionElement>) {
6976
TaskPools.ioPool.submit {
70-
val response = xmppProvider.xmppConnection.sendIqAndGetResponse(iq)
77+
val response = sendIqToComponentAndGetResponse(roomJid, extensions)
7178
when {
7279
response == null -> logger.warn("Timeout waiting for VisitorsIq response.")
7380
response.type == IQ.Type.result -> {

0 commit comments

Comments
 (0)