From 542118adf1791075bfb904d805a2c29cf303237e Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Wed, 20 Aug 2014 18:55:06 +0100
Subject: remove from use the UpdatesResend on resending udp packets. Just
resend the UDP packet. Also just loose packets we tried to send 6 times
already (ll says 3) A viewer may just beeing ignoring them, or then the link
is just dead.
---
.../Region/ClientStack/Linden/UDP/LLClientView.cs | 80 ++++++++++++----------
.../Region/ClientStack/Linden/UDP/LLUDPServer.cs | 10 +++
2 files changed, 54 insertions(+), 36 deletions(-)
(limited to 'OpenSim/Region/ClientStack')
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index b0cb4ea..475cfe2 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -3838,47 +3838,53 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation));
}
- ///
- /// Requeue an EntityUpdate when it was not acknowledged by the client.
- /// We will update the priority and put it in the correct queue, merging update flags
- /// with any other updates that may be queued for the same entity.
- /// The original update time is used for the merged update.
- ///
- private void ResendPrimUpdate(EntityUpdate update)
- {
- // If the update exists in priority queue, it will be updated.
- // If it does not exist then it will be added with the current (rather than its original) priority
- uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity);
+ /* dont use this
+ udp packet resent must be done at udp level only
+ re map from a packet to original updates just doesnt work
- lock (m_entityUpdates.SyncRoot)
- m_entityUpdates.Enqueue(priority, update);
- }
+ ///
+ /// Requeue an EntityUpdate when it was not acknowledged by the client.
+ /// We will update the priority and put it in the correct queue, merging update flags
+ /// with any other updates that may be queued for the same entity.
+ /// The original update time is used for the merged update.
+ ///
+ private void ResendPrimUpdate(EntityUpdate update)
+ {
+ // If the update exists in priority queue, it will be updated.
+ // If it does not exist then it will be added with the current (rather than its original) priority
+ uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity);
- ///
- /// Requeue a list of EntityUpdates when they were not acknowledged by the client.
- /// We will update the priority and put it in the correct queue, merging update flags
- /// with any other updates that may be queued for the same entity.
- /// The original update time is used for the merged update.
- ///
- private void ResendPrimUpdates(List updates, OutgoingPacket oPacket)
- {
- // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber);
+ lock (m_entityUpdates.SyncRoot)
+ m_entityUpdates.Enqueue(priority, update);
+ }
- // Remove the update packet from the list of packets waiting for acknowledgement
- // because we are requeuing the list of updates. They will be resent in new packets
- // with the most recent state and priority.
- m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
- // Count this as a resent packet since we are going to requeue all of the updates contained in it
- Interlocked.Increment(ref m_udpClient.PacketsResent);
+ ///
+ /// Requeue a list of EntityUpdates when they were not acknowledged by the client.
+ /// We will update the priority and put it in the correct queue, merging update flags
+ /// with any other updates that may be queued for the same entity.
+ /// The original update time is used for the merged update.
+ ///
+ private void ResendPrimUpdates(List updates, OutgoingPacket oPacket)
+ {
+ // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber);
- // We're not going to worry about interlock yet since its not currently critical that this total count
- // is 100% correct
- m_udpServer.PacketsResentCount++;
+ // Remove the update packet from the list of packets waiting for acknowledgement
+ // because we are requeuing the list of updates. They will be resent in new packets
+ // with the most recent state and priority.
+ m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
- foreach (EntityUpdate update in updates)
- ResendPrimUpdate(update);
- }
+ // Count this as a resent packet since we are going to requeue all of the updates contained in it
+ Interlocked.Increment(ref m_udpClient.PacketsResent);
+
+ // We're not going to worry about interlock yet since its not currently critical that this total count
+ // is 100% correct
+ m_udpServer.PacketsResentCount++;
+
+ foreach (EntityUpdate update in updates)
+ ResendPrimUpdate(update);
+ }
+ */
// OpenSim.Framework.Lazy> objectUpdateBlocks = new OpenSim.Framework.Lazy>();
// OpenSim.Framework.Lazy> compressedUpdateBlocks = new OpenSim.Framework.Lazy>();
@@ -4197,7 +4203,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
for (int i = 0; i < blocks.Count; i++)
packet.ObjectData[i] = blocks[i];
- OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); });
+// OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); });
+ // use default udp retry
+ OutPacket(packet, ThrottleOutPacketType.Task, true);
}
#endregion Packet Sending
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 3b0312d..bf44152 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -1207,6 +1207,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
//m_log.DebugFormat("[LLUDPSERVER]: Resending packet #{0} (attempt {1}), {2}ms have passed",
// outgoingPacket.SequenceNumber, outgoingPacket.ResendCount, Environment.TickCount - outgoingPacket.TickCount);
+ // Bump up the resend count on this packet
+ Interlocked.Increment(ref outgoingPacket.ResendCount);
+
+ // loose packets we retried more than 6 times
+ // sl says 3 so lets be more tolerant
+ // we can't not keep hammering with packets a viewer may just beeing ignoring
+
+ if (outgoingPacket.ResendCount > 6)
+ return;
+
// Set the resent flag
outgoingPacket.Buffer.Data[0] = (byte)(outgoingPacket.Buffer.Data[0] | Helpers.MSG_RESENT);
outgoingPacket.Category = ThrottleOutPacketType.Resend;
--
cgit v1.1