diff options
author | Dan Lake | 2011-04-18 16:48:49 -0700 |
---|---|---|
committer | Dan Lake | 2011-04-18 16:48:49 -0700 |
commit | 6e4d970dae2e292e4155174f5de13f7e774384a3 (patch) | |
tree | 78834f5a62bd2e3716a47002703da11696f70800 /OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs | |
parent | Merge branch 'master' into test-merge0418 (diff) | |
download | opensim-SC-6e4d970dae2e292e4155174f5de13f7e774384a3.zip opensim-SC-6e4d970dae2e292e4155174f5de13f7e774384a3.tar.gz opensim-SC-6e4d970dae2e292e4155174f5de13f7e774384a3.tar.bz2 opensim-SC-6e4d970dae2e292e4155174f5de13f7e774384a3.tar.xz |
Requeue unacknowledged entity updates rather than resend then "as is".
Often, by the time the UDPServer realizes that an entity update packet
has not been acknowledged, there is a newer update for the same entity
already queued up or there is a higher priority update that should be
sent first. This patch eliminates 1:1 packet resends for unacked entity
update packets. Insteawd, unacked update packets are decomposed into the
original entity updates and those updates are placed back into the
priority queues based on their new priority but the original update
timestamp. This will generally place them at the head of the line to be
put back on the wire as a new outgoing packet but prevents the resend
queue from filling up with multiple stale updates for the same entity.
This new approach takes advantage of the UDP nature of the Linden protocol
in that the intent of a reliable update packet is that if it goes
unacknowledge, SOMETHING has to happen to get the update to the client.
We are simply making sure that we are resending current object state
rather than stale object state.
Additionally, this patch includes a generalized callback mechanism so
that any caller can specify their own method to call when a packet
expires without being acknowledged. We use this mechanism to requeue
update packets and otherwise use the UDPServer default method of just
putting expired packets in the resend queue.
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs index 1a1a1cb..f4f024b 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs | |||
@@ -31,6 +31,7 @@ using OpenMetaverse; | |||
31 | 31 | ||
32 | namespace OpenSim.Region.ClientStack.LindenUDP | 32 | namespace OpenSim.Region.ClientStack.LindenUDP |
33 | { | 33 | { |
34 | public delegate void UnackedPacketMethod(); | ||
34 | /// <summary> | 35 | /// <summary> |
35 | /// Holds a reference to the <seealso cref="LLUDPClient"/> this packet is | 36 | /// Holds a reference to the <seealso cref="LLUDPClient"/> this packet is |
36 | /// destined for, along with the serialized packet data, sequence number | 37 | /// destined for, along with the serialized packet data, sequence number |
@@ -52,6 +53,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
52 | public int TickCount; | 53 | public int TickCount; |
53 | /// <summary>Category this packet belongs to</summary> | 54 | /// <summary>Category this packet belongs to</summary> |
54 | public ThrottleOutPacketType Category; | 55 | public ThrottleOutPacketType Category; |
56 | /// <summary>The delegate to be called if this packet is determined to be unacknowledged</summary> | ||
57 | public UnackedPacketMethod UnackedMethod; | ||
55 | 58 | ||
56 | /// <summary> | 59 | /// <summary> |
57 | /// Default constructor | 60 | /// Default constructor |
@@ -60,11 +63,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
60 | /// <param name="buffer">Serialized packet data. If the flags or sequence number | 63 | /// <param name="buffer">Serialized packet data. If the flags or sequence number |
61 | /// need to be updated, they will be injected directly into this binary buffer</param> | 64 | /// need to be updated, they will be injected directly into this binary buffer</param> |
62 | /// <param name="category">Throttling category for this packet</param> | 65 | /// <param name="category">Throttling category for this packet</param> |
63 | public OutgoingPacket(LLUDPClient client, UDPPacketBuffer buffer, ThrottleOutPacketType category) | 66 | public OutgoingPacket(LLUDPClient client, UDPPacketBuffer buffer, ThrottleOutPacketType category, UnackedPacketMethod method) |
64 | { | 67 | { |
65 | Client = client; | 68 | Client = client; |
66 | Buffer = buffer; | 69 | Buffer = buffer; |
67 | Category = category; | 70 | Category = category; |
71 | UnackedMethod = method; | ||
68 | } | 72 | } |
69 | } | 73 | } |
70 | } | 74 | } |