aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs100
1 files changed, 100 insertions, 0 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 5ff9aee..72257d2 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Diagnostics;
30using System.IO; 31using System.IO;
31using System.Net; 32using System.Net;
32using System.Net.Sockets; 33using System.Net.Sockets;
@@ -1053,6 +1054,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1053 1054
1054 #endregion Update Timers 1055 #endregion Update Timers
1055 1056
1057 if (m_scene.EmergencyMonitoring)
1058 clientPacketHandler = MonitoredClientOutgoingPacketHandler;
1059
1056 // Handle outgoing packets, resends, acknowledgements, and pings for each 1060 // Handle outgoing packets, resends, acknowledgements, and pings for each
1057 // client. m_packetSent will be set to true if a packet is sent 1061 // client. m_packetSent will be set to true if a packet is sent
1058 m_scene.ForEachClient(clientPacketHandler); 1062 m_scene.ForEachClient(clientPacketHandler);
@@ -1068,6 +1072,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1068 { 1072 {
1069 m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex); 1073 m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex);
1070 } 1074 }
1075
1071 } 1076 }
1072 1077
1073 Watchdog.RemoveThread(); 1078 Watchdog.RemoveThread();
@@ -1105,6 +1110,101 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1105 } 1110 }
1106 } 1111 }
1107 1112
1113 #region Emergency Monitoring
1114 private Stopwatch watch1 = new Stopwatch();
1115 private Stopwatch watch2 = new Stopwatch();
1116
1117 private float avgProcessingTicks = 0;
1118 private float avgResendUnackedTicks = 0;
1119 private float avgSendAcksTicks = 0;
1120 private float avgSendPingTicks = 0;
1121 private float avgDequeueTicks = 0;
1122 private long nticks = 0;
1123 private long nticksUnack = 0;
1124 private long nticksAck = 0;
1125 private long nticksPing = 0;
1126
1127 private void MonitoredClientOutgoingPacketHandler(IClientAPI client)
1128 {
1129 nticks++;
1130 watch1.Start();
1131 try
1132 {
1133 if (client is LLClientView)
1134 {
1135 LLUDPClient udpClient = ((LLClientView)client).UDPClient;
1136
1137 if (udpClient.IsConnected)
1138 {
1139 if (m_resendUnacked)
1140 {
1141 nticksUnack++;
1142 watch2.Start();
1143
1144 ResendUnacked(udpClient);
1145
1146 watch2.Stop();
1147 avgResendUnackedTicks = (nticksUnack - 1)/(float)nticksUnack * avgResendUnackedTicks + (watch2.ElapsedTicks / (float)nticksUnack);
1148 watch2.Reset();
1149 }
1150
1151 if (m_sendAcks)
1152 {
1153 nticksAck++;
1154 watch2.Start();
1155
1156 SendAcks(udpClient);
1157
1158 watch2.Stop();
1159 avgSendAcksTicks = (nticksAck - 1) / (float)nticksAck * avgSendAcksTicks + (watch2.ElapsedTicks / (float)nticksAck);
1160 watch2.Reset();
1161 }
1162
1163 if (m_sendPing)
1164 {
1165 nticksPing++;
1166 watch2.Start();
1167
1168 SendPing(udpClient);
1169
1170 watch2.Stop();
1171 avgSendPingTicks = (nticksPing - 1) / (float)nticksPing * avgSendPingTicks + (watch2.ElapsedTicks / (float)nticksPing);
1172 watch2.Reset();
1173 }
1174
1175 watch2.Start();
1176 // Dequeue any outgoing packets that are within the throttle limits
1177 if (udpClient.DequeueOutgoing())
1178 m_packetSent = true;
1179 watch2.Stop();
1180 avgDequeueTicks = (nticks - 1) / (float)nticks * avgDequeueTicks + (watch2.ElapsedTicks / (float)nticks);
1181 watch2.Reset();
1182
1183 }
1184 else
1185 m_log.WarnFormat("[LLUDPSERVER]: Client is not connected");
1186 }
1187 }
1188 catch (Exception ex)
1189 {
1190 m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler iteration for " + client.Name +
1191 " threw an exception: " + ex.Message, ex);
1192 }
1193 watch1.Stop();
1194 avgProcessingTicks = (nticks - 1) / (float)nticks * avgProcessingTicks + (watch1.ElapsedTicks / (float)nticks);
1195 watch1.Reset();
1196
1197 // reuse this -- it's every 100ms
1198 if (m_scene.EmergencyMonitoring && nticks % 100 == 0)
1199 {
1200 m_log.InfoFormat("[LLUDPSERVER]: avg processing ticks: {0} avg unacked: {1} avg acks: {2} avg ping: {3} avg dequeue: {4} (pack sent? {5})",
1201 avgProcessingTicks, avgResendUnackedTicks, avgSendAcksTicks, avgSendPingTicks, avgDequeueTicks, m_packetSent);
1202 }
1203
1204 }
1205
1206 #endregion
1207
1108 private void ProcessInPacket(object state) 1208 private void ProcessInPacket(object state)
1109 { 1209 {
1110 IncomingPacket incomingPacket = (IncomingPacket)state; 1210 IncomingPacket incomingPacket = (IncomingPacket)state;