diff options
author | Dan Lake | 2011-04-20 23:08:51 -0700 |
---|---|---|
committer | Dan Lake | 2011-04-20 23:08:51 -0700 |
commit | b5ab33b5e190e79789df3f44b24959fd229a8c6d (patch) | |
tree | b8daedb3660c39382f9dfc816087e79da2b4f39e | |
parent | Added an "immediate" queue to the priority queue. This is (diff) | |
download | opensim-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.cs | 34 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs | 3 |
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 | ||
32 | namespace OpenSim.Region.ClientStack.LindenUDP | 32 | namespace 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 |