diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
index d8ca343293..3f2a34001c 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
@@ -319,6 +319,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP
throw new NotImplementedException();
}
+ ///
+ /// Get the total number of pakcets queued for this client.
+ ///
+ ///
+ public int GetTotalPacketsQueuedCount()
+ {
+ int total = 0;
+
+ for (int i = 0; i <= (int)ThrottleOutPacketType.Asset; i++)
+ total += m_packetOutboxes[i].Count;
+
+ return total;
+ }
+
+ ///
+ /// Get the number of packets queued for the given throttle type.
+ ///
+ ///
+ ///
+ public int GetPacketsQueuedCount(ThrottleOutPacketType throttleType)
+ {
+ if ((int)throttleType > 0)
+ return m_packetOutboxes[(int)throttleType].Count;
+ else
+ return 0;
+ }
+
///
/// Return statistics information about client packet queues.
///
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index fc6fb3eaa2..664e23e55f 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -688,6 +688,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
StatType.Pull,
stat => stat.Value = PacketPool.Instance.BlocksPooled,
StatVerbosity.Debug));
+
+ StatsManager.RegisterStat(
+ new Stat(
+ "OutgoingPacketsQueuedCount",
+ "Packets queued for outgoing send",
+ "Number of queued outgoing packets across all connections",
+ "",
+ "clientstack",
+ Scene.Name,
+ StatType.Pull,
+ MeasuresOfInterest.AverageChangeOverTime,
+ stat => stat.Value = GetTotalQueuedOutgoingPackets(),
+ StatVerbosity.Info));
// We delay enabling pool stats to AddScene() instead of Initialize() so that we can distinguish pool stats by
// scene name
@@ -703,6 +716,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return x == m_location;
}
+ public int GetTotalQueuedOutgoingPackets()
+ {
+ int total = 0;
+
+ foreach (ScenePresence sp in Scene.GetScenePresences())
+ {
+ LLUDPClient udpClient = ((LLClientView)sp.ControllingClient).UDPClient;
+ total += udpClient.GetTotalPacketsQueuedCount();
+ }
+
+ return total;
+ }
+
// public void BroadcastPacket(Packet packet, ThrottleOutPacketType category, bool sendToPausedAgents, bool allowSplitting)
// {
// // CoarseLocationUpdate and AvatarGroupsReply packets cannot be split in an automated way