From 95a3d6372d5cb6d0b702ecc26f2433b19b69c323 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Wed, 1 Oct 2008 17:18:20 +0000 Subject: [PATCH] * Fix bug in LLPacketHandler where the tickcount when a packet was approximately sent was not being stored in the ack record * This meant that acks were being sent out every 250ms when the ack timer fired, rather than when they had actually aged past m_ResendTimeout --- .../ClientStack/LindenUDP/LLPacketHandler.cs | 28 +++++++++++++------ .../ClientStack/LindenUDP/LLPacketServer.cs | 2 +- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs index d57321e41f..0608b7f60a 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs @@ -78,8 +78,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP public class LLPacketHandler : IPacketHandler { -// private static readonly ILog m_log = -// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + //private static readonly ILog m_log = + // LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // Packet queues // @@ -102,10 +102,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP // private class AckData { - public AckData(Packet packet, Object identifier) + public AckData(Packet packet, Object identifier, int tickCount) { Packet = packet; Identifier = identifier; + TickCount = tickCount; } public Packet Packet; @@ -355,7 +356,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // Resend the packet. Set the packet's tick count to // now, and keep it marked as resent. - // + //m_log.DebugFormat( + // "[CLIENT]: Resending unacked packet number {0} after {1}ms", + // packet.Header.Sequence, now - data.TickCount); + packet.Header.Resent = true; QueuePacket(packet, ThrottleOutPacketType.Resend, data.Identifier); @@ -372,7 +376,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (!m_ReliableIsImportant || !packet.Header.Reliable) { if (!m_ImportantPackets.Contains(packet.Type)) + { m_NeedAck.Remove(packet.Header.Sequence); + + //m_log.DebugFormat( + // "[CLIENT]: Discarding ack requirement for packet number {0}", + // packet.Header.Sequence); + } TriggerOnPacketDrop(packet, data.Identifier); @@ -611,6 +621,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP lock (m_NeedAck) { + //m_log.DebugFormat("[CLIENT]: Received ack for packet sequence number {0}", id); + if (!m_NeedAck.TryGetValue(id, out data)) return; @@ -691,7 +703,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { } - m_NeedAck.Add(key, new AckData(packet, null)); + m_NeedAck.Add(key, new AckData(packet, null, System.Environment.TickCount)); } m_Sequence = info.sequence; @@ -741,8 +753,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP { Packet packet = item.Packet; - // Keep track of when this packet was sent out - item.TickCount = System.Environment.TickCount; // Assign sequence number here to prevent out of order packets if (packet.Header.Sequence == 0) @@ -755,8 +765,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (packet.Header.Reliable) { m_UnackedBytes += packet.ToBytes().Length; + + // Keep track of when this packet was sent out m_NeedAck[packet.Header.Sequence] = new AckData(packet, - item.Identifier); + item.Identifier, System.Environment.TickCount); } } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs index 50205589e8..1713755763 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketServer.cs @@ -137,7 +137,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } /// - /// + /// Send a packet to the given circuit /// /// ///