aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2014-11-04 17:21:22 +0000
committerJustin Clark-Casey (justincc)2014-11-25 23:23:10 +0000
commitf54c70741b4008c242aa8f088be7551bfe41ac1f (patch)
treeebd89f57749eed1a247ef6f013395e1a65539f60 /OpenSim
parentAdd naive implementation of controlled incoming HG attachments to manage load. (diff)
downloadopensim-SC_OLD-f54c70741b4008c242aa8f088be7551bfe41ac1f.zip
opensim-SC_OLD-f54c70741b4008c242aa8f088be7551bfe41ac1f.tar.gz
opensim-SC_OLD-f54c70741b4008c242aa8f088be7551bfe41ac1f.tar.bz2
opensim-SC_OLD-f54c70741b4008c242aa8f088be7551bfe41ac1f.tar.xz
Add "show threadpool calls active" console debug command.
This shows named threadpool calls (excluding timer and network calls) that are currently queued or running. Also shows total of labelled and any anonymous calls.
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Framework/Servers/ServerBase.cs45
-rw-r--r--OpenSim/Framework/Util.cs28
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs8
3 files changed, 73 insertions, 8 deletions
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index eb9fb8b..c22c119 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -293,10 +293,16 @@ namespace OpenSim.Framework.Servers
293 HandleDebugThreadpoolLevel); 293 HandleDebugThreadpoolLevel);
294 294
295 m_console.Commands.AddCommand( 295 m_console.Commands.AddCommand(
296 "Debug", false, "show threadpool calls", 296 "Debug", false, "show threadpool calls active",
297 "show threadpool calls", 297 "show threadpool calls active",
298 "Show the number of labelled threadpool calls.", 298 "Show details about threadpool calls that are still active (currently waiting or in progress)",
299 HandleShowThreadpoolCalls); 299 HandleShowThreadpoolCallsActive);
300
301 m_console.Commands.AddCommand(
302 "Debug", false, "show threadpool calls complete",
303 "show threadpool calls complete",
304 "Show details about threadpool calls that have been completed.",
305 HandleShowThreadpoolCallsComplete);
300 306
301 m_console.Commands.AddCommand( 307 m_console.Commands.AddCommand(
302 "Debug", false, "force gc", 308 "Debug", false, "force gc",
@@ -361,7 +367,36 @@ namespace OpenSim.Framework.Servers
361 Notice("serialosdreq is now {0}", setSerializeOsdRequests); 367 Notice("serialosdreq is now {0}", setSerializeOsdRequests);
362 } 368 }
363 369
364 private void HandleShowThreadpoolCalls(string module, string[] args) 370 private void HandleShowThreadpoolCallsActive(string module, string[] args)
371 {
372 List<KeyValuePair<string, int>> calls = Util.GetFireAndForgetCallsInProgress().ToList();
373 calls.Sort((kvp1, kvp2) => kvp2.Value.CompareTo(kvp1.Value));
374 int namedCalls = 0;
375
376 ConsoleDisplayList cdl = new ConsoleDisplayList();
377 foreach (KeyValuePair<string, int> kvp in calls)
378 {
379 if (kvp.Value > 0)
380 {
381 cdl.AddRow(kvp.Key, kvp.Value);
382 namedCalls += kvp.Value;
383 }
384 }
385
386 cdl.AddRow("TOTAL NAMED", namedCalls);
387
388 long allQueuedCalls = Util.TotalQueuedFireAndForgetCalls;
389 long allRunningCalls = Util.TotalRunningFireAndForgetCalls;
390
391 cdl.AddRow("TOTAL QUEUED", allQueuedCalls);
392 cdl.AddRow("TOTAL RUNNING", allRunningCalls);
393 cdl.AddRow("TOTAL ANONYMOUS", allQueuedCalls + allRunningCalls - namedCalls);
394 cdl.AddRow("TOTAL ALL", allQueuedCalls + allRunningCalls);
395
396 MainConsole.Instance.Output(cdl.ToString());
397 }
398
399 private void HandleShowThreadpoolCallsComplete(string module, string[] args)
365 { 400 {
366 List<KeyValuePair<string, int>> calls = Util.GetFireAndForgetCallsMade().ToList(); 401 List<KeyValuePair<string, int>> calls = Util.GetFireAndForgetCallsMade().ToList();
367 calls.Sort((kvp1, kvp2) => kvp2.Value.CompareTo(kvp1.Value)); 402 calls.Sort((kvp1, kvp2) => kvp2.Value.CompareTo(kvp1.Value));
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index baad0b9..97c958a 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -2052,6 +2052,9 @@ namespace OpenSim.Framework
2052 private static long numTotalThreadFuncsCalled = 0; 2052 private static long numTotalThreadFuncsCalled = 0;
2053 private static Int32 threadFuncOverloadMode = 0; 2053 private static Int32 threadFuncOverloadMode = 0;
2054 2054
2055 public static long TotalQueuedFireAndForgetCalls { get { return numQueuedThreadFuncs; } }
2056 public static long TotalRunningFireAndForgetCalls { get { return numRunningThreadFuncs; } }
2057
2055 // Maps (ThreadFunc number -> Thread) 2058 // Maps (ThreadFunc number -> Thread)
2056 private static ConcurrentDictionary<long, ThreadInfo> activeThreads = new ConcurrentDictionary<long, ThreadInfo>(); 2059 private static ConcurrentDictionary<long, ThreadInfo> activeThreads = new ConcurrentDictionary<long, ThreadInfo>();
2057 2060
@@ -2089,6 +2092,13 @@ namespace OpenSim.Framework
2089 2092
2090 private static Dictionary<string, int> m_fireAndForgetCallsMade = new Dictionary<string, int>(); 2093 private static Dictionary<string, int> m_fireAndForgetCallsMade = new Dictionary<string, int>();
2091 2094
2095 public static Dictionary<string, int> GetFireAndForgetCallsInProgress()
2096 {
2097 return new Dictionary<string, int>(m_fireAndForgetCallsInProgress);
2098 }
2099
2100 private static Dictionary<string, int> m_fireAndForgetCallsInProgress = new Dictionary<string, int>();
2101
2092 public static void FireAndForget(System.Threading.WaitCallback callback) 2102 public static void FireAndForget(System.Threading.WaitCallback callback)
2093 { 2103 {
2094 FireAndForget(callback, null, null); 2104 FireAndForget(callback, null, null);
@@ -2109,6 +2119,11 @@ namespace OpenSim.Framework
2109 m_fireAndForgetCallsMade[context] = 1; 2119 m_fireAndForgetCallsMade[context] = 1;
2110 else 2120 else
2111 m_fireAndForgetCallsMade[context]++; 2121 m_fireAndForgetCallsMade[context]++;
2122
2123 if (!m_fireAndForgetCallsInProgress.ContainsKey(context))
2124 m_fireAndForgetCallsInProgress[context] = 1;
2125 else
2126 m_fireAndForgetCallsInProgress[context]++;
2112 } 2127 }
2113 2128
2114 WaitCallback realCallback; 2129 WaitCallback realCallback;
@@ -2121,7 +2136,15 @@ namespace OpenSim.Framework
2121 if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest) 2136 if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest)
2122 { 2137 {
2123 // If we're running regression tests, then we want any exceptions to rise up to the test code. 2138 // If we're running regression tests, then we want any exceptions to rise up to the test code.
2124 realCallback = o => { Culture.SetCurrentCulture(); callback(o); }; 2139 realCallback =
2140 o =>
2141 {
2142 Culture.SetCurrentCulture();
2143 callback(o);
2144
2145 if (context != null)
2146 m_fireAndForgetCallsInProgress[context]--;
2147 };
2125 } 2148 }
2126 else 2149 else
2127 { 2150 {
@@ -2160,6 +2183,9 @@ namespace OpenSim.Framework
2160 activeThreads.TryRemove(threadFuncNum, out dummy); 2183 activeThreads.TryRemove(threadFuncNum, out dummy);
2161 if ((loggingEnabled || (threadFuncOverloadMode == 1)) && threadInfo.LogThread) 2184 if ((loggingEnabled || (threadFuncOverloadMode == 1)) && threadInfo.LogThread)
2162 m_log.DebugFormat("Exit threadfunc {0} ({1})", threadFuncNum, FormatDuration(threadInfo.Elapsed())); 2185 m_log.DebugFormat("Exit threadfunc {0} ({1})", threadFuncNum, FormatDuration(threadInfo.Elapsed()));
2186
2187 if (context != null)
2188 m_fireAndForgetCallsInProgress[context]--;
2163 } 2189 }
2164 }; 2190 };
2165 } 2191 }
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 519c18b..522de79 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -110,6 +110,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
110 } 110 }
111 } 111 }
112 112
113 /// <summary>
114 /// Used for processing analysis of incoming attachments in a controlled fashion.
115 /// </summary>
116 private HGIncomingSceneObjectEngine m_incomingSceneObjectEngine;
117
113 #region ISharedRegionModule 118 #region ISharedRegionModule
114 119
115 public override string Name 120 public override string Name
@@ -155,6 +160,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
155 scene.RegisterModuleInterface<IUserAgentVerificationModule>(this); 160 scene.RegisterModuleInterface<IUserAgentVerificationModule>(this);
156 //scene.EventManager.OnIncomingSceneObject += OnIncomingSceneObject; 161 //scene.EventManager.OnIncomingSceneObject += OnIncomingSceneObject;
157 162
163 m_incomingSceneObjectEngine = new HGIncomingSceneObjectEngine(scene.Name);
158 m_incomingSceneObjectEngine.Start(); 164 m_incomingSceneObjectEngine.Start();
159 } 165 }
160 } 166 }
@@ -540,8 +546,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
540 } 546 }
541 } 547 }
542 548
543 private HGIncomingSceneObjectEngine m_incomingSceneObjectEngine = new HGIncomingSceneObjectEngine();
544
545 public override bool HandleIncomingSceneObject(SceneObjectGroup so, Vector3 newPosition) 549 public override bool HandleIncomingSceneObject(SceneObjectGroup so, Vector3 newPosition)
546 { 550 {
547 // FIXME: We must make it so that we can use SOG.IsAttachment here. At the moment it is always null! 551 // FIXME: We must make it so that we can use SOG.IsAttachment here. At the moment it is always null!