aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-12-02 01:55:49 +0000
committerJustin Clark-Casey (justincc)2010-12-02 02:01:01 +0000
commit5246d98b8df3cc613a199851c3ac33ec753f522a (patch)
treed4ce71333504fef05419ba27cbfbeabcaad0f4c1 /OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
parentminor: add some method doc (diff)
downloadopensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.zip
opensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.tar.gz
opensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.tar.bz2
opensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.tar.xz
Stop LLUDPServer sending updates after object deletes by always queueing deletes
If an LL 1.23.5 client (and possibly earlier and later) receives an object update after a kill object packet, it leaves the deleted prim in the scene until client relog This is possible in LLUDPServer if an object update packet is queued but a kill packet sent immediately. Beyond invasive tracking of kill sending, most expedient solution is to always queue kills, so that they always arrive after updates. In tests, this doesn't appear to affect performance. There is probably still an issue present where an update packet might not be acked and then resent after the kill packet.
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs8
1 files changed, 6 insertions, 2 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index ff4abf8..e54cfc2 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -410,7 +410,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
410 410
411 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category); 411 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category);
412 412
413 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket)) 413 // If a Linden Lab 1.23.5 client receives an update packet after a kill packet for an object, it will
414 // continue to display the deleted object until relog. Therefore, we need to always queue a kill object
415 // packet so that it isn't sent before a queued update packet.
416 bool requestQueue = type == PacketType.KillObject;
417 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, requestQueue))
414 SendPacketFinal(outgoingPacket); 418 SendPacketFinal(outgoingPacket);
415 419
416 #endregion Queue or Send 420 #endregion Queue or Send
@@ -503,7 +507,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
503 //Interlocked.Increment(ref Stats.ResentPackets); 507 //Interlocked.Increment(ref Stats.ResentPackets);
504 508
505 // Requeue or resend the packet 509 // Requeue or resend the packet
506 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket)) 510 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, false))
507 SendPacketFinal(outgoingPacket); 511 SendPacketFinal(outgoingPacket);
508 } 512 }
509 } 513 }