From 5e4d6cab00cb29cd088ab7b62ab13aff103b64cb Mon Sep 17 00:00:00 2001 From: onefang Date: Sun, 19 May 2019 21:24:15 +1000 Subject: Dump OpenSim 0.9.0.1 into it's own branch. --- .../Agent/UDP/Linden/LindenUDPInfoModule.cs | 299 ++++++--------------- 1 file changed, 82 insertions(+), 217 deletions(-) (limited to 'OpenSim/Region/OptionalModules/Agent/UDP') diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs index 08d0fbf..490809e 100644 --- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs @@ -52,48 +52,48 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPInfoModule")] public class LindenUDPInfoModule : ISharedRegionModule { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + protected Dictionary m_scenes = new Dictionary(); - - public string Name { get { return "Linden UDP Module"; } } - + + public string Name { get { return "Linden UDP Module"; } } + public Type ReplaceableInterface { get { return null; } } - + public void Initialise(IConfigSource source) { // m_log.DebugFormat("[LINDEN UDP INFO MODULE]: INITIALIZED MODULE"); } - + public void PostInitialise() { // m_log.DebugFormat("[LINDEN UDP INFO MODULE]: POST INITIALIZED MODULE"); } - + public void Close() { // m_log.DebugFormat("[LINDEN UDP INFO MODULE]: CLOSED MODULE"); } - + public void AddRegion(Scene scene) { // m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); - + lock (m_scenes) m_scenes[scene.RegionInfo.RegionID] = scene; scene.AddCommand( "Comms", this, "show pqueues", "show pqueues [full]", - "Show priority queue data for each client", + "Show priority queue data for each client", "Without the 'full' option, only root agents are shown." - + " With the 'full' option child agents are also shown.", + + " With the 'full' option child agents are also shown.", (mod, cmd) => MainConsole.Instance.Output(GetPQueuesReport(cmd))); - + scene.AddCommand( "Comms", this, "show queues", "show queues [full]", - "Show queue data for each client", + "Show queue data for each client", "Without the 'full' option, only root agents are shown.\n" + "With the 'full' option child agents are also shown.\n\n" + "Type - Rt is a root (avatar) client whilst cd is a child (neighbour interacting) client.\n" @@ -116,40 +116,24 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden "clear image queues ", "Clear the image queues (textures downloaded via UDP) for a particular client.", (mod, cmd) => MainConsole.Instance.Output(HandleImageQueuesClear(cmd))); - + scene.AddCommand( "Comms", this, "show throttles", "show throttles [full]", - "Show throttle settings for each client and for the server overall", + "Show throttle settings for each client and for the server overall", "Without the 'full' option, only root agents are shown." - + " With the 'full' option child agents are also shown.", + + " With the 'full' option child agents are also shown.", (mod, cmd) => MainConsole.Instance.Output(GetThrottlesReport(cmd))); - - scene.AddCommand( - "Comms", this, "emergency-monitoring", - "emergency-monitoring", - "Go on/off emergency monitoring mode", - "Go on/off emergency monitoring mode", - HandleEmergencyMonitoring); - - scene.AddCommand( - "Comms", this, "show client stats", - "show client stats [first_name last_name]", - "Show client request stats", - "Without the 'first_name last_name' option, all clients are shown." - + " With the 'first_name last_name' option only a specific client is shown.", - (mod, cmd) => MainConsole.Instance.Output(HandleClientStatsReport(cmd))); - } - + public void RemoveRegion(Scene scene) { // m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); - + lock (m_scenes) m_scenes.Remove(scene.RegionInfo.RegionID); - } - + } + public void RegionLoaded(Scene scene) { // m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); @@ -183,7 +167,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden foreach (ScenePresence agent in foundAgents) { LLClientView client = agent.ControllingClient as LLClientView; - + if (client == null) return "This command is only supported for LLClientView"; @@ -197,29 +181,11 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden return report.ToString(); } - protected void HandleEmergencyMonitoring(string module, string[] cmd) - { - bool mode = true; - if (cmd.Length == 1 || (cmd.Length > 1 && cmd[1] == "on")) - { - mode = true; - MainConsole.Instance.Output("Emergency Monitoring ON"); - } - else - { - mode = false; - MainConsole.Instance.Output("Emergency Monitoring OFF"); - } - - foreach (Scene s in m_scenes.Values) - s.EmergencyMonitoring = mode; - } - protected string GetColumnEntry(string entry, int maxLength, int columnPadding) - { + { return string.Format( - "{0,-" + maxLength + "}{1,-" + columnPadding + "}", - entry.Length > maxLength ? entry.Substring(0, maxLength) : entry, + "{0,-" + maxLength + "}{1,-" + columnPadding + "}", + entry.Length > maxLength ? entry.Substring(0, maxLength) : entry, ""); } @@ -232,29 +198,29 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden { bool showChildren = false; string pname = ""; - + if (showParams.Length > 2 && showParams[2] == "full") - showChildren = true; + showChildren = true; else if (showParams.Length > 3) pname = showParams[2] + " " + showParams[3]; - - StringBuilder report = new StringBuilder(); + + StringBuilder report = new StringBuilder(); int columnPadding = 2; - int maxNameLength = 18; + int maxNameLength = 18; int maxRegionNameLength = 14; int maxTypeLength = 4; -// int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; - +// int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; + report.Append(GetColumnEntry("User", maxNameLength, columnPadding)); report.Append(GetColumnEntry("Region", maxRegionNameLength, columnPadding)); report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding)); - + report.AppendFormat( "{0,7} {1,7} {2,7} {3,7} {4,7} {5,7} {6,7} {7,7} {8,7} {9,7} {10,7} {11,7}\n", "Pri 0", "Pri 1", - "Pri 2", + "Pri 2", "Pri 3", "Pri 4", "Pri 5", @@ -277,16 +243,16 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden bool isChild = client.SceneAgent.IsChildAgent; if (isChild && !showChildren) return; - + string name = client.Name; if (pname != "" && name != pname) return; - + string regionName = scene.RegionInfo.RegionName; - + report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); - report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); + report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); report.AppendLine(((LLClientView)client).EntityUpdateQueue.ToString()); } }); @@ -331,17 +297,17 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden foreach (ScenePresence agent in foundAgents) { LLClientView client = agent.ControllingClient as LLClientView; - + if (client == null) return "This command is only supported for LLClientView"; - + J2KImage[] images = client.ImageManager.GetImages(); report.AppendFormat( "In region {0} ({1} agent)\n", agent.Scene.RegionInfo.RegionName, agent.IsChildAgent ? "child" : "root"); report.AppendFormat("Images in queue: {0}\n", images.Length); - + if (images.Length > 0) { report.AppendFormat( @@ -352,7 +318,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden "Start Pkt", "Has Asset", "Decoded"); - + foreach (J2KImage image in images) report.AppendFormat( "{0,36} {1,8} {2,10} {3,10} {4,9} {5,7}\n", @@ -362,7 +328,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden return report.ToString(); } - + /// /// Generate UDP Queue data report for each client /// @@ -372,16 +338,16 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden { bool showChildren = false; string pname = ""; - + if (showParams.Length > 2 && showParams[2] == "full") - showChildren = true; + showChildren = true; else if (showParams.Length > 3) pname = showParams[2] + " " + showParams[3]; - - StringBuilder report = new StringBuilder(); - + + StringBuilder report = new StringBuilder(); + int columnPadding = 2; - int maxNameLength = 18; + int maxNameLength = 18; int maxRegionNameLength = 14; int maxTypeLength = 4; @@ -389,11 +355,11 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; - + report.Append(GetColumnEntry("User", maxNameLength, columnPadding)); report.Append(GetColumnEntry("Region", maxRegionNameLength, columnPadding)); report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding)); - + report.AppendFormat( "{0,7} {1,7} {2,7} {3,7} {4,9} {5,7} {6,7} {7,7} {8,7} {9,7} {10,8} {11,7}\n", "Since", @@ -408,7 +374,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden "Q Pkts", "Q Pkts", "Q Pkts"); - + report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", ""); report.AppendFormat( "{0,7} {1,7} {2,7} {3,7} {4,9} {5,7} {6,7} {7,7} {8,7} {9,7} {10,8} {11,7}\n", @@ -423,8 +389,8 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden "Cloud", "Task", "Texture", - "Asset"); - + "Asset"); + lock (m_scenes) { foreach (Scene scene in m_scenes.Values) @@ -438,7 +404,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden bool isChild = client.SceneAgent.IsChildAgent; if (isChild && !showChildren) return; - + string name = client.Name; if (pname != "" && name != pname) return; @@ -449,7 +415,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); - IStatsCollector stats = (IStatsCollector)client; + IStatsCollector stats = (IStatsCollector)client; report.AppendLine(stats.Report()); } }); @@ -457,8 +423,8 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden } return report.ToString(); - } - + } + /// /// Show throttle data /// @@ -468,28 +434,28 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden { bool showChildren = false; string pname = ""; - + if (showParams.Length > 2 && showParams[2] == "full") - showChildren = true; + showChildren = true; else if (showParams.Length > 3) pname = showParams[2] + " " + showParams[3]; - - StringBuilder report = new StringBuilder(); - + + StringBuilder report = new StringBuilder(); + int columnPadding = 2; - int maxNameLength = 18; + int maxNameLength = 18; int maxRegionNameLength = 14; - int maxTypeLength = 4; - int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; - + int maxTypeLength = 4; + int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; + report.Append(GetColumnEntry("User", maxNameLength, columnPadding)); report.Append(GetColumnEntry("Region", maxRegionNameLength, columnPadding)); - report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding)); - + report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding)); + report.AppendFormat( "{0,8} {1,8} {2,7} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7}\n", "Max", - "Target", + "Target", "Actual", "Resend", "Land", @@ -497,8 +463,8 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden "Cloud", "Task", "Texture", - "Asset"); - + "Asset"); + report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", ""); report.AppendFormat( "{0,8} {1,8} {2,7} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7}\n", @@ -511,10 +477,10 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden "kb/s", "kb/s", "kb/s", - "kb/s"); - + "kb/s"); + report.AppendLine(); - + lock (m_scenes) { foreach (Scene scene in m_scenes.Values) @@ -529,25 +495,25 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden bool isChild = client.SceneAgent.IsChildAgent; if (isChild && !showChildren) return; - + string name = client.Name; if (pname != "" && name != pname) return; string regionName = scene.RegionInfo.RegionName; - + LLUDPClient llUdpClient = llClient.UDPClient; ClientInfo ci = llUdpClient.GetClientInfo(); - + report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); - report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); - + report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); + report.AppendFormat( "{0,8} {1,8} {2,7} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7}\n", ci.maxThrottle > 0 ? ((ci.maxThrottle * 8) / 1000).ToString() : "-", - llUdpClient.FlowThrottle.AdaptiveEnabled - ? ((ci.targetThrottle * 8) / 1000).ToString() + llUdpClient.FlowThrottle.AdaptiveEnabled + ? ((ci.targetThrottle * 8) / 1000).ToString() : (llUdpClient.FlowThrottle.TotalDripRequest * 8 / 1000).ToString(), (ci.totalThrottle * 8) / 1000, (ci.resendThrottle * 8) / 1000, @@ -563,107 +529,6 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden } return report.ToString(); - } - - /// - /// Show client stats data - /// - /// - /// - protected string HandleClientStatsReport(string[] showParams) - { - // NOTE: This writes to m_log on purpose. We want to store this information - // in case we need to analyze it later. - // - if (showParams.Length <= 4) - { - m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}", "Region", "Name", "Root", "Time", "Reqs/min", "AgentUpdates"); - foreach (Scene scene in m_scenes.Values) - { - scene.ForEachClient( - delegate(IClientAPI client) - { - if (client is LLClientView) - { - LLClientView llClient = client as LLClientView; - ClientInfo cinfo = llClient.UDPClient.GetClientInfo(); - int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum(); - avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1); - - string childAgentStatus; - - if (llClient.SceneAgent != null) - childAgentStatus = llClient.SceneAgent.IsChildAgent ? "N" : "Y"; - else - childAgentStatus = "Off!"; - - m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}", - scene.RegionInfo.RegionName, llClient.Name, - childAgentStatus, - (DateTime.Now - cinfo.StartedTime).Minutes, - avg_reqs, - string.Format( - "{0} ({1:0.00}%)", - llClient.TotalAgentUpdates, - cinfo.SyncRequests.ContainsKey("AgentUpdate") - ? (float)cinfo.SyncRequests["AgentUpdate"] / llClient.TotalAgentUpdates * 100 - : 0)); - } - }); - } - return string.Empty; - } - - string fname = "", lname = ""; - - if (showParams.Length > 3) - fname = showParams[3]; - if (showParams.Length > 4) - lname = showParams[4]; - - foreach (Scene scene in m_scenes.Values) - { - scene.ForEachClient( - delegate(IClientAPI client) - { - if (client is LLClientView) - { - LLClientView llClient = client as LLClientView; - - if (llClient.Name == fname + " " + lname) - { - - ClientInfo cinfo = llClient.GetClientInfo(); - AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(llClient.CircuitCode); - if (aCircuit == null) // create a dummy one - aCircuit = new AgentCircuitData(); - - if (!llClient.SceneAgent.IsChildAgent) - m_log.InfoFormat("[INFO]: {0} # {1} # {2}", llClient.Name, Util.GetViewerName(aCircuit), aCircuit.Id0); - - int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum(); - avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1); - - m_log.InfoFormat("[INFO]:"); - m_log.InfoFormat("[INFO]: {0} # {1} # Time: {2}min # Avg Reqs/min: {3}", scene.RegionInfo.RegionName, - (llClient.SceneAgent.IsChildAgent ? "Child" : "Root"), (DateTime.Now - cinfo.StartedTime).Minutes, avg_reqs); - - Dictionary sortedDict = (from entry in cinfo.AsyncRequests orderby entry.Value descending select entry) - .ToDictionary(pair => pair.Key, pair => pair.Value); - PrintRequests("TOP ASYNC", sortedDict, cinfo.AsyncRequests.Values.Sum()); - - sortedDict = (from entry in cinfo.SyncRequests orderby entry.Value descending select entry) - .ToDictionary(pair => pair.Key, pair => pair.Value); - PrintRequests("TOP SYNC", sortedDict, cinfo.SyncRequests.Values.Sum()); - - sortedDict = (from entry in cinfo.GenericRequests orderby entry.Value descending select entry) - .ToDictionary(pair => pair.Key, pair => pair.Value); - PrintRequests("TOP GENERIC", sortedDict, cinfo.GenericRequests.Values.Sum()); - } - } - }); - } - return string.Empty; } private void PrintRequests(string type, Dictionary sortedDict, int sum) -- cgit v1.1