From bdf95e54a2da5b60e7817d748f7389289a59bc5e Mon Sep 17 00:00:00 2001 From: Mike Mazur Date: Wed, 25 Feb 2009 00:32:26 +0000 Subject: A few updates necessary for load balancer. - handle GetUser request for nonexistent user gracefully - include throttle levels in ClientInfo - code to save/restore throttles in client stack - only update/send updates to active clients - make animation classes serializable --- .../Region/ClientStack/LindenUDP/LLClientView.cs | 2 + .../ClientStack/LindenUDP/LLPacketHandler.cs | 59 +++++++++++++--------- .../Region/ClientStack/LindenUDP/LLPacketQueue.cs | 25 ++++++--- 3 files changed, 55 insertions(+), 31 deletions(-) (limited to 'OpenSim/Region/ClientStack/LindenUDP') diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index e643a0e..825e87a 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -2584,6 +2584,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP public void SendCoarseLocationUpdate(List CoarseLocations) { + if (!IsActive) return; // We don't need to update inactive clients. + CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket)PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate); // TODO: don't create new blocks if recycling an old packet int total = CoarseLocations.Count; diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs index 23118a2..4270222 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs @@ -196,13 +196,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP // configuration! // - if ((m_SynchronizeClient != null) && (!m_Client.IsActive)) - { - if (m_SynchronizeClient(m_Client.Scene, packet, - m_Client.AgentId, throttlePacketType)) - return; - } - packet.Header.Sequence = 0; lock (m_NeedAck) @@ -480,11 +473,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (packet == null) return; - // If this client is on another partial instance, no need - // to handle packets + // When too many acks are needed to be sent, the client sends + // a packet consisting of acks only // - if (!m_Client.IsActive && packet.Type != PacketType.LogoutRequest) + if (packet.Type == PacketType.PacketAck) { + PacketAckPacket ackPacket = (PacketAckPacket)packet; + + foreach (PacketAckPacket.PacketsBlock block in + ackPacket.Packets) + { + ProcessAck(block.ID); + } + PacketPool.Instance.ReturnPacket(packet); return; } @@ -500,26 +501,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - // When too many acks are needed to be sent, the client sends - // a packet consisting of acks only + // If this client is on another partial instance, no need + // to handle packets // - if (packet.Type == PacketType.PacketAck) + if (!m_Client.IsActive && packet.Type != PacketType.LogoutRequest) { - PacketAckPacket ackPacket = (PacketAckPacket)packet; - - foreach (PacketAckPacket.PacketsBlock block in - ackPacket.Packets) - { - ProcessAck(block.ID); - } - PacketPool.Instance.ReturnPacket(packet); return; } - else if (packet.Type == PacketType.StartPingCheck) + + if (packet.Type == PacketType.StartPingCheck) { StartPingCheckPacket startPing = (StartPingCheckPacket)packet; - CompletePingCheckPacket endPing + CompletePingCheckPacket endPing = (CompletePingCheckPacket)PacketPool.Instance.GetPacket(PacketType.CompletePingCheck); endPing.PingID.PingID = startPing.PingID.PingID; @@ -639,6 +633,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP info.sequence = m_Sequence; + float multiplier = m_PacketQueue.ThrottleMultiplier; + info.resendThrottle = (int) (m_PacketQueue.ResendThrottle.Throttle / multiplier); + info.landThrottle = (int) (m_PacketQueue.LandThrottle.Throttle / multiplier); + info.windThrottle = (int) (m_PacketQueue.WindThrottle.Throttle / multiplier); + info.cloudThrottle = (int) (m_PacketQueue.CloudThrottle.Throttle / multiplier); + info.taskThrottle = (int) (m_PacketQueue.TaskThrottle.Throttle / multiplier); + info.assetThrottle = (int) (m_PacketQueue.AssetThrottle.Throttle / multiplier); + info.textureThrottle = (int) (m_PacketQueue.TextureThrottle.Throttle / multiplier); + info.totalThrottle = (int) (m_PacketQueue.TotalThrottle.Throttle / multiplier); + return info; } @@ -676,6 +680,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP } m_Sequence = info.sequence; + + m_PacketQueue.ResendThrottle.Throttle = info.resendThrottle; + m_PacketQueue.LandThrottle.Throttle = info.landThrottle; + m_PacketQueue.WindThrottle.Throttle = info.windThrottle; + m_PacketQueue.CloudThrottle.Throttle = info.cloudThrottle; + m_PacketQueue.TaskThrottle.Throttle = info.taskThrottle; + m_PacketQueue.AssetThrottle.Throttle = info.assetThrottle; + m_PacketQueue.TextureThrottle.Throttle = info.textureThrottle; + m_PacketQueue.TotalThrottle.Throttle = info.totalThrottle; } public void AddImportantPacket(PacketType type) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs index 1c398d9..6bfa864 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs @@ -69,18 +69,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP // This value also determines how many times per throttletimems the timer will run // If throttleimems is 1000 ms, then the timer will fire every 1000/7 milliseconds + private float throttleMultiplier = 2.0f; // Default value really doesn't matter. private int throttleTimeDivisor = 7; private int throttletimems = 1000; - private LLPacketThrottle ResendThrottle; - private LLPacketThrottle LandThrottle; - private LLPacketThrottle WindThrottle; - private LLPacketThrottle CloudThrottle; - private LLPacketThrottle TaskThrottle; - private LLPacketThrottle AssetThrottle; - private LLPacketThrottle TextureThrottle; - private LLPacketThrottle TotalThrottle; + internal LLPacketThrottle ResendThrottle; + internal LLPacketThrottle LandThrottle; + internal LLPacketThrottle WindThrottle; + internal LLPacketThrottle CloudThrottle; + internal LLPacketThrottle TaskThrottle; + internal LLPacketThrottle AssetThrottle; + internal LLPacketThrottle TextureThrottle; + internal LLPacketThrottle TotalThrottle; // private long LastThrottle; // private long ThrottleInterval; @@ -108,6 +109,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP TextureOutgoingPacketQueue = new Queue(); AssetOutgoingPacketQueue = new Queue(); + // Store the throttle multiplier for posterity. + throttleMultiplier = userSettings.ClientThrottleMultipler; + // Set up the throttle classes (min, max, current) in bits per second ResendThrottle = new LLPacketThrottle(5000, 100000, 16000, userSettings.ClientThrottleMultipler); LandThrottle = new LLPacketThrottle(1000, 100000, 2000, userSettings.ClientThrottleMultipler); @@ -624,5 +628,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP { return SendQueue.GetQueueArray(); } + + public float ThrottleMultiplier + { + get { return throttleMultiplier; } + } } } -- cgit v1.1