diff options
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 80 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 10 |
2 files changed, 54 insertions, 36 deletions
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 | |||
3838 | m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation)); | 3838 | m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation)); |
3839 | } | 3839 | } |
3840 | 3840 | ||
3841 | /// <summary> | 3841 | /* dont use this |
3842 | /// Requeue an EntityUpdate when it was not acknowledged by the client. | 3842 | udp packet resent must be done at udp level only |
3843 | /// We will update the priority and put it in the correct queue, merging update flags | 3843 | re map from a packet to original updates just doesnt work |
3844 | /// with any other updates that may be queued for the same entity. | ||
3845 | /// The original update time is used for the merged update. | ||
3846 | /// </summary> | ||
3847 | private void ResendPrimUpdate(EntityUpdate update) | ||
3848 | { | ||
3849 | // If the update exists in priority queue, it will be updated. | ||
3850 | // If it does not exist then it will be added with the current (rather than its original) priority | ||
3851 | uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity); | ||
3852 | 3844 | ||
3853 | lock (m_entityUpdates.SyncRoot) | 3845 | /// <summary> |
3854 | m_entityUpdates.Enqueue(priority, update); | 3846 | /// Requeue an EntityUpdate when it was not acknowledged by the client. |
3855 | } | 3847 | /// We will update the priority and put it in the correct queue, merging update flags |
3848 | /// with any other updates that may be queued for the same entity. | ||
3849 | /// The original update time is used for the merged update. | ||
3850 | /// </summary> | ||
3851 | private void ResendPrimUpdate(EntityUpdate update) | ||
3852 | { | ||
3853 | // If the update exists in priority queue, it will be updated. | ||
3854 | // If it does not exist then it will be added with the current (rather than its original) priority | ||
3855 | uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity); | ||
3856 | 3856 | ||
3857 | /// <summary> | 3857 | lock (m_entityUpdates.SyncRoot) |
3858 | /// Requeue a list of EntityUpdates when they were not acknowledged by the client. | 3858 | m_entityUpdates.Enqueue(priority, update); |
3859 | /// We will update the priority and put it in the correct queue, merging update flags | 3859 | } |
3860 | /// with any other updates that may be queued for the same entity. | ||
3861 | /// The original update time is used for the merged update. | ||
3862 | /// </summary> | ||
3863 | private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket) | ||
3864 | { | ||
3865 | // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber); | ||
3866 | 3860 | ||
3867 | // Remove the update packet from the list of packets waiting for acknowledgement | ||
3868 | // because we are requeuing the list of updates. They will be resent in new packets | ||
3869 | // with the most recent state and priority. | ||
3870 | m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber); | ||
3871 | 3861 | ||
3872 | // Count this as a resent packet since we are going to requeue all of the updates contained in it | 3862 | /// <summary> |
3873 | Interlocked.Increment(ref m_udpClient.PacketsResent); | 3863 | /// Requeue a list of EntityUpdates when they were not acknowledged by the client. |
3864 | /// We will update the priority and put it in the correct queue, merging update flags | ||
3865 | /// with any other updates that may be queued for the same entity. | ||
3866 | /// The original update time is used for the merged update. | ||
3867 | /// </summary> | ||
3868 | private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket) | ||
3869 | { | ||
3870 | // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber); | ||
3874 | 3871 | ||
3875 | // We're not going to worry about interlock yet since its not currently critical that this total count | 3872 | // Remove the update packet from the list of packets waiting for acknowledgement |
3876 | // is 100% correct | 3873 | // because we are requeuing the list of updates. They will be resent in new packets |
3877 | m_udpServer.PacketsResentCount++; | 3874 | // with the most recent state and priority. |
3875 | m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber); | ||
3878 | 3876 | ||
3879 | foreach (EntityUpdate update in updates) | 3877 | // Count this as a resent packet since we are going to requeue all of the updates contained in it |
3880 | ResendPrimUpdate(update); | 3878 | Interlocked.Increment(ref m_udpClient.PacketsResent); |
3881 | } | 3879 | |
3880 | // We're not going to worry about interlock yet since its not currently critical that this total count | ||
3881 | // is 100% correct | ||
3882 | m_udpServer.PacketsResentCount++; | ||
3883 | |||
3884 | foreach (EntityUpdate update in updates) | ||
3885 | ResendPrimUpdate(update); | ||
3886 | } | ||
3887 | */ | ||
3882 | 3888 | ||
3883 | // OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); | 3889 | // OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); |
3884 | // OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>> compressedUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>>(); | 3890 | // OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>> compressedUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>>(); |
@@ -4197,7 +4203,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4197 | for (int i = 0; i < blocks.Count; i++) | 4203 | for (int i = 0; i < blocks.Count; i++) |
4198 | packet.ObjectData[i] = blocks[i]; | 4204 | packet.ObjectData[i] = blocks[i]; |
4199 | 4205 | ||
4200 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); | 4206 | // OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); |
4207 | // use default udp retry | ||
4208 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
4201 | } | 4209 | } |
4202 | 4210 | ||
4203 | #endregion Packet Sending | 4211 | #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 | |||
1207 | //m_log.DebugFormat("[LLUDPSERVER]: Resending packet #{0} (attempt {1}), {2}ms have passed", | 1207 | //m_log.DebugFormat("[LLUDPSERVER]: Resending packet #{0} (attempt {1}), {2}ms have passed", |
1208 | // outgoingPacket.SequenceNumber, outgoingPacket.ResendCount, Environment.TickCount - outgoingPacket.TickCount); | 1208 | // outgoingPacket.SequenceNumber, outgoingPacket.ResendCount, Environment.TickCount - outgoingPacket.TickCount); |
1209 | 1209 | ||
1210 | // Bump up the resend count on this packet | ||
1211 | Interlocked.Increment(ref outgoingPacket.ResendCount); | ||
1212 | |||
1213 | // loose packets we retried more than 6 times | ||
1214 | // sl says 3 so lets be more tolerant | ||
1215 | // we can't not keep hammering with packets a viewer may just beeing ignoring | ||
1216 | |||
1217 | if (outgoingPacket.ResendCount > 6) | ||
1218 | return; | ||
1219 | |||
1210 | // Set the resent flag | 1220 | // Set the resent flag |
1211 | outgoingPacket.Buffer.Data[0] = (byte)(outgoingPacket.Buffer.Data[0] | Helpers.MSG_RESENT); | 1221 | outgoingPacket.Buffer.Data[0] = (byte)(outgoingPacket.Buffer.Data[0] | Helpers.MSG_RESENT); |
1212 | outgoingPacket.Category = ThrottleOutPacketType.Resend; | 1222 | outgoingPacket.Category = ThrottleOutPacketType.Resend; |