From 438798202fc1f578864a2796cb8a66b3199a77e0 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 29 Aug 2014 13:26:30 +0100 Subject: [PATCH] replace the tick() by a limit on the maximum number of tokens that can be acumulated ( variable named BurtRate, not exactly a rate...) --- .../ClientStack/Linden/UDP/LLUDPClient.cs | 2 - .../ClientStack/Linden/UDP/TokenBucket.cs | 52 ++++++++++++++----- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs index e7605130dd..89a9401373 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs @@ -616,8 +616,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // No packets in this queue. Fire the queue empty callback // if it has not been called recently - - bucket.Tick(); // tick the bucket emptyCategories |= CategoryToFlag(i); } } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs b/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs index a2ff884bea..3147095a33 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs @@ -53,10 +53,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected const Int32 m_ticksPerQuantum = 1000; /// - /// This is the number of quantums worth of packets that can - /// be accommodated during a burst + /// This is the number of m_minimumDripRate bytes + /// allowed in a burst + /// roughtly, with this settings, the maximum time system will take + /// to recheck a bucket in ms + /// /// - protected const Double m_quantumsPerBurst = 1.5; + protected const Double m_quantumsPerBurst = 15; /// /// @@ -91,22 +94,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP } /// - /// Maximum burst rate in bytes per second. This is the maximum number + /// This is the maximum number /// of tokens that can accumulate in the bucket at any one time. This /// also sets the total request for leaf nodes + /// this is not a rate. /// protected Int64 m_burstRate; public Int64 RequestedBurstRate { get { return m_burstRate; } - set { m_burstRate = (value < 0 ? 0 : value); } + set { + double rate = (value < 0 ? 0 : value); + if (rate < m_minimumDripRate) + rate = m_minimumDripRate; + else if (rate > m_minimumDripRate * m_quantumsPerBurst) + rate = m_minimumDripRate * m_quantumsPerBurst; + + m_burstRate = (Int64)rate; + } } public Int64 BurstRate { get { double rate = RequestedBurstRate * BurstRateModifier(); - if (rate < m_minimumDripRate * m_quantumsPerBurst) + if (rate < m_minimumDripRate) + rate = m_minimumDripRate; + else if (rate > m_minimumDripRate * m_quantumsPerBurst) rate = m_minimumDripRate * m_quantumsPerBurst; return (Int64) rate; @@ -126,8 +140,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP get { return (m_dripRate == 0 ? m_totalDripRequest : m_dripRate); } set { m_dripRate = (value < 0 ? 0 : value); - m_burstRate = (Int64)((double)m_dripRate * m_quantumsPerBurst); m_totalDripRequest = m_dripRate; + + double rate = m_dripRate; + if (rate > m_minimumDripRate * m_quantumsPerBurst) + rate = m_minimumDripRate * m_quantumsPerBurst; + else if (rate < m_minimumDripRate) + rate = m_minimumDripRate; + + m_burstRate = (Int64)rate; + + m_tokenCount = 0; + if (m_parent != null) m_parent.RegisterRequest(this,m_dripRate); } @@ -325,11 +349,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP Deposit(deltaMS * DripRate / m_ticksPerQuantum); } - - public void Tick() - { - m_lastDrip = Util.EnvironmentTickCount(); - } } public class AdaptiveTokenBucket : TokenBucket @@ -364,7 +383,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP get { return m_dripRate; } set { m_dripRate = OpenSim.Framework.Util.Clamp(value,m_minimumFlow,MaxDripRate); - m_burstRate = (Int64)((double)m_dripRate * m_quantumsPerBurst); + + double rate = m_dripRate; + if (rate > m_minimumDripRate * m_quantumsPerBurst) + rate = m_minimumDripRate * m_quantumsPerBurst; + else if (rate < m_minimumDripRate) + rate = m_minimumDripRate; + m_burstRate = (Int64)rate; + if (m_parent != null) m_parent.RegisterRequest(this,m_dripRate); }