From 304c5d4a8b8a1137bac18f7f6443ea85cec86184 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 3 May 2013 18:48:50 +0100
Subject: On startup, start scenes after we're set up all local scenes, rather
than starting scenes before others have been created.
This aims to avoid a race condition where scenes could look to inform neighbours that they were up before those neighbours had been created.
http://opensimulator.org/mantis/view.php?id=6618
---
OpenSim/Region/Application/OpenSimBase.cs | 4 +---
OpenSim/Region/Framework/Scenes/Scene.cs | 16 ++++++++++++++--
OpenSim/Region/Framework/Scenes/SceneBase.cs | 4 ++++
3 files changed, 19 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs
index d86eefe..f9e0cf1 100644
--- a/OpenSim/Region/Application/OpenSimBase.cs
+++ b/OpenSim/Region/Application/OpenSimBase.cs
@@ -425,9 +425,6 @@ namespace OpenSim
mscene = scene;
- scene.Start();
- scene.StartScripts();
-
return clientServers;
}
@@ -751,6 +748,7 @@ namespace OpenSim
ShutdownClientServer(whichRegion);
IScene scene;
CreateRegion(whichRegion, true, out scene);
+ scene.Start();
}
# region Setup methods
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 829a7e9..4f674a3 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -389,10 +389,12 @@ namespace OpenSim.Region.Framework.Scenes
if (value)
{
if (!m_active)
- Start();
+ Start(false);
}
else
{
+ // This appears assymetric with Start() above but is not - setting m_active = false stops the loops
+ // XXX: Possibly this should be in an explicit Stop() method for symmetry.
m_active = false;
}
}
@@ -1331,10 +1333,18 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public override void Start()
+ {
+ Start(true);
+ }
+
///
/// Start the scene
///
- public void Start()
+ ///
+ /// Start the scripts within the scene.
+ ///
+ public void Start(bool startScripts)
{
m_active = true;
@@ -1353,6 +1363,8 @@ namespace OpenSim.Region.Framework.Scenes
m_heartbeatThread
= Watchdog.StartThread(
Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false);
+
+ StartScripts();
}
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index d3e968e..d2097ea 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -561,6 +561,10 @@ namespace OpenSim.Region.Framework.Scenes
get { return false; }
}
+ public virtual void Start()
+ {
+ }
+
public void Restart()
{
// This has to be here to fire the event
--
cgit v1.1
From 5d93c99e8cf188b29b4c5265619eb4a4d3eeacf6 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 3 May 2013 18:56:58 +0100
Subject: Fix possible race condition with local region cache if a region was
added after startup.
---
.../Grid/LocalGridServiceConnector.cs | 43 ++++++++++++++--------
1 file changed, 28 insertions(+), 15 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
index c0c2ca7..c32820e 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
@@ -142,10 +142,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
scene.RegisterModuleInterface(this);
- if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID))
- m_log.ErrorFormat("[LOCAL GRID SERVICE CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!");
- else
- m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene));
+ lock (m_LocalCache)
+ {
+ if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID))
+ m_log.ErrorFormat("[LOCAL GRID SERVICE CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!");
+ else
+ m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene));
+ }
}
public void RemoveRegion(Scene scene)
@@ -153,8 +156,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
if (!m_Enabled)
return;
- m_LocalCache[scene.RegionInfo.RegionID].Clear();
- m_LocalCache.Remove(scene.RegionInfo.RegionID);
+ lock (m_LocalCache)
+ {
+ m_LocalCache[scene.RegionInfo.RegionID].Clear();
+ m_LocalCache.Remove(scene.RegionInfo.RegionID);
+ }
}
public void RegionLoaded(Scene scene)
@@ -191,12 +197,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
// First see if it's a neighbour, even if it isn't on this sim.
// Neighbour data is cached in memory, so this is fast
- foreach (RegionCache rcache in m_LocalCache.Values)
+
+ lock (m_LocalCache)
{
- region = rcache.GetRegionByPosition(x, y);
- if (region != null)
+ foreach (RegionCache rcache in m_LocalCache.Values)
{
- return region;
+ region = rcache.GetRegionByPosition(x, y);
+ if (region != null)
+ {
+ return region;
+ }
}
}
@@ -245,12 +255,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
{
System.Text.StringBuilder caps = new System.Text.StringBuilder();
- foreach (KeyValuePair kvp in m_LocalCache)
+ lock (m_LocalCache)
{
- caps.AppendFormat("*** Neighbours of {0} ({1}) ***\n", kvp.Value.RegionName, kvp.Key);
- List regions = kvp.Value.GetNeighbours();
- foreach (GridRegion r in regions)
- caps.AppendFormat(" {0} @ {1}-{2}\n", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize);
+ foreach (KeyValuePair kvp in m_LocalCache)
+ {
+ caps.AppendFormat("*** Neighbours of {0} ({1}) ***\n", kvp.Value.RegionName, kvp.Key);
+ List regions = kvp.Value.GetNeighbours();
+ foreach (GridRegion r in regions)
+ caps.AppendFormat(" {0} @ {1}-{2}\n", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize);
+ }
}
MainConsole.Instance.Output(caps.ToString());
--
cgit v1.1