This is an automated email from the ASF dual-hosted git repository. solomax pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/master by this push: new e7d4bd0 [OPENMEETINGS-2301] code is improved, issue still reproducible e7d4bd0 is described below commit e7d4bd09b0208fad456ee4c9e197cda07f02aacb Author: Maxim Solodovnik <solomax...@gmail.com> AuthorDate: Fri May 1 16:41:39 2020 +0700 [OPENMEETINGS-2301] code is improved, issue still reproducible --- .../apache/openmeetings/web/app/ClientManager.java | 76 +++++++++++----------- .../apache/openmeetings/web/common/MainPanel.java | 1 + .../openmeetings/web/common/OmWebSocketPanel.java | 3 - 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java index 870d31d..7806af1 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java @@ -165,9 +165,39 @@ public class ClientManager implements IClientManager { } public void exitRoom(Client c) { + exitRoom(c, true); + } + + public void exitRoom(Client c, boolean update) { Long roomId = c.getRoomId(); - removeFromRoom(c); + log.debug("Removing online room client: {}, room: {}", c.getUid(), roomId); if (roomId != null) { + IMap<Long, Set<String>> rooms = rooms(); + rooms.lock(roomId); + Set<String> clients = rooms.get(roomId); + if (clients != null) { + clients.remove(c.getUid()); + rooms.put(roomId, clients); + onlineRooms.put(roomId, clients); + } + rooms.unlock(roomId); + if (clients == null || clients.isEmpty()) { + String serverId = c.getServerId(); + IMap<String, ServerInfo> servers = servers(); + servers.lock(serverId); + ServerInfo si = servers.get(serverId); + si.remove(c.getRoom()); + servers.put(serverId, si); + onlineServers.put(serverId, si); + servers.unlock(serverId); + } + kHandler.leaveRoom(c); + c.setRoom(null); + c.clear(); + if (update) { + update(c); + } + sendRoom(new TextRoomMessage(roomId, c, RoomMessage.Type.ROOM_EXIT, c.getUid())); confLogDao.add( ConferenceLog.Type.ROOM_LEAVE @@ -185,7 +215,7 @@ public class ClientManager implements IClientManager { , c.getUserId(), "0", null , c.getRemoteAddress() , ""); - exitRoom(c); + exitRoom(c, false); kHandler.remove(c); log.debug("Removing online client: {}, roomId: {}", c.getUid(), c.getRoomId()); map().remove(c.getUid()); @@ -258,37 +288,6 @@ public class ClientManager implements IClientManager { } } - public Client removeFromRoom(Client c) { - Long roomId = c.getRoomId(); - log.debug("Removing online room client: {}, room: {}", c.getUid(), roomId); - if (roomId != null) { - IMap<Long, Set<String>> rooms = rooms(); - rooms.lock(roomId); - Set<String> clients = rooms.get(roomId); - if (clients != null) { - clients.remove(c.getUid()); - rooms.put(roomId, clients); - onlineRooms.put(roomId, clients); - } - rooms.unlock(roomId); - if (clients == null || clients.isEmpty()) { - String serverId = c.getServerId(); - IMap<String, ServerInfo> servers = servers(); - servers.lock(serverId); - ServerInfo si = servers.get(serverId); - si.remove(c.getRoom()); - servers.put(serverId, si); - onlineServers.put(serverId, si); - servers.unlock(serverId); - } - kHandler.leaveRoom(c); - c.setRoom(null); - c.clear(); - update(c); - } - return c; - } - public boolean isOnline(Long userId) { boolean isUserOnline = false; for (Map.Entry<String, Client> e : map().entrySet()) { @@ -412,12 +411,15 @@ public class ClientManager implements IClientManager { , EntryUpdatedListener<String, Client> , EntryRemovedListener<String, Client> { - private void process(EntryEvent<String, Client> event) { + private void process(EntryEvent<String, Client> event, boolean shouldAdd) { + if (event.getMember().localMember()) { + return; + } final String uid = event.getKey(); synchronized (onlineClients) { if (onlineClients.containsKey(uid)) { onlineClients.get(uid).merge(event.getValue()); - } else { + } else if (shouldAdd) { onlineClients.put(uid, event.getValue()); } } @@ -425,12 +427,12 @@ public class ClientManager implements IClientManager { @Override public void entryAdded(EntryEvent<String, Client> event) { - process(event); + process(event, true); } @Override public void entryUpdated(EntryEvent<String, Client> event) { - process(event); + process(event, false); } @Override diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java index dcb46bd..cd0b90b 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java @@ -175,6 +175,7 @@ public class MainPanel extends Panel { @Override protected void closeHandler(AbstractClientMessage msg) { + log.debug("WebSocketBehavior::closeHandler uid - {}", uid); super.closeHandler(msg); if (uid != null) { cm.exit(getClient()); diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java index f5fdfa5..3029726 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java @@ -148,19 +148,16 @@ public abstract class OmWebSocketPanel extends Panel { @Override protected void onAbort(AbortedMessage msg) { - super.onAbort(msg); closeHandler(msg); } @Override protected void onClose(ClosedMessage msg) { - super.onClose(msg); closeHandler(msg); } @Override protected void onError(WebSocketRequestHandler handler, ErrorMessage msg) { - super.onError(handler, msg); closeHandler(msg); } };