From 5198df3aa03eb47bc26b3c86924687612c015dce Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 2 Aug 2013 17:00:18 -0700
Subject: Issue: 10 simultaneous TPs, many not making it. Now bypassing the
per-url lock -- we should be "ok" (or, more "ok") now that we have increased
the connection limit on the http library. But this is a sensitive part of the
code, so it may need reverting.
---
OpenSim/Framework/WebUtil.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index 6fb1e0c..0e9de59 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -145,10 +145,10 @@ namespace OpenSim.Framework
public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed)
{
- lock (EndPointLock(url))
- {
+ //lock (EndPointLock(url))
+ //{
return ServiceOSDRequestWorker(url,data,method,timeout,compressed);
- }
+ //}
}
public static void LogOutgoingDetail(Stream outputStream)
--
cgit v1.1
From 76bd3de2fd243d0c910404af8a9998de746b04c4 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 19:22:47 +0100
Subject: Add checks monitoring framework to provide alerts if certain
conditions do not hold.
Not yet in use.
---
OpenSim/Framework/Monitoring/Checks/Check.cs | 118 ++++++++++++
OpenSim/Framework/Monitoring/ChecksManager.cs | 262 ++++++++++++++++++++++++++
OpenSim/Framework/Monitoring/StatsManager.cs | 6 +-
OpenSim/Framework/Monitoring/Watchdog.cs | 1 +
OpenSim/Framework/Servers/ServerBase.cs | 1 +
5 files changed, 385 insertions(+), 3 deletions(-)
create mode 100644 OpenSim/Framework/Monitoring/Checks/Check.cs
create mode 100644 OpenSim/Framework/Monitoring/ChecksManager.cs
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Monitoring/Checks/Check.cs b/OpenSim/Framework/Monitoring/Checks/Check.cs
new file mode 100644
index 0000000..594386a
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/Checks/Check.cs
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Text;
+
+namespace OpenSim.Framework.Monitoring
+{
+ public class Check
+ {
+// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ public static readonly char[] DisallowedShortNameCharacters = { '.' };
+
+ ///
+ /// Category of this stat (e.g. cache, scene, etc).
+ ///
+ public string Category { get; private set; }
+
+ ///
+ /// Containing name for this stat.
+ /// FIXME: In the case of a scene, this is currently the scene name (though this leaves
+ /// us with a to-be-resolved problem of non-unique region names).
+ ///
+ ///
+ /// The container.
+ ///
+ public string Container { get; private set; }
+
+ ///
+ /// Action used to check whether alert should go off.
+ ///
+ ///
+ /// Should return true if check passes. False otherwise.
+ ///
+ public Func CheckFunc { get; private set; }
+
+ ///
+ /// Message from the last failure, if any. If there is no message or no failure then will be null.
+ ///
+ ///
+ /// Should be set by the CheckFunc when applicable.
+ ///
+ public string LastFailureMessage { get; set; }
+
+ public StatVerbosity Verbosity { get; private set; }
+ public string ShortName { get; private set; }
+ public string Name { get; private set; }
+ public string Description { get; private set; }
+
+ public Check(
+ string shortName,
+ string name,
+ string description,
+ string category,
+ string container,
+ Func checkFunc,
+ StatVerbosity verbosity)
+ {
+ if (ChecksManager.SubCommands.Contains(category))
+ throw new Exception(
+ string.Format("Alert cannot be in category '{0}' since this is reserved for a subcommand", category));
+
+ foreach (char c in DisallowedShortNameCharacters)
+ {
+ if (shortName.IndexOf(c) != -1)
+ throw new Exception(string.Format("Alert name {0} cannot contain character {1}", shortName, c));
+ }
+
+ ShortName = shortName;
+ Name = name;
+ Description = description;
+ Category = category;
+ Container = container;
+ CheckFunc = checkFunc;
+ Verbosity = verbosity;
+ }
+
+ public bool CheckIt()
+ {
+ return CheckFunc(this);
+ }
+
+ public virtual string ToConsoleString()
+ {
+ return string.Format(
+ "{0}.{1}.{2} - {3}",
+ Category,
+ Container,
+ ShortName,
+ Description);
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs
new file mode 100644
index 0000000..e4a7f8c
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/ChecksManager.cs
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using log4net;
+
+namespace OpenSim.Framework.Monitoring
+{
+ ///
+ /// Static class used to register/deregister checks on runtime conditions.
+ ///
+ public static class ChecksManager
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ // Subcommand used to list other stats.
+ public const string ListSubCommand = "list";
+
+ // All subcommands
+ public static HashSet SubCommands = new HashSet { ListSubCommand };
+
+ ///
+ /// Checks categorized by category/container/shortname
+ ///
+ ///
+ /// Do not add or remove directly from this dictionary.
+ ///
+ public static SortedDictionary>> RegisteredChecks
+ = new SortedDictionary>>();
+
+ public static void RegisterConsoleCommands(ICommandConsole console)
+ {
+ console.Commands.AddCommand(
+ "General",
+ false,
+ "show checks",
+ "show checks",
+ "Show checks configured for this server",
+ "If no argument is specified then info on all checks will be shown.\n"
+ + "'list' argument will show check categories.\n"
+ + "THIS FACILITY IS EXPERIMENTAL",
+ HandleShowchecksCommand);
+ }
+
+ public static void HandleShowchecksCommand(string module, string[] cmd)
+ {
+ ICommandConsole con = MainConsole.Instance;
+
+ if (cmd.Length > 2)
+ {
+ foreach (string name in cmd.Skip(2))
+ {
+ string[] components = name.Split('.');
+
+ string categoryName = components[0];
+// string containerName = components.Length > 1 ? components[1] : null;
+
+ if (categoryName == ListSubCommand)
+ {
+ con.Output("check categories available are:");
+
+ foreach (string category in RegisteredChecks.Keys)
+ con.OutputFormat(" {0}", category);
+ }
+// else
+// {
+// SortedDictionary> category;
+// if (!Registeredchecks.TryGetValue(categoryName, out category))
+// {
+// con.OutputFormat("No such category as {0}", categoryName);
+// }
+// else
+// {
+// if (String.IsNullOrEmpty(containerName))
+// {
+// OutputConfiguredToConsole(con, category);
+// }
+// else
+// {
+// SortedDictionary container;
+// if (category.TryGetValue(containerName, out container))
+// {
+// OutputContainerChecksToConsole(con, container);
+// }
+// else
+// {
+// con.OutputFormat("No such container {0} in category {1}", containerName, categoryName);
+// }
+// }
+// }
+// }
+ }
+ }
+ else
+ {
+ OutputAllChecksToConsole(con);
+ }
+ }
+
+ ///
+ /// Registers a statistic.
+ ///
+ ///
+ ///
+ public static bool RegisterCheck(Check check)
+ {
+ SortedDictionary> category = null, newCategory;
+ SortedDictionary container = null, newContainer;
+
+ lock (RegisteredChecks)
+ {
+ // Check name is not unique across category/container/shortname key.
+ // XXX: For now just return false. This is to avoid problems in regression tests where all tests
+ // in a class are run in the same instance of the VM.
+ if (TryGetCheckParents(check, out category, out container))
+ return false;
+
+ // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed.
+ // This means that we don't need to lock or copy them on iteration, which will be a much more
+ // common operation after startup.
+ if (container != null)
+ newContainer = new SortedDictionary(container);
+ else
+ newContainer = new SortedDictionary();
+
+ if (category != null)
+ newCategory = new SortedDictionary>(category);
+ else
+ newCategory = new SortedDictionary>();
+
+ newContainer[check.ShortName] = check;
+ newCategory[check.Container] = newContainer;
+ RegisteredChecks[check.Category] = newCategory;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Deregister an check
+ /// >
+ ///
+ ///
+ public static bool DeregisterCheck(Check check)
+ {
+ SortedDictionary> category = null, newCategory;
+ SortedDictionary container = null, newContainer;
+
+ lock (RegisteredChecks)
+ {
+ if (!TryGetCheckParents(check, out category, out container))
+ return false;
+
+ newContainer = new SortedDictionary(container);
+ newContainer.Remove(check.ShortName);
+
+ newCategory = new SortedDictionary>(category);
+ newCategory.Remove(check.Container);
+
+ newCategory[check.Container] = newContainer;
+ RegisteredChecks[check.Category] = newCategory;
+
+ return true;
+ }
+ }
+
+ public static bool TryGetCheckParents(
+ Check check,
+ out SortedDictionary> category,
+ out SortedDictionary container)
+ {
+ category = null;
+ container = null;
+
+ lock (RegisteredChecks)
+ {
+ if (RegisteredChecks.TryGetValue(check.Category, out category))
+ {
+ if (category.TryGetValue(check.Container, out container))
+ {
+ if (container.ContainsKey(check.ShortName))
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public static void CheckChecks()
+ {
+ lock (RegisteredChecks)
+ {
+ foreach (SortedDictionary> category in RegisteredChecks.Values)
+ {
+ foreach (SortedDictionary container in category.Values)
+ {
+ foreach (Check check in container.Values)
+ {
+ if (!check.CheckIt())
+ m_log.WarnFormat(
+ "[CHECKS MANAGER]: Check {0}.{1}.{2} failed with message {3}", check.Category, check.Container, check.ShortName, check.LastFailureMessage);
+ }
+ }
+ }
+ }
+ }
+
+ private static void OutputAllChecksToConsole(ICommandConsole con)
+ {
+ foreach (var category in RegisteredChecks.Values)
+ {
+ OutputCategoryChecksToConsole(con, category);
+ }
+ }
+
+ private static void OutputCategoryChecksToConsole(
+ ICommandConsole con, SortedDictionary> category)
+ {
+ foreach (var container in category.Values)
+ {
+ OutputContainerChecksToConsole(con, container);
+ }
+ }
+
+ private static void OutputContainerChecksToConsole(ICommandConsole con, SortedDictionary container)
+ {
+ foreach (Check check in container.Values)
+ {
+ con.Output(check.ToConsoleString());
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs
index e6a2304..87197f4 100644
--- a/OpenSim/Framework/Monitoring/StatsManager.cs
+++ b/OpenSim/Framework/Monitoring/StatsManager.cs
@@ -35,9 +35,9 @@ using OpenMetaverse.StructuredData;
namespace OpenSim.Framework.Monitoring
{
///
- /// Singleton used to provide access to statistics reporters
+ /// Static class used to register/deregister/fetch statistics
///
- public class StatsManager
+ public static class StatsManager
{
// Subcommand used to list other stats.
public const string AllSubCommand = "all";
@@ -257,7 +257,7 @@ namespace OpenSim.Framework.Monitoring
// }
///
- /// Registers a statistic.
+ /// Register a statistic.
///
///
///
diff --git a/OpenSim/Framework/Monitoring/Watchdog.cs b/OpenSim/Framework/Monitoring/Watchdog.cs
index 3f992b1..45762a6 100644
--- a/OpenSim/Framework/Monitoring/Watchdog.cs
+++ b/OpenSim/Framework/Monitoring/Watchdog.cs
@@ -380,6 +380,7 @@ namespace OpenSim.Framework.Monitoring
if (MemoryWatchdog.Enabled)
MemoryWatchdog.Update();
+ ChecksManager.CheckChecks();
StatsManager.RecordStats();
m_watchdogTimer.Start();
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index 029b848..a8e0f81 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -272,6 +272,7 @@ namespace OpenSim.Framework.Servers
"shutdown",
"Quit the application", (mod, args) => Shutdown());
+ ChecksManager.RegisterConsoleCommands(m_console);
StatsManager.RegisterConsoleCommands(m_console);
}
--
cgit v1.1
From 160659f68382187d7e949ca11c2942907671fe86 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 23:04:36 +0100
Subject: Make it possible to set worker/iocp min/max threadpool limits on the
fly with the console command "debug threadpool set"
---
OpenSim/Framework/Servers/ServerBase.cs | 78 +++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index a8e0f81..55b6c58 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -256,6 +256,12 @@ namespace OpenSim.Framework.Servers
"Show thread status. Synonym for \"show threads\"",
(string module, string[] args) => Notice(GetThreadsReport()));
+ m_console.Commands.AddCommand (
+ "Debug", false, "debug threadpool set",
+ "debug threadpool set worker|iocp min|max ",
+ "Set threadpool parameters. For debug purposes.",
+ HandleDebugThreadpoolSet);
+
m_console.Commands.AddCommand(
"General", false, "force gc",
"force gc",
@@ -283,6 +289,78 @@ namespace OpenSim.Framework.Servers
m_serverStatsCollector.Start();
}
+ private void HandleDebugThreadpoolSet(string module, string[] args)
+ {
+ if (args.Length != 6)
+ {
+ Notice("Usage: debug threadpool set worker|iocp min|max ");
+ return;
+ }
+
+ int newThreads;
+
+ if (!ConsoleUtil.TryParseConsoleInt(m_console, args[5], out newThreads))
+ return;
+
+ string poolType = args[3];
+ string bound = args[4];
+
+ bool fail = false;
+ int workerThreads, iocpThreads;
+
+ if (poolType == "worker")
+ {
+ if (bound == "min")
+ {
+ ThreadPool.GetMinThreads(out workerThreads, out iocpThreads);
+
+ if (!ThreadPool.SetMinThreads(newThreads, iocpThreads))
+ fail = true;
+ }
+ else
+ {
+ ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
+
+ if (!ThreadPool.SetMaxThreads(newThreads, iocpThreads))
+ fail = true;
+ }
+ }
+ else
+ {
+ if (bound == "min")
+ {
+ ThreadPool.GetMinThreads(out workerThreads, out iocpThreads);
+
+ if (!ThreadPool.SetMinThreads(workerThreads, newThreads))
+ fail = true;
+ }
+ else
+ {
+ ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
+
+ if (!ThreadPool.SetMaxThreads(workerThreads, newThreads))
+ fail = true;
+ }
+ }
+
+ if (fail)
+ {
+ Notice("ERROR: Could not set {0} {1} threads to {2}", poolType, bound, newThreads);
+ }
+ else
+ {
+ int minWorkerThreads, maxWorkerThreads, minIocpThreads, maxIocpThreads;
+
+ ThreadPool.GetMinThreads(out minWorkerThreads, out minIocpThreads);
+ ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxIocpThreads);
+
+ Notice("Min worker threads now {0}", minWorkerThreads);
+ Notice("Min IOCP threads now {0}", minIocpThreads);
+ Notice("Max worker threads now {0}", maxWorkerThreads);
+ Notice("Max IOCP threads now {0}", maxIocpThreads);
+ }
+ }
+
private void HandleForceGc(string module, string[] args)
{
Notice("Manually invoking runtime garbage collection");
--
cgit v1.1
From 139dcf1246b933f76bf72d2306f3f70d2ca61479 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 23:06:17 +0100
Subject: minor: move "threads abort" and "force gc" console commands into
debug category - these are not things one needs to do in normal operation
---
OpenSim/Framework/Servers/ServerBase.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index 55b6c58..0545bea 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -246,7 +246,7 @@ namespace OpenSim.Framework.Servers
"Show thread status", HandleShow);
m_console.Commands.AddCommand(
- "General", false, "threads abort",
+ "Debug", false, "threads abort",
"threads abort ",
"Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort);
@@ -263,7 +263,7 @@ namespace OpenSim.Framework.Servers
HandleDebugThreadpoolSet);
m_console.Commands.AddCommand(
- "General", false, "force gc",
+ "Debug", false, "force gc",
"force gc",
"Manually invoke runtime garbage collection. For debugging purposes",
HandleForceGc);
--
cgit v1.1
From 9bcf07279513294d58c3076e7d8a6eb5ee64c759 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 23:44:48 +0100
Subject: Make it possible to switch whether we serialize osd requests per
endpoint or not, either via config (SerializeOSDRequests in [Network]) or via
the "debug comms set" console command.
For debug purposes to assess what impact this has on network response in a heavy test environment.
---
OpenSim/Framework/Console/ConsoleUtil.cs | 22 ++++++++++++++++++-
OpenSim/Framework/Servers/ServerBase.cs | 37 ++++++++++++++++++++++++++++++++
OpenSim/Framework/WebUtil.cs | 20 +++++++++++++----
3 files changed, 74 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Console/ConsoleUtil.cs b/OpenSim/Framework/Console/ConsoleUtil.cs
index 97a86a8..c0ff454 100644
--- a/OpenSim/Framework/Console/ConsoleUtil.cs
+++ b/OpenSim/Framework/Console/ConsoleUtil.cs
@@ -156,7 +156,27 @@ namespace OpenSim.Framework.Console
}
///
- /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3
+ /// Convert a console integer to an int, automatically complaining if a console is given.
+ ///
+ /// Can be null if no console is available.
+ /// /param>
+ ///
+ ///
+ public static bool TryParseConsoleBool(ICommandConsole console, string rawConsoleString, out bool b)
+ {
+ if (!bool.TryParse(rawConsoleString, out b))
+ {
+ if (console != null)
+ console.OutputFormat("ERROR: {0} is not a true or false value", rawConsoleString);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Convert a console integer to an int, automatically complaining if a console is given.
///
/// Can be null if no console is available.
/// /param>
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index 0545bea..824c7e2 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -257,6 +257,12 @@ namespace OpenSim.Framework.Servers
(string module, string[] args) => Notice(GetThreadsReport()));
m_console.Commands.AddCommand (
+ "Debug", false, "debug comms set",
+ "debug comms set serialosdreq true|false",
+ "Set comms parameters. For debug purposes.",
+ HandleDebugCommsSet);
+
+ m_console.Commands.AddCommand (
"Debug", false, "debug threadpool set",
"debug threadpool set worker|iocp min|max ",
"Set threadpool parameters. For debug purposes.",
@@ -284,11 +290,42 @@ namespace OpenSim.Framework.Servers
public void RegisterCommonComponents(IConfigSource configSource)
{
+ IConfig networkConfig = configSource.Configs["Network"];
+
+ if (networkConfig != null)
+ {
+ WebUtil.SerializeOSDRequestsPerEndpoint = networkConfig.GetBoolean("SerializeOSDRequests", false);
+ }
+
m_serverStatsCollector = new ServerStatsCollector();
m_serverStatsCollector.Initialise(configSource);
m_serverStatsCollector.Start();
}
+ private void HandleDebugCommsSet(string module, string[] args)
+ {
+ if (args.Length != 5)
+ {
+ Notice("Usage: debug comms set serialosdreq true|false");
+ return;
+ }
+
+ if (args[3] != "serialosdreq")
+ {
+ Notice("Usage: debug comms set serialosdreq true|false");
+ return;
+ }
+
+ bool setSerializeOsdRequests;
+
+ if (!ConsoleUtil.TryParseConsoleBool(m_console, args[4], out setSerializeOsdRequests))
+ return;
+
+ WebUtil.SerializeOSDRequestsPerEndpoint = setSerializeOsdRequests;
+
+ Notice("serialosdreq is now {0}", setSerializeOsdRequests);
+ }
+
private void HandleDebugThreadpoolSet(string module, string[] args)
{
if (args.Length != 6)
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index 0e9de59..706b33f 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -67,6 +67,11 @@ namespace OpenSim.Framework
public static int RequestNumber { get; internal set; }
///
+ /// Control where OSD requests should be serialized per endpoint.
+ ///
+ public static bool SerializeOSDRequestsPerEndpoint { get; set; }
+
+ ///
/// this is the header field used to communicate the local request id
/// used for performance and debugging
///
@@ -145,10 +150,17 @@ namespace OpenSim.Framework
public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed)
{
- //lock (EndPointLock(url))
- //{
- return ServiceOSDRequestWorker(url,data,method,timeout,compressed);
- //}
+ if (SerializeOSDRequestsPerEndpoint)
+ {
+ lock (EndPointLock(url))
+ {
+ return ServiceOSDRequestWorker(url, data, method, timeout, compressed);
+ }
+ }
+ else
+ {
+ return ServiceOSDRequestWorker(url, data, method, timeout, compressed);
+ }
}
public static void LogOutgoingDetail(Stream outputStream)
--
cgit v1.1
From 4581bdd929d84abe2dbdc46c819d015e391a5b6d Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 23:49:33 +0100
Subject: Add "debug comms status" command to show current debug comms settings
---
OpenSim/Framework/Servers/ServerBase.cs | 11 +++++++++++
1 file changed, 11 insertions(+)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index 824c7e2..1bee6a3 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -263,6 +263,12 @@ namespace OpenSim.Framework.Servers
HandleDebugCommsSet);
m_console.Commands.AddCommand (
+ "Debug", false, "debug comms status",
+ "debug comms status",
+ "Show current debug comms parameters.",
+ HandleDebugCommsStatus);
+
+ m_console.Commands.AddCommand (
"Debug", false, "debug threadpool set",
"debug threadpool set worker|iocp min|max ",
"Set threadpool parameters. For debug purposes.",
@@ -302,6 +308,11 @@ namespace OpenSim.Framework.Servers
m_serverStatsCollector.Start();
}
+ private void HandleDebugCommsStatus(string module, string[] args)
+ {
+ Notice("serialosdreq is {0}", WebUtil.SerializeOSDRequestsPerEndpoint);
+ }
+
private void HandleDebugCommsSet(string module, string[] args)
{
if (args.Length != 5)
--
cgit v1.1
From ac198068ab7bb3895d95c6d1902b2c6af575a32a Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 6 Aug 2013 00:00:12 +0100
Subject: Add "debug threadpool status" console command to show min/max/current
worker/iocp threadpool numbers
---
OpenSim/Framework/Servers/ServerBase.cs | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index 1bee6a3..c258ff6 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -274,6 +274,12 @@ namespace OpenSim.Framework.Servers
"Set threadpool parameters. For debug purposes.",
HandleDebugThreadpoolSet);
+ m_console.Commands.AddCommand (
+ "Debug", false, "debug threadpool status",
+ "debug threadpool status",
+ "Show current debug threadpool parameters.",
+ HandleDebugThreadpoolStatus);
+
m_console.Commands.AddCommand(
"Debug", false, "force gc",
"force gc",
@@ -337,6 +343,23 @@ namespace OpenSim.Framework.Servers
Notice("serialosdreq is now {0}", setSerializeOsdRequests);
}
+ private void HandleDebugThreadpoolStatus(string module, string[] args)
+ {
+ int workerThreads, iocpThreads;
+
+ ThreadPool.GetMinThreads(out workerThreads, out iocpThreads);
+ Notice("Min worker threads: {0}", workerThreads);
+ Notice("Min IOCP threads: {0}", iocpThreads);
+
+ ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
+ Notice("Max worker threads: {0}", workerThreads);
+ Notice("Max IOCP threads: {0}", iocpThreads);
+
+ ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads);
+ Notice("Available worker threads: {0}", workerThreads);
+ Notice("Available IOCP threads: {0}", iocpThreads);
+ }
+
private void HandleDebugThreadpoolSet(string module, string[] args)
{
if (args.Length != 6)
--
cgit v1.1
From 4c2f6de8e4957df3c7186437089ba0925edb1a08 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 6 Aug 2013 18:29:33 +0100
Subject: Add the experimental ability to dump stats (result of command "show
stats all") to file OpenSimStats.log every 5 seconds.
This can currently only be activated with the console command "debug stats record start".
Off by default.
Records to file OpenSimStats.log for simulator and RobustStats.log for ROBUST
---
OpenSim/Framework/Monitoring/StatsManager.cs | 52 +++++++++++++++++++++-------
1 file changed, 40 insertions(+), 12 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs
index 87197f4..c8e838c 100644
--- a/OpenSim/Framework/Monitoring/StatsManager.cs
+++ b/OpenSim/Framework/Monitoring/StatsManager.cs
@@ -81,6 +81,8 @@ namespace OpenSim.Framework.Monitoring
+ "More than one name can be given separated by spaces.\n"
+ "THIS STATS FACILITY IS EXPERIMENTAL AND DOES NOT YET CONTAIN ALL STATS",
HandleShowStatsCommand);
+
+ StatsLogger.RegisterConsoleCommands(console);
}
public static void HandleShowStatsCommand(string module, string[] cmd)
@@ -145,29 +147,55 @@ namespace OpenSim.Framework.Monitoring
}
}
- private static void OutputAllStatsToConsole(ICommandConsole con)
+ public static List GetAllStatsReports()
{
+ List reports = new List();
+
foreach (var category in RegisteredStats.Values)
- {
- OutputCategoryStatsToConsole(con, category);
- }
+ reports.AddRange(GetCategoryStatsReports(category));
+
+ return reports;
+ }
+
+ private static void OutputAllStatsToConsole(ICommandConsole con)
+ {
+ foreach (string report in GetAllStatsReports())
+ con.Output(report);
+ }
+
+ private static List GetCategoryStatsReports(
+ SortedDictionary> category)
+ {
+ List reports = new List();
+
+ foreach (var container in category.Values)
+ reports.AddRange(GetContainerStatsReports(container));
+
+ return reports;
}
private static void OutputCategoryStatsToConsole(
ICommandConsole con, SortedDictionary> category)
{
- foreach (var container in category.Values)
- {
- OutputContainerStatsToConsole(con, container);
- }
+ foreach (string report in GetCategoryStatsReports(category))
+ con.Output(report);
}
- private static void OutputContainerStatsToConsole( ICommandConsole con, SortedDictionary container)
+ private static List GetContainerStatsReports(SortedDictionary container)
{
+ List reports = new List();
+
foreach (Stat stat in container.Values)
- {
- con.Output(stat.ToConsoleString());
- }
+ reports.Add(stat.ToConsoleString());
+
+ return reports;
+ }
+
+ private static void OutputContainerStatsToConsole(
+ ICommandConsole con, SortedDictionary container)
+ {
+ foreach (string report in GetContainerStatsReports(container))
+ con.Output(report);
}
// Creates an OSDMap of the format:
--
cgit v1.1
From d6d5d4ebd033d47886c6e31ae87c0be527f5545e Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 6 Aug 2013 18:32:16 +0100
Subject: Add file missing from last commit 4c2f6de
---
OpenSim/Framework/Monitoring/StatsLogger.cs | 108 ++++++++++++++++++++++++++++
1 file changed, 108 insertions(+)
create mode 100644 OpenSim/Framework/Monitoring/StatsLogger.cs
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Monitoring/StatsLogger.cs b/OpenSim/Framework/Monitoring/StatsLogger.cs
new file mode 100644
index 0000000..fa2e1b6
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/StatsLogger.cs
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Reflection;
+using System.Timers;
+using log4net;
+
+namespace OpenSim.Framework.Monitoring
+{
+ ///
+ /// Provides a means to continuously log stats for debugging purposes.
+ ///
+ public static class StatsLogger
+ {
+ private static readonly ILog m_statsLog = LogManager.GetLogger("special.StatsLogger");
+
+ private static Timer m_loggingTimer;
+ private static int m_statsLogIntervalMs = 5000;
+
+ public static void RegisterConsoleCommands(ICommandConsole console)
+ {
+ console.Commands.AddCommand(
+ "Debug",
+ false,
+ "debug stats record",
+ "debug stats record start|stop",
+ "Control whether stats are being regularly recorded to a separate file.",
+ "For debug purposes. Experimental.",
+ HandleStatsRecordCommand);
+ }
+
+ public static void HandleStatsRecordCommand(string module, string[] cmd)
+ {
+ ICommandConsole con = MainConsole.Instance;
+
+ if (cmd.Length != 4)
+ {
+ con.Output("Usage: debug stats record start|stop");
+ return;
+ }
+
+ if (cmd[3] == "start")
+ {
+ Start();
+ con.OutputFormat("Now recording all stats very {0}ms to file", m_statsLogIntervalMs);
+ }
+ else if (cmd[3] == "stop")
+ {
+ Stop();
+ con.Output("Stopped recording stats to file.");
+ }
+ }
+
+ public static void Start()
+ {
+ if (m_loggingTimer != null)
+ Stop();
+
+ m_loggingTimer = new Timer(m_statsLogIntervalMs);
+ m_loggingTimer.AutoReset = false;
+ m_loggingTimer.Elapsed += Log;
+ m_loggingTimer.Start();
+ }
+
+ public static void Stop()
+ {
+ if (m_loggingTimer != null)
+ {
+ m_loggingTimer.Stop();
+ }
+ }
+
+ private static void Log(object sender, ElapsedEventArgs e)
+ {
+ m_statsLog.InfoFormat("*** STATS REPORT AT {0} ***", DateTime.Now);
+
+ foreach (string report in StatsManager.GetAllStatsReports())
+ m_statsLog.Info(report);
+
+ m_loggingTimer.Start();
+ }
+ }
+}
\ No newline at end of file
--
cgit v1.1
From b10710d4a5f7fb33ee9b90aefac16ac3d4647db6 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 7 Aug 2013 23:17:31 +0100
Subject: minor: add some method doc to ScenePresence fields used for entity
transfer, add minor details to some log messages, rename a misleading local
variable name.
No functional changes.
---
OpenSim/Framework/ChildAgentDataUpdate.cs | 6 ++++++
1 file changed, 6 insertions(+)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs
index 1c5f558..18d008c 100644
--- a/OpenSim/Framework/ChildAgentDataUpdate.cs
+++ b/OpenSim/Framework/ChildAgentDataUpdate.cs
@@ -287,6 +287,12 @@ namespace OpenSim.Framework
public Vector3 AtAxis;
public Vector3 LeftAxis;
public Vector3 UpAxis;
+
+ ///
+ /// Signal on a V2 teleport that Scene.IncomingChildAgentDataUpdate(AgentData ad) should wait for the
+ /// scene presence to become root (triggered when the viewer sends a CompleteAgentMovement UDP packet after
+ /// establishing the connection triggered by it's receipt of a TeleportFinish EQ message).
+ ///
public bool SenderWantsToWaitForRoot;
public float Far;
--
cgit v1.1