From ef86404ed8f9d5a9600c7abbafb9faa217c3906c Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 5 Jul 2006 23:27:25 +0000 Subject: [PATCH] Ignore peer clients, and scan through the client info set when removing because we can't rely on building a new client info at session end time because the client's ClientObject will have been destroyed. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4250 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/peer/data/NodeObject.java | 2 +- .../presents/peer/server/PeerManager.java | 34 +++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/java/com/threerings/presents/peer/data/NodeObject.java b/src/java/com/threerings/presents/peer/data/NodeObject.java index 1610d698f..f279b68c7 100644 --- a/src/java/com/threerings/presents/peer/data/NodeObject.java +++ b/src/java/com/threerings/presents/peer/data/NodeObject.java @@ -35,7 +35,7 @@ public class NodeObject extends DObject // AUTO-GENERATED: FIELDS END /** Contains information on all clients connected to this node. */ - public DSet clients; + public DSet clients = new DSet(); // AUTO-GENERATED: METHODS START /** diff --git a/src/java/com/threerings/presents/peer/server/PeerManager.java b/src/java/com/threerings/presents/peer/server/PeerManager.java index df8d8ea13..135afc599 100644 --- a/src/java/com/threerings/presents/peer/server/PeerManager.java +++ b/src/java/com/threerings/presents/peer/server/PeerManager.java @@ -31,6 +31,8 @@ import com.samskivert.jdbc.ConnectionProvider; import com.samskivert.util.Interval; import com.samskivert.util.Invoker; +import com.threerings.util.Name; + import com.threerings.presents.client.Client; import com.threerings.presents.client.ClientObserver; import com.threerings.presents.dobj.ObjectAccessException; @@ -149,6 +151,11 @@ public class PeerManager // documentation inherited from interface ClientManager.ClientObserver public void clientSessionDidStart (PresentsClient client) { + // if this is another peer, don't publish their info + if (client instanceof PeerClient) { + return; + } + // create and publish a ClientInfo record for this client ClientInfo clinfo = createClientInfo(); initClientInfo(client, clinfo); @@ -169,18 +176,23 @@ public class PeerManager // documentation inherited from interface ClientManager.ClientObserver public void clientSessionDidEnd (PresentsClient client) { - // we create a new client info for this client so that we can support - // derived classes overriding the value we use for the DSet key - ClientInfo clinfo = createClientInfo(); - initClientInfo(client, clinfo); - - // sanity check - if (!_nodeobj.clients.containsKey(clinfo.getKey())) { - log.warning("Session ended for unregistered client " + - "[info=" + clinfo + "]."); - } else { - _nodeobj.removeFromClients(clinfo.getKey()); + // if this is another peer, don't worry about it + if (client instanceof PeerClient) { + return; } + + // we scan through the list instead of relying on ClientInfo.getKey() + // because we want derived classes to be able to override that for + // lookups that happen way more frequently than logging off + Name username = client.getCredentials().getUsername(); + for (ClientInfo clinfo : _nodeobj.clients) { + if (clinfo.username.equals(username)) { + _nodeobj.removeFromClients(clinfo.getKey()); + return; + } + } + log.warning("Session ended for unregistered client " + + "[who=" + username + "]."); } /**