diff --git a/OpenSim/Data/PGSQL/PGSQLXInventoryData.cs b/OpenSim/Data/PGSQL/PGSQLXInventoryData.cs
index 55a1996f51..4c10ac99b7 100644
--- a/OpenSim/Data/PGSQL/PGSQLXInventoryData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLXInventoryData.cs
@@ -206,7 +206,7 @@ namespace OpenSim.Data.PGSQL
cmd.CommandText = String.Format(@"select bit_or(""inventoryCurrentPermissions"") as ""inventoryCurrentPermissions""
from inventoryitems
where ""avatarID""::uuid = :PrincipalID
- and ""assetID"" = :AssetID
+ and ""assetID""::uuid = :AssetID
group by ""assetID"" ");
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
diff --git a/OpenSim/Framework/Client/IClientIPEndpoint.cs b/OpenSim/Framework/Client/IClientIPEndpoint.cs
index 2b99bf0a99..2194616a02 100644
--- a/OpenSim/Framework/Client/IClientIPEndpoint.cs
+++ b/OpenSim/Framework/Client/IClientIPEndpoint.cs
@@ -34,6 +34,6 @@ namespace OpenSim.Framework.Client
{
public interface IClientIPEndpoint
{
- IPAddress EndPoint { get; }
+ IPEndPoint RemoteEndPoint { get; }
}
}
diff --git a/OpenSim/Framework/Monitoring/WorkManager.cs b/OpenSim/Framework/Monitoring/WorkManager.cs
index 43130f9a0b..a3e03904eb 100644
--- a/OpenSim/Framework/Monitoring/WorkManager.cs
+++ b/OpenSim/Framework/Monitoring/WorkManager.cs
@@ -82,6 +82,11 @@ namespace OpenSim.Framework.Monitoring
HandleControlCommand);
}
+ public static void Stop()
+ {
+ JobEngine.Stop();
+ }
+
///
/// Start a new long-lived thread.
///
@@ -131,7 +136,6 @@ namespace OpenSim.Framework.Monitoring
thread.Start();
-
return thread;
}
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index c7f013653b..2834d9437e 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -136,12 +136,19 @@ namespace OpenSim.Framework.Servers
protected override void ShutdownSpecific()
{
- m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting...");
- RemovePIDFile();
base.ShutdownSpecific();
+ MainServer.Stop();
+
+ Thread.Sleep(5000);
+
+ WorkManager.Stop();
+
+ RemovePIDFile();
+ m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting...");
+
if (!SuppressExit)
Environment.Exit(0);
}
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index cb0c41f34b..94a94904b8 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -194,17 +194,20 @@ namespace OpenSim.Framework.Servers.HttpServer
{
m_running = false;
- Thread.Sleep(1000); // let the world move
+ Thread.Sleep(100); // let the world move
foreach (Thread t in m_workerThreads)
Watchdog.AbortThread(t.ManagedThreadId);
+ m_threadPool.Shutdown();
+
// any entry in m_bycontext should have a active request on the other queues
// so just delete contents to easy GC
foreach (Queue qu in m_bycontext.Values)
qu.Clear();
m_bycontext.Clear();
+/*
try
{
foreach (PollServiceHttpRequest req in m_retryRequests)
@@ -217,8 +220,9 @@ namespace OpenSim.Framework.Servers.HttpServer
}
PollServiceHttpRequest wreq;
+*/
m_retryRequests.Clear();
-
+/*
while (m_requests.Count() > 0)
{
try
@@ -231,7 +235,7 @@ namespace OpenSim.Framework.Servers.HttpServer
{
}
}
-
+*/
m_requests.Clear();
}
@@ -242,7 +246,6 @@ namespace OpenSim.Framework.Servers.HttpServer
while (m_running)
{
PollServiceHttpRequest req = m_requests.Dequeue(5000);
-
Watchdog.UpdateThread();
if(req == null)
continue;
@@ -277,16 +280,16 @@ namespace OpenSim.Framework.Servers.HttpServer
try
{
req.DoHTTPGruntWork(m_server, responsedata);
+ }
+ catch (ObjectDisposedException) { }
+ finally
+ {
if(req.HttpContext.CanSend() && req.PollServiceArgs.Type == PollServiceEventArgs.EventType.Poll
&& (Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms)
ReQueueEvent(req);
else
byContextDequeue(req);
}
- catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
- {
- // Ignore it, no need to reply
- }
return null;
}, null);
}
@@ -300,11 +303,11 @@ namespace OpenSim.Framework.Servers.HttpServer
{
req.DoHTTPGruntWork(m_server,
req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
- byContextDequeue(req);
}
- catch (ObjectDisposedException)
+ catch (ObjectDisposedException) {}
+ finally
{
- // Ignore it, no need to reply
+ byContextDequeue(req);
}
return null;
}, null);
diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs
index 29308a983e..7ecd383b6a 100644
--- a/OpenSim/Framework/Servers/MainServer.cs
+++ b/OpenSim/Framework/Servers/MainServer.cs
@@ -369,5 +369,17 @@ namespace OpenSim.Framework.Servers
return m_Servers[port];
}
}
+
+ public static void Stop()
+ {
+ lock (m_Servers)
+ {
+ foreach (BaseHttpServer httpServer in m_Servers.Values)
+ {
+ httpServer.Stop();
+ }
+ }
+ }
+
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
index bc6d7b3da4..4bd2c28354 100644
--- a/OpenSim/Region/Application/Application.cs
+++ b/OpenSim/Region/Application/Application.cs
@@ -77,7 +77,11 @@ namespace OpenSim
if(Util.IsWindows())
ServicePointManager.DefaultConnectionLimit = 32;
else
+ {
ServicePointManager.DefaultConnectionLimit = 12;
+ try { ServicePointManager.DnsRefreshTimeout = 120000; } // just is case crazy some mono decides to have it infinity
+ catch { }
+ }
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false;
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index f9f103aa9e..524f2be10b 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -504,7 +504,8 @@ namespace OpenSim
private void WatchdogTimeoutHandler(Watchdog.ThreadWatchdogInfo twi)
{
int now = Environment.TickCount & Int32.MaxValue;
-
+ if(twi.Thread.ThreadState == System.Threading.ThreadState.Stopped)
+ return;
m_log.ErrorFormat(
"[WATCHDOG]: Timeout detected for thread \"{0}\". ThreadState={1}. Last tick was {2}ms ago. {3}",
twi.Thread.Name,
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 298c933da6..f658a709af 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -62,7 +62,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Handles new client connections
/// Constructor takes a single Packet and authenticates everything
///
- public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientInventory, IStatsCollector
+ public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientInventory, IStatsCollector, IClientIPEndpoint
{
///
/// Debug packet level. See OpenSim.RegisterConsoleCommands() for more details.
diff --git a/OpenSim/Region/CoreModules/Agent/IPBan/SceneBanner.cs b/OpenSim/Region/CoreModules/Agent/IPBan/SceneBanner.cs
index 8502006cd7..b4c68e2a65 100644
--- a/OpenSim/Region/CoreModules/Agent/IPBan/SceneBanner.cs
+++ b/OpenSim/Region/CoreModules/Agent/IPBan/SceneBanner.cs
@@ -53,9 +53,9 @@ namespace OpenSim.Region.CoreModules.Agent.IPBan
if (bans.Count > 0)
{
IClientIPEndpoint ipEndpoint;
- if (client.TryGet(out ipEndpoint))
+ if (client.TryGet(out ipEndpoint) && ipEndpoint.RemoteEndPoint != null)
{
- IPAddress end = ipEndpoint.EndPoint;
+ IPAddress end = ipEndpoint.RemoteEndPoint.Address;
try
{
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 87b76dc30b..4b846f50d9 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -813,8 +813,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agentCircuit.Id0 = currentAgentCircuit.Id0;
}
- IClientIPEndpoint ipepClient;
-
uint newRegionX, newRegionY, oldRegionX, oldRegionY;
Util.RegionHandleToRegionLoc(destinationHandle, out newRegionX, out newRegionY);
Util.RegionHandleToRegionLoc(sourceRegion.RegionHandle, out oldRegionX, out oldRegionY);
@@ -833,13 +831,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
finalDestination.RegionName, newRegionX, newRegionY,newSizeX, newSizeY, sp.Name, Scene.Name);
//sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent...");
- #region IP Translation for NAT
- // Uses ipepClient above
- if (sp.ClientView.TryGet(out ipepClient))
- {
- endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
- }
- #endregion
agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();
}
else
@@ -952,7 +943,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agent.Position = agentCircuit.startpos;
SetCallbackURL(agent, sp.Scene.RegionInfo);
-
// We will check for an abort before UpdateAgent since UpdateAgent will require an active viewer to
// establish th econnection to the destination which makes it return true.
if (m_entityTransferStateMachine.GetAgentTransferState(sp.UUID) == AgentTransferState.Aborting)
@@ -1745,11 +1735,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (m_eqModule != null)
{
- #region IP Translation for NAT
- IClientIPEndpoint ipepClient;
- if (agent.ClientView.TryGet(out ipepClient))
- endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
-
m_log.DebugFormat("{0} {1} is sending {2} EnableSimulator for neighbour region {3}(loc=<{4},{5}>,siz=<{6},{7}>) " +
"and EstablishAgentCommunication with seed cap {8}", LogHeader,
source.RegionName, agent.Name,
@@ -2281,6 +2266,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
}
#endregion // NotFoundLocationCache class
+ #region getregions
private NotFoundLocationCache m_notFoundLocationCache = new NotFoundLocationCache();
protected GridRegion GetRegionContainingWorldLocation(IGridService pGridService, UUID pScopeID, double px, double py)
@@ -2398,17 +2384,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (m_eqModule != null)
{
- #region IP Translation for NAT
if(sp == null || sp.IsDeleted || sp.ClientView == null) // something bad already happened
return;
- IClientIPEndpoint ipepClient;
- if (sp.ClientView.TryGet(out ipepClient))
- {
- endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
- }
- #endregion
-
m_log.DebugFormat("{0} {1} is sending {2} EnableSimulator for neighbour region {3}(loc=<{4},{5}>,siz=<{6},{7}>) " +
"and EstablishAgentCommunication with seed cap {8}", LogHeader,
scene.RegionInfo.RegionName, sp.Name,
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index 5d66d34a2b..8c44ee2f93 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -106,6 +106,8 @@ namespace OpenSim.Region.CoreModules.Hypergrid
if (!m_Enabled)
return;
+ base.RemoveRegion(scene);
+
scene.EventManager.OnClientClosed -= EventManager_OnClientClosed;
}
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
index ae5e175e32..57dc556bfc 100644
--- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
+++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
@@ -415,6 +415,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
public void Close()
{
+ ThreadPool.Shutdown();
}
public string Name
@@ -538,6 +539,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
{
Request = (HttpWebRequest)WebRequest.Create(Url);
Request.AllowAutoRedirect = false;
+ Request.KeepAlive = false;
//This works around some buggy HTTP Servers like Lighttpd
Request.ServicePoint.Expect100Continue = false;
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
index 5dcf3266a9..00c82794fb 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
@@ -215,6 +215,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
m_scene.EventManager.OnNewClient -= OnNewClient;
m_scene.EventManager.OnRegisterCaps -= OnRegisterCaps;
+ m_scene.UnregisterModuleInterface(this);
+
string regionimage = "regionImage" + m_scene.RegionInfo.RegionID.ToString();
regionimage = regionimage.Replace("-", "");
MainServer.Instance.RemoveLLSDHandler("/MAP/MapItems/" + m_scene.RegionInfo.RegionHandle.ToString(),
@@ -1148,7 +1150,12 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
List thisRunData = new List();
while (true)
{
- m_mapBlockRequestEvent.WaitOne();
+ while(!m_mapBlockRequestEvent.WaitOne(4900))
+ {
+ if(m_scene == null)
+ return;
+ }
+
lock (m_mapBlockRequestEvent)
{
int total = 0;
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 474378d942..55ccb0a3ac 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -4687,7 +4687,10 @@ namespace OpenSim.Region.Framework.Scenes
cAgent.agentCOF = COF;
cAgent.ActiveGroupID = ControllingClient.ActiveGroupId;
cAgent.ActiveGroupName = ControllingClient.ActiveGroupName;
- cAgent.ActiveGroupTitle = Grouptitle;
+ if(Grouptitle == null)
+ cAgent.ActiveGroupTitle = String.Empty;
+ else
+ cAgent.ActiveGroupTitle = Grouptitle;
}
}
diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
index 93406cbb79..5a9a5a01b4 100644
--- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
+++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
@@ -550,7 +550,16 @@ namespace OpenSim.Region.Framework.Scenes
///
private void RecordMaterialAssetUuids(AssetBase materialAsset)
{
- OSDMap mat = (OSDMap)OSDParser.DeserializeLLSDXml(materialAsset.Data);
+ OSDMap mat;
+ try
+ {
+ mat = (OSDMap)OSDParser.DeserializeLLSDXml(materialAsset.Data);
+ }
+ catch (Exception e)
+ {
+ m_log.WarnFormat("[Materials]: cannot decode material asset {0}: {1}", materialAsset.ID, e.Message);
+ return;
+ }
UUID normMap = mat["NormMap"].AsUUID();
if (normMap != UUID.Zero)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
index 6a39bb95e0..eb6455a6fb 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
@@ -51,7 +51,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
private static Thread cmdHandlerThread;
private static int cmdHandlerThreadCycleSleepms;
-
+ private static int numInstances;
///
/// Lock for reading/writing static components of AsyncCommandManager.
///
@@ -172,18 +172,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (!m_XmlRequest.ContainsKey(m_ScriptEngine))
m_XmlRequest[m_ScriptEngine] = new XmlRequest(this);
- StartThread();
- }
- }
-
- private static void StartThread()
- {
- if (cmdHandlerThread == null)
- {
- // Start the thread that will be doing the work
- cmdHandlerThread
- = WorkManager.StartThread(
+ numInstances++;
+ if (cmdHandlerThread == null)
+ {
+ cmdHandlerThread = WorkManager.StartThread(
CmdHandlerThreadLoop, "AsyncLSLCmdHandlerThread", ThreadPriority.Normal, true, true);
+ }
}
}
@@ -197,20 +191,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
~AsyncCommandManager()
{
// Shut down thread
-// try
-// {
-// if (cmdHandlerThread != null)
-// {
-// if (cmdHandlerThread.IsAlive == true)
-// {
-// cmdHandlerThread.Abort();
-// //cmdHandlerThread.Join();
-// }
-// }
-// }
-// catch
-// {
-// }
+ try
+ {
+ lock (staticLock)
+ {
+ numInstances--;
+ if(numInstances > 0)
+ return;
+ if (cmdHandlerThread != null)
+ {
+ if (cmdHandlerThread.IsAlive == true)
+ {
+ cmdHandlerThread.Abort();
+ //cmdHandlerThread.Join();
+ cmdHandlerThread = null;
+ }
+ }
+ }
+ }
+ catch
+ {
+ }
}
///
@@ -240,24 +241,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
lock (staticLock)
{
// Check HttpRequests
- m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests();
+ try { m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests(); } catch {}
// Check XMLRPCRequests
- m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests();
+ try { m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests(); } catch {}
foreach (IScriptEngine s in m_ScriptEngines)
{
// Check Listeners
- m_Listener[s].CheckListeners();
+ try { m_Listener[s].CheckListeners(); } catch {}
+
// Check timers
- m_Timer[s].CheckTimerEvents();
+ try { m_Timer[s].CheckTimerEvents(); } catch {}
// Check Sensors
- m_SensorRepeat[s].CheckSenseRepeaterEvents();
+ try { m_SensorRepeat[s].CheckSenseRepeaterEvents(); } catch {}
// Check dataserver
- m_Dataserver[s].ExpireRequests();
+ try { m_Dataserver[s].ExpireRequests(); } catch {}
}
}
}
@@ -387,8 +389,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
-
-
public static Object[] GetSerializationData(IScriptEngine engine, UUID itemID)
{
List