From 3e0e1057acffa2c92a6f949cef0183193033d8c2 Mon Sep 17 00:00:00 2001
From: Mic Bowman
Date: Fri, 15 Apr 2011 16:44:53 -0700
Subject: Remove the call to remove tokens from the parent. Under heavy load
 this appears to cause problems with the system timer resolution. This caused
 a problem with tokens going into the root throttle as bursts leading to some
 starvation.

Also changed EnqueueOutgoing to always queue a packet if there
are already packets in the queue. Ensures consistent ordering
of packet sends.
---
 OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 10 ++++++++++
 OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs |  9 ++++-----
 2 files changed, 14 insertions(+), 5 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index 5a69851..7be8a0a 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -440,6 +440,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
                 OpenSim.Framework.LocklessQueue<OutgoingPacket> queue = m_packetOutboxes[category];
                 TokenBucket bucket = m_throttleCategories[category];
 
+                // Don't send this packet if there is already a packet waiting in the queue
+                // even if we have the tokens to send it, tokens should go to the already
+                // queued packets
+                if (queue.Count > 0)
+                {
+                    queue.Enqueue(packet);
+                    return true;
+                }
+                
+                    
                 if (!forceQueue && bucket.RemoveTokens(packet.Buffer.DataLength))
                 {
                     // Enough tokens were removed from the bucket, the packet will not be queued
diff --git a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
index e4d59ff..07b0a1d 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
@@ -255,11 +255,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
             // If we have enough tokens then remove them and return
             if (m_tokenCount - amount >= 0)
             {
-                if (m_parent == null || m_parent.RemoveTokens(amount))
-                {
-                    m_tokenCount -= amount;
-                    return true;
-                }
+                // we don't have to remove from the parent, the drip rate is already
+                // reflective of the drip rate limits in the parent
+                m_tokenCount -= amount;
+                return true;
             }
 
             return false;
-- 
cgit v1.1