From 7c811c39c8728f20701cfe1b1ea0ec2847617b07 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 23 Nov 2012 02:22:30 +0000 Subject: [PATCH] Fix problem where restarting the currently selected region would stop various console commands (e.g. "show users") from working. This was because the "currently selected" scene reference was being left as the dead scene instead of the restarted Scene object. --- OpenSim/Region/Application/OpenSim.cs | 20 ++++++++ OpenSim/Region/Application/OpenSimBase.cs | 11 +++-- OpenSim/Region/Framework/Scenes/Scene.cs | 10 +--- .../Region/Framework/Scenes/SceneManager.cs | 46 +++++++++---------- 4 files changed, 51 insertions(+), 36 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 4ba206e75e..9f05cf4fb4 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -682,12 +682,20 @@ namespace OpenSim if (!SceneManager.TrySetCurrentScene(newRegionName)) MainConsole.Instance.Output(String.Format("Couldn't select region {0}", newRegionName)); + else + RefreshPrompt(); } else { MainConsole.Instance.Output("Usage: change region "); } + } + /// + /// Refreshs prompt with the current selection details. + /// + private void RefreshPrompt() + { string regionName = (SceneManager.CurrentScene == null ? "root" : SceneManager.CurrentScene.RegionInfo.RegionName); MainConsole.Instance.Output(String.Format("Currently selected region is {0}", regionName)); @@ -709,6 +717,18 @@ namespace OpenSim m_console.ConsoleScene = SceneManager.CurrentScene; } + protected override void HandleRestartRegion(RegionInfo whichRegion) + { + base.HandleRestartRegion(whichRegion); + + // Where we are restarting multiple scenes at once, a previous call to RefreshPrompt may have set the + // m_console.ConsoleScene to null (indicating all scenes). + if (m_console.ConsoleScene != null && whichRegion.RegionName == ((Scene)m_console.ConsoleScene).Name) + SceneManager.TrySetCurrentScene(whichRegion.RegionName); + + RefreshPrompt(); + } + /// /// Turn on some debugging values for OpenSim. /// diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 917f109a00..2927f1fccf 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -310,7 +310,7 @@ namespace OpenSim // Called from base.StartUp() m_httpServerPort = m_networkServersInfo.HttpListenerPort; - SceneManager.OnRestartSim += handleRestartRegion; + SceneManager.OnRestartSim += HandleRestartRegion; // Only enable the watchdogs when all regions are ready. Otherwise we get false positives when cpu is // heavily used during initial startup. @@ -759,9 +759,11 @@ namespace OpenSim } } - public void handleRestartRegion(RegionInfo whichRegion) + protected virtual void HandleRestartRegion(RegionInfo whichRegion) { - m_log.Info("[OPENSIM]: Got restart signal from SceneManager"); + m_log.InfoFormat( + "[OPENSIM]: Got restart signal from SceneManager for region {0} ({1},{2})", + whichRegion.RegionName, whichRegion.RegionLocX, whichRegion.RegionLocY); ShutdownClientServer(whichRegion); IScene scene; @@ -907,7 +909,6 @@ namespace OpenSim m_log.Info("[SHUTDOWN]: Closing all threads"); m_log.Info("[SHUTDOWN]: Killing listener thread"); m_log.Info("[SHUTDOWN]: Killing clients"); - // TODO: implement this m_log.Info("[SHUTDOWN]: Closing console and terminating"); try @@ -916,7 +917,7 @@ namespace OpenSim } catch (Exception e) { - m_log.ErrorFormat("[SHUTDOWN]: Ignoring failure during shutdown - {0}", e); + m_log.Error("[SHUTDOWN]: Ignoring failure during shutdown - ", e); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b893a6facc..d11e9ab783 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1097,16 +1097,10 @@ namespace OpenSim.Region.Framework.Scenes } } - m_log.Error("[REGION]: Closing"); + m_log.InfoFormat("[REGION]: Restarting region {0}", Name); + Close(); - if (PhysicsScene != null) - { - PhysicsScene.Dispose(); - } - - m_log.Error("[REGION]: Firing Region Restart Message"); - base.Restart(); } diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index c81b55de16..b4924ef6f7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs @@ -96,23 +96,25 @@ namespace OpenSim.Region.Framework.Scenes } private readonly List m_localScenes = new List(); - private Scene m_currentScene = null; public List Scenes { get { return new List(m_localScenes); } } - public Scene CurrentScene - { - get { return m_currentScene; } - } + /// + /// Scene selected from the console. + /// + /// + /// If null, then all scenes are considered selected (signalled as "Root" on the console). + /// + public Scene CurrentScene { get; private set; } public Scene CurrentOrFirstScene { get { - if (m_currentScene == null) + if (CurrentScene == null) { lock (m_localScenes) { @@ -124,7 +126,7 @@ namespace OpenSim.Region.Framework.Scenes } else { - return m_currentScene; + return CurrentScene; } } } @@ -192,8 +194,7 @@ namespace OpenSim.Region.Framework.Scenes public void HandleRestart(RegionInfo rdata) { - m_log.Error("[SCENEMANAGER]: Got Restart message for region:" + rdata.RegionName + " Sending up to main"); - int RegionSceneElement = -1; + Scene restartedScene = null; lock (m_localScenes) { @@ -201,19 +202,18 @@ namespace OpenSim.Region.Framework.Scenes { if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName) { - RegionSceneElement = i; + restartedScene = m_localScenes[i]; + m_localScenes.RemoveAt(i); + break; } } - - // Now we make sure the region is no longer known about by the SceneManager - // Prevents duplicates. - - if (RegionSceneElement >= 0) - { - m_localScenes.RemoveAt(RegionSceneElement); - } } + // If the currently selected scene has been restarted, then we can't reselect here since we the scene + // hasn't yet been recreated. We will have to leave this to the caller. + if (CurrentScene == restartedScene) + CurrentScene = null; + // Send signal to main that we're restarting this sim. OnRestartSim(rdata); } @@ -355,14 +355,14 @@ namespace OpenSim.Region.Framework.Scenes private void ForEachCurrentScene(Action func) { - if (m_currentScene == null) + if (CurrentScene == null) { lock (m_localScenes) m_localScenes.ForEach(func); } else { - func(m_currentScene); + func(CurrentScene); } } @@ -382,7 +382,7 @@ namespace OpenSim.Region.Framework.Scenes || (String.Compare(regionName, "..") == 0) || (String.Compare(regionName, "/") == 0)) { - m_currentScene = null; + CurrentScene = null; return true; } else @@ -393,7 +393,7 @@ namespace OpenSim.Region.Framework.Scenes { if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0) { - m_currentScene = scene; + CurrentScene = scene; return true; } } @@ -413,7 +413,7 @@ namespace OpenSim.Region.Framework.Scenes { if (scene.RegionInfo.RegionID == regionID) { - m_currentScene = scene; + CurrentScene = scene; return true; } }