aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDan Lake2011-04-20 23:08:51 -0700
committerDan Lake2011-04-20 23:08:51 -0700
commitb5ab33b5e190e79789df3f44b24959fd229a8c6d (patch)
treeb8daedb3660c39382f9dfc816087e79da2b4f39e
parentAdded an "immediate" queue to the priority queue. This is (diff)
downloadopensim-SC_OLD-b5ab33b5e190e79789df3f44b24959fd229a8c6d.zip
opensim-SC_OLD-b5ab33b5e190e79789df3f44b24959fd229a8c6d.tar.gz
opensim-SC_OLD-b5ab33b5e190e79789df3f44b24959fd229a8c6d.tar.bz2
opensim-SC_OLD-b5ab33b5e190e79789df3f44b24959fd229a8c6d.tar.xz
bug fix. Now when an unacked update packet is handled through ResendPrimUpdates, it is removed from the UnackedPacketCollection.
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs34
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs4
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs3
3 files changed, 25 insertions, 16 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 1108863..1e8bbb8 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -3583,10 +3583,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3583 /// with any other updates that may be queued for the same entity. 3583 /// with any other updates that may be queued for the same entity.
3584 /// The original update time is used for the merged update. 3584 /// The original update time is used for the merged update.
3585 /// </summary> 3585 /// </summary>
3586 private void ResendPrimUpdates(List<EntityUpdate> updates) 3586 private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket)
3587 { 3587 {
3588 // m_log.WarnFormat("[CLIENT] resending prim update {0}",updates[0].UpdateTime); 3588 // m_log.WarnFormat("[CLIENT] resending prim update {0}",updates[0].UpdateTime);
3589 3589
3590 // Remove the update packet from the list of packets waiting for acknowledgement
3591 // because we are requeuing the list of updates. They will be resent in new packets
3592 // with the most recent state and priority.
3593 m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber, 0, true);
3590 foreach (EntityUpdate update in updates) 3594 foreach (EntityUpdate update in updates)
3591 ResendPrimUpdate(update); 3595 ResendPrimUpdate(update);
3592 } 3596 }
@@ -3771,7 +3775,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3771 for (int i = 0; i < blocks.Count; i++) 3775 for (int i = 0; i < blocks.Count; i++)
3772 packet.ObjectData[i] = blocks[i]; 3776 packet.ObjectData[i] = blocks[i];
3773 // If any of the packets created from this call go unacknowledged, all of the updates will be resent 3777 // If any of the packets created from this call go unacknowledged, all of the updates will be resent
3774 OutPacket(packet, ThrottleOutPacketType.Unknown, true, delegate() { ResendPrimUpdates(terseAgentUpdates.Value); }); 3778 OutPacket(packet, ThrottleOutPacketType.Unknown, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseAgentUpdates.Value, oPacket); });
3775 } 3779 }
3776 3780
3777 if (objectUpdateBlocks.IsValueCreated) 3781 if (objectUpdateBlocks.IsValueCreated)
@@ -3786,7 +3790,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3786 for (int i = 0; i < blocks.Count; i++) 3790 for (int i = 0; i < blocks.Count; i++)
3787 packet.ObjectData[i] = blocks[i]; 3791 packet.ObjectData[i] = blocks[i];
3788 // If any of the packets created from this call go unacknowledged, all of the updates will be resent 3792 // If any of the packets created from this call go unacknowledged, all of the updates will be resent
3789 OutPacket(packet, ThrottleOutPacketType.Task, true, delegate() { ResendPrimUpdates(objectUpdates.Value); }); 3793 OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(objectUpdates.Value, oPacket); });
3790 } 3794 }
3791 3795
3792 if (compressedUpdateBlocks.IsValueCreated) 3796 if (compressedUpdateBlocks.IsValueCreated)
@@ -3801,7 +3805,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3801 for (int i = 0; i < blocks.Count; i++) 3805 for (int i = 0; i < blocks.Count; i++)
3802 packet.ObjectData[i] = blocks[i]; 3806 packet.ObjectData[i] = blocks[i];
3803 // If any of the packets created from this call go unacknowledged, all of the updates will be resent 3807 // If any of the packets created from this call go unacknowledged, all of the updates will be resent
3804 OutPacket(packet, ThrottleOutPacketType.Task, true, delegate() { ResendPrimUpdates(compressedUpdates.Value); }); 3808 OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(compressedUpdates.Value, oPacket); });
3805 } 3809 }
3806 3810
3807 if (terseUpdateBlocks.IsValueCreated) 3811 if (terseUpdateBlocks.IsValueCreated)
@@ -3816,7 +3820,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3816 for (int i = 0; i < blocks.Count; i++) 3820 for (int i = 0; i < blocks.Count; i++)
3817 packet.ObjectData[i] = blocks[i]; 3821 packet.ObjectData[i] = blocks[i];
3818 // If any of the packets created from this call go unacknowledged, all of the updates will be resent 3822 // If any of the packets created from this call go unacknowledged, all of the updates will be resent
3819 OutPacket(packet, ThrottleOutPacketType.Task, true, delegate() { ResendPrimUpdates(terseUpdates.Value); }); 3823 OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); });
3820 } 3824 }
3821 } 3825 }
3822 3826
@@ -4027,10 +4031,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4027 m_entityProps.Enqueue(priority, update); 4031 m_entityProps.Enqueue(priority, update);
4028 } 4032 }
4029 4033
4030 private void ResendPropertyUpdates(List<ObjectPropertyUpdate> updates) 4034 private void ResendPropertyUpdates(List<ObjectPropertyUpdate> updates, OutgoingPacket oPacket)
4031 { 4035 {
4032 // m_log.WarnFormat("[CLIENT] resending object property {0}",updates[0].UpdateTime); 4036 // m_log.WarnFormat("[CLIENT] resending object property {0}",updates[0].UpdateTime);
4033 4037
4038 // Remove the update packet from the list of packets waiting for acknowledgement
4039 // because we are requeuing the list of updates. They will be resent in new packets
4040 // with the most recent state.
4041 m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber, 0, true);
4034 foreach (ObjectPropertyUpdate update in updates) 4042 foreach (ObjectPropertyUpdate update in updates)
4035 ResendPropertyUpdate(update); 4043 ResendPropertyUpdate(update);
4036 } 4044 }
@@ -4111,9 +4119,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4111 // Pass in the delegate so that if this packet needs to be resent, we send the current properties 4119 // Pass in the delegate so that if this packet needs to be resent, we send the current properties
4112 // of the object rather than the properties when the packet was created 4120 // of the object rather than the properties when the packet was created
4113 OutPacket(packet, ThrottleOutPacketType.Task, true, 4121 OutPacket(packet, ThrottleOutPacketType.Task, true,
4114 delegate() 4122 delegate(OutgoingPacket oPacket)
4115 { 4123 {
4116 ResendPropertyUpdates(updates); 4124 ResendPropertyUpdates(updates, oPacket);
4117 }); 4125 });
4118 4126
4119 // pbcnt += blocks.Count; 4127 // pbcnt += blocks.Count;
@@ -4126,7 +4134,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4126 if (objectFamilyBlocks.IsValueCreated) 4134 if (objectFamilyBlocks.IsValueCreated)
4127 { 4135 {
4128 List<ObjectPropertiesFamilyPacket.ObjectDataBlock> blocks = objectFamilyBlocks.Value; 4136 List<ObjectPropertiesFamilyPacket.ObjectDataBlock> blocks = objectFamilyBlocks.Value;
4129 List<ObjectPropertyUpdate> updates = familyUpdates.Value;
4130 4137
4131 // one packet per object block... uggh... 4138 // one packet per object block... uggh...
4132 for (int i = 0; i < blocks.Count; i++) 4139 for (int i = 0; i < blocks.Count; i++)
@@ -4139,11 +4146,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4139 4146
4140 // Pass in the delegate so that if this packet needs to be resent, we send the current properties 4147 // Pass in the delegate so that if this packet needs to be resent, we send the current properties
4141 // of the object rather than the properties when the packet was created 4148 // of the object rather than the properties when the packet was created
4142 ObjectPropertyUpdate update = updates[i]; 4149 List<ObjectPropertyUpdate> updates = new List<ObjectPropertyUpdate>();
4150 updates.Add(familyUpdates.Value[i]);
4143 OutPacket(packet, ThrottleOutPacketType.Task, true, 4151 OutPacket(packet, ThrottleOutPacketType.Task, true,
4144 delegate() 4152 delegate(OutgoingPacket oPacket)
4145 { 4153 {
4146 ResendPropertyUpdate(update); 4154 ResendPropertyUpdates(updates, oPacket);
4147 }); 4155 });
4148 4156
4149 // fpcnt++; 4157 // fpcnt++;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 0848979..bd58ddc 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -413,7 +413,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
413 413
414 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category, null); 414 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category, null);
415 // If we were not provided a method for handling unacked, use the UDPServer default method 415 // If we were not provided a method for handling unacked, use the UDPServer default method
416 outgoingPacket.UnackedMethod = ((method == null) ? delegate() { ResendUnacked(outgoingPacket); } : method); 416 outgoingPacket.UnackedMethod = ((method == null) ? delegate(OutgoingPacket oPacket) { ResendUnacked(oPacket); } : method);
417 417
418 // If a Linden Lab 1.23.5 client receives an update packet after a kill packet for an object, it will 418 // If a Linden Lab 1.23.5 client receives an update packet after a kill packet for an object, it will
419 // continue to display the deleted object until relog. Therefore, we need to always queue a kill object 419 // continue to display the deleted object until relog. Therefore, we need to always queue a kill object
@@ -494,7 +494,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
494 // Exponential backoff of the retransmission timeout 494 // Exponential backoff of the retransmission timeout
495 udpClient.BackoffRTO(); 495 udpClient.BackoffRTO();
496 for (int i = 0; i < expiredPackets.Count; ++i) 496 for (int i = 0; i < expiredPackets.Count; ++i)
497 expiredPackets[i].UnackedMethod(); 497 expiredPackets[i].UnackedMethod(expiredPackets[i]);
498 } 498 }
499 } 499 }
500 500
diff --git a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs
index f4f024b..76c6c14 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs
@@ -31,7 +31,8 @@ using OpenMetaverse;
31 31
32namespace OpenSim.Region.ClientStack.LindenUDP 32namespace OpenSim.Region.ClientStack.LindenUDP
33{ 33{
34 public delegate void UnackedPacketMethod(); 34
35 public delegate void UnackedPacketMethod(OutgoingPacket oPacket);
35 /// <summary> 36 /// <summary>
36 /// Holds a reference to the <seealso cref="LLUDPClient"/> this packet is 37 /// Holds a reference to the <seealso cref="LLUDPClient"/> this packet is
37 /// destined for, along with the serialized packet data, sequence number 38 /// destined for, along with the serialized packet data, sequence number