From 8a0a78cbccce796addacab7ed1609279b802a9b3 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 25 Oct 2011 20:24:21 +0100
Subject: Make OpenSim.Framework.Servers.HttpServer rely on OpenSim.Framework
instead of the other way around.
This is necessary so that code in HttpServer can use framework facilities such as the thread watchdog for monitoring purposes.
Doing this shuffle meant that MainServer was moved into OpenSim/Framework/Servers
Also had to make OpenSim.Framework.Console rely on OpenSim.Framework rather than the other way around since it in turn relies on HttpServer
MainConsole and some new interfaces had to be moved into OpenSim/Framework to allow this. This can be reverted if parts of OpenSim.Framework stop relying on console presence (cheifly RegionInfo)
---
.../Servers/HttpServer/Interfaces/IHttpServer.cs | 4 +-
.../HttpServer/PollServiceRequestManager.cs | 38 +++++-----
.../Servers/HttpServer/PollServiceWorkerThread.cs | 2 +-
OpenSim/Framework/Servers/MainServer.cs | 81 ++++++++++++++++++++++
4 files changed, 106 insertions(+), 19 deletions(-)
create mode 100644 OpenSim/Framework/Servers/MainServer.cs
(limited to 'OpenSim/Framework/Servers')
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs
index 65b1eb5..fd77984 100644
--- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs
@@ -49,7 +49,7 @@ namespace OpenSim.Framework.Servers.HttpServer
///
/// Add a handler for an HTTP request.
///
- ///
+ ///
/// This handler can actually be invoked either as
///
/// http://:/?method=
@@ -70,7 +70,7 @@ namespace OpenSim.Framework.Servers.HttpServer
/// In addition, the handler invoked by the HTTP server for any request is the one when best matches the request
/// URI. So if a handler for "/myapp/" is registered and a request for "/myapp/page" is received, then
/// the "/myapp/" handler is invoked if no "/myapp/page" handler exists.
- ///
+ ///
///
///
///
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index 0840a9d..ea30b9a 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -31,6 +31,7 @@ using System.Threading;
using System.Reflection;
using log4net;
using HttpServer;
+using OpenSim.Framework;
namespace OpenSim.Framework.Servers.HttpServer
{
@@ -54,21 +55,25 @@ namespace OpenSim.Framework.Servers.HttpServer
m_PollServiceWorkerThreads = new PollServiceWorkerThread[m_WorkerThreadCount];
//startup worker threads
- for (uint i=0;i 0; tc++)
{
//Loop over number of requests each thread handles.
- for (int i=0;i 0;i++)
+ for (int i = 0; i < reqperthread && m_requests.Count > 0; i++)
{
try
{
@@ -125,14 +131,14 @@ namespace OpenSim.Framework.Servers.HttpServer
}
-
-
~PollServiceRequestManager()
{
foreach (object o in m_requests)
{
PollServiceHttpRequest req = (PollServiceHttpRequest) o;
- m_server.DoHTTPGruntWork(req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id), new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext));
+ m_server.DoHTTPGruntWork(
+ req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id),
+ new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext));
}
m_requests.Clear();
@@ -144,4 +150,4 @@ namespace OpenSim.Framework.Servers.HttpServer
m_running = false;
}
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs
index b91496b..16e56d2 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs
@@ -59,7 +59,7 @@ namespace OpenSim.Framework.Servers.HttpServer
m_timeout = pTimeout;
}
- public void ThreadStart(object o)
+ public void ThreadStart()
{
Run();
}
diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs
new file mode 100644
index 0000000..b8ab8d9
--- /dev/null
+++ b/OpenSim/Framework/Servers/MainServer.cs
@@ -0,0 +1,81 @@
+/*
+ * 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.Collections.Generic;
+using System.Reflection;
+using System.Net;
+using log4net;
+using OpenSim.Framework.Servers.HttpServer;
+
+namespace OpenSim.Framework.Servers
+{
+ public class MainServer
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private static BaseHttpServer instance = null;
+ private static Dictionary m_Servers =
+ new Dictionary();
+
+ public static BaseHttpServer Instance
+ {
+ get { return instance; }
+ set { instance = value; }
+ }
+
+ public static IHttpServer GetHttpServer(uint port)
+ {
+ return GetHttpServer(port,null);
+ }
+
+ public static void AddHttpServer(BaseHttpServer server)
+ {
+ m_Servers.Add(server.Port, server);
+ }
+
+ public static IHttpServer GetHttpServer(uint port, IPAddress ipaddr)
+ {
+ if (port == 0)
+ return Instance;
+ if (instance != null && port == Instance.Port)
+ return Instance;
+
+ if (m_Servers.ContainsKey(port))
+ return m_Servers[port];
+
+ m_Servers[port] = new BaseHttpServer(port);
+
+ if (ipaddr != null)
+ m_Servers[port].ListenIPAddress = ipaddr;
+
+ m_log.InfoFormat("[MAIN HTTP SERVER]: Starting main http server on port {0}", port);
+ m_Servers[port].Start();
+
+ return m_Servers[port];
+ }
+ }
+}
--
cgit v1.1
From 968cae6c17fab8aa8a15bfd8231b50873aa6e794 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 25 Oct 2011 20:49:46 +0100
Subject: Add "threads abort " simulator console command that allows
us to abort a watchdog managed thread.
This is for diagnostic purposes.
---
OpenSim/Framework/Servers/BaseOpenSimServer.cs | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
(limited to 'OpenSim/Framework/Servers')
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 688be3f..b242e1c 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -192,6 +192,10 @@ namespace OpenSim.Framework.Servers
m_console.Commands.AddCommand("base", false, "show version",
"show version",
"Show server version", HandleShow);
+
+ m_console.Commands.AddCommand("base", false, "threads abort",
+ "threads abort ",
+ "Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort);
}
}
@@ -395,6 +399,27 @@ namespace OpenSim.Framework.Servers
break;
}
}
+
+ public virtual void HandleThreadsAbort(string module, string[] cmd)
+ {
+ if (cmd.Length != 3)
+ {
+ MainConsole.Instance.Output("Usage: threads abort ");
+ return;
+ }
+
+ int threadId;
+ if (!int.TryParse(cmd[2], out threadId))
+ {
+ MainConsole.Instance.Output("ERROR: Thread id must be an integer");
+ return;
+ }
+
+ if (Watchdog.AbortThread(threadId))
+ MainConsole.Instance.OutputFormat("Aborted thread with id {0}", threadId);
+ else
+ MainConsole.Instance.OutputFormat("ERROR - Thread with id {0} not found in managed threads", threadId);
+ }
protected void ShowInfo()
{
--
cgit v1.1
From a4d4f548489e42c98ac3045b032c046fe461aa5b Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 25 Oct 2011 20:59:27 +0100
Subject: minor: add "threads show" as synonym for "show threads" for
consistency
---
OpenSim/Framework/Servers/BaseOpenSimServer.cs | 5 +++++
1 file changed, 5 insertions(+)
(limited to 'OpenSim/Framework/Servers')
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index b242e1c..3d20080 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -196,6 +196,11 @@ namespace OpenSim.Framework.Servers
m_console.Commands.AddCommand("base", false, "threads abort",
"threads abort ",
"Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort);
+
+ m_console.Commands.AddCommand("base", false, "threads show",
+ "threads show",
+ "Show thread status. Synonym for \"show threads\"",
+ (string module, string[] args) => Notice(GetThreadsReport()));
}
}
--
cgit v1.1
From c275c229281c9a7113659457a310da775f26ec43 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 25 Oct 2011 23:26:21 +0100
Subject: Restart the event queue worker threads that I accidentally disabled
earlier today in 8a0a78c.
Also adds these to the watchdogs with very large timeouts (should really be infinite)
---
.../Servers/HttpServer/PollServiceRequestManager.cs | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
(limited to 'OpenSim/Framework/Servers')
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index ea30b9a..d9965b6 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -60,12 +60,13 @@ namespace OpenSim.Framework.Servers.HttpServer
m_PollServiceWorkerThreads[i] = new PollServiceWorkerThread(m_server, pTimeout);
m_PollServiceWorkerThreads[i].ReQueue += ReQueueEvent;
-// m_workerThreads[i]
-// = Watchdog.StartThread(
-// m_PollServiceWorkerThreads[i].ThreadStart,
-// String.Format("PollServiceWorkerThread{0}", i),
-// ThreadPriority.Normal,
-// false);
+ m_workerThreads[i]
+ = Watchdog.StartThread(
+ m_PollServiceWorkerThreads[i].ThreadStart,
+ String.Format("PollServiceWorkerThread{0}", i),
+ ThreadPriority.Normal,
+ false,
+ int.MaxValue);
}
m_watcherThread
@@ -73,7 +74,8 @@ namespace OpenSim.Framework.Servers.HttpServer
this.ThreadStart,
"PollServiceWatcherThread",
ThreadPriority.Normal,
- false);
+ false,
+ 1000 * 60 * 10);
}
internal void ReQueueEvent(PollServiceHttpRequest req)
--
cgit v1.1