From 14755a6cea2d9e84e6e819dac8f4219c6c750e1d Mon Sep 17 00:00:00 2001 From: Jamie Doornbos Date: Tue, 4 Nov 2008 08:37:13 +0000 Subject: [PATCH] Fixed fundamental flaw with throttling code. Changed the client to adjust its message rate when it actually sends the throttle updated message. Otherwise the client starts sending at the new rate before the server knows about it. Keep the messages per second in the message. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5499 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- src/as/com/threerings/presents/client/Client.as | 8 +++++++- .../threerings/presents/client/Communicator.as | 3 +++ .../presents/net/ThrottleUpdatedMessage.as | 15 +++++++++++++++ .../presents/net/ThrottleUpdatedMessage.java | 16 +++++++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/as/com/threerings/presents/client/Client.as b/src/as/com/threerings/presents/client/Client.as index bb61a8bc4..caac57e9a 100644 --- a/src/as/com/threerings/presents/client/Client.as +++ b/src/as/com/threerings/presents/client/Client.as @@ -414,8 +414,14 @@ public class Client extends EventDispatcher internal function setOutgoingMessageThrottle (messagesPerSec :int) :void { + _comm.postMessage(new ThrottleUpdatedMessage(messagesPerSec)); + } + + internal function finalizeOutgoingMessageThrottle (messagesPerSec :int) :void + { + // when the throttle update message goes out to the server _outThrottle.reinit(messagesPerSec, 1000); - _comm.postMessage(new ThrottleUpdatedMessage()); + log.info("Updated outgoing throttle", "messagesPerSec", messagesPerSec); } internal function getOutgoingMessageThrottle () :Throttle diff --git a/src/as/com/threerings/presents/client/Communicator.as b/src/as/com/threerings/presents/client/Communicator.as index 07d7b8dc7..c1888d7c2 100644 --- a/src/as/com/threerings/presents/client/Communicator.as +++ b/src/as/com/threerings/presents/client/Communicator.as @@ -45,6 +45,7 @@ import com.threerings.presents.net.AuthResponseData; import com.threerings.presents.net.DownstreamMessage; import com.threerings.presents.net.LogoffRequest; import com.threerings.presents.net.UpstreamMessage; +import com.threerings.presents.net.ThrottleUpdatedMessage; public class Communicator { @@ -192,6 +193,8 @@ public class Communicator // if this was a logoff request, shutdown if (msg is LogoffRequest) { shutdown(null); + } else if (msg is ThrottleUpdatedMessage) { + _client.finalizeOutgoingMessageThrottle(ThrottleUpdatedMessage(msg).messagesPerSec); } } } diff --git a/src/as/com/threerings/presents/net/ThrottleUpdatedMessage.as b/src/as/com/threerings/presents/net/ThrottleUpdatedMessage.as index 654fcffe8..74b70bd70 100644 --- a/src/as/com/threerings/presents/net/ThrottleUpdatedMessage.as +++ b/src/as/com/threerings/presents/net/ThrottleUpdatedMessage.as @@ -21,10 +21,25 @@ package com.threerings.presents.net { +import com.threerings.io.ObjectOutputStream; + /** * Notifies the server that the client has received its UpdateThrottleMessage. */ public class ThrottleUpdatedMessage extends UpstreamMessage { + /** The number of messages allowed per second. */ + public var messagesPerSec :int; + + public function ThrottleUpdatedMessage (messagesPerSec :int = 0) + { + this.messagesPerSec = messagesPerSec; + } + + override public function writeObject (outs :ObjectOutputStream) :void + { + super.writeObject(outs); + outs.writeInt(messagesPerSec); + } } } diff --git a/src/java/com/threerings/presents/net/ThrottleUpdatedMessage.java b/src/java/com/threerings/presents/net/ThrottleUpdatedMessage.java index c7c63b2ee..1e4964d39 100644 --- a/src/java/com/threerings/presents/net/ThrottleUpdatedMessage.java +++ b/src/java/com/threerings/presents/net/ThrottleUpdatedMessage.java @@ -26,5 +26,19 @@ package com.threerings.presents.net; */ public class ThrottleUpdatedMessage extends UpstreamMessage { - // nothing needed + /** The number of messages allowed per second. */ + public final int messagesPerSec; + + /** + * Zero argument constructor used when unserializing an instance. + */ + public ThrottleUpdatedMessage () + { + this.messagesPerSec = 0; + } + + public ThrottleUpdatedMessage (int messagesPerSec) + { + this.messagesPerSec = messagesPerSec; + } }