diff --git a/core/src/main/java/com/threerings/presents/client/Client.java b/core/src/main/java/com/threerings/presents/client/Client.java index 4c875735b..1c4ea7b27 100644 --- a/core/src/main/java/com/threerings/presents/client/Client.java +++ b/core/src/main/java/com/threerings/presents/client/Client.java @@ -971,6 +971,27 @@ public class Client return false; } + /** + * Should we be logging the specified failure? + */ + protected boolean isFailureLoggable (FailureType type) + { + return true; + } + + /** + * The types of failures that may occur in our associated classes, which may call + * isFailureLoggable() for use to arbitrate whether we want to log the error. + */ + protected enum FailureType + { + /** An attempt was made to unsubscribe from an object that is not proxied. */ + UNSUBSCRIBE_NOT_PROXIED, + + // TODO: fill out more + ; + } + /** Handles the process of switching between servers. See {@link Client#moveToServer}. */ protected class ServerSwitcher extends ClientAdapter { diff --git a/core/src/main/java/com/threerings/presents/client/ClientDObjectMgr.java b/core/src/main/java/com/threerings/presents/client/ClientDObjectMgr.java index 089043813..b8b294f43 100644 --- a/core/src/main/java/com/threerings/presents/client/ClientDObjectMgr.java +++ b/core/src/main/java/com/threerings/presents/client/ClientDObjectMgr.java @@ -442,7 +442,7 @@ public class ClientDObjectMgr if (dobj != null) { dobj.removeSubscriber(target); - } else { + } else if (_client.isFailureLoggable(Client.FailureType.UNSUBSCRIBE_NOT_PROXIED)) { log.info("Requested to remove subscriber from non-proxied object", "oid", oid, "sub", target); } diff --git a/core/src/main/java/com/threerings/presents/peer/server/PeerNode.java b/core/src/main/java/com/threerings/presents/peer/server/PeerNode.java index 4f38879ac..0a062e1a8 100644 --- a/core/src/main/java/com/threerings/presents/peer/server/PeerNode.java +++ b/core/src/main/java/com/threerings/presents/peer/server/PeerNode.java @@ -80,6 +80,10 @@ public class PeerNode @Override protected Communicator createCommunicator () { return PeerNode.this.createCommunicator(this); } + @Override protected boolean isFailureLoggable (FailureType type) { + return (type != FailureType.UNSUBSCRIBE_NOT_PROXIED) && + super.isFailureLoggable(type); + } }; _client.addClientObserver(this); }