From 049987925d6293bd5a7367e86c1256febe60a229 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 23 Nov 2012 02:05:30 +0000 Subject: Add regression test for checking scene close when SceneManager is asked to close --- .../Framework/Scenes/Tests/SceneManagerTests.cs | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 OpenSim/Region/Framework/Scenes/Tests/SceneManagerTests.cs diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneManagerTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneManagerTests.cs new file mode 100644 index 0000000..ab56f4e --- /dev/null +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneManagerTests.cs @@ -0,0 +1,58 @@ +/* + * 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.Reflection; +using System.Threading; +using NUnit.Framework; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Region.Framework.Scenes.Tests +{ + [TestFixture] + public class SceneManagerTests + { + [Test] + public void TestClose() + { + TestHelpers.InMethod(); + + SceneHelpers sh = new SceneHelpers(); + Scene scene = sh.SetupScene(); + + sh.SceneManager.Close(); + Assert.That(scene.ShuttingDown, Is.True); + } + } +} \ No newline at end of file -- cgit v1.1 From 8c8c8a00a47b61fcfd4a500ac8f13aa1aafaad26 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 23 Nov 2012 02:22:30 +0000 Subject: 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 ++---- OpenSim/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 17b2167..cffbb3b 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -664,12 +664,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)); @@ -691,6 +699,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 b40aa4b..c3c87e7 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -299,7 +299,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. @@ -735,9 +735,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; @@ -883,7 +885,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 @@ -892,7 +893,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 db45d6b..8ef22bd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1134,15 +1134,9 @@ namespace OpenSim.Region.Framework.Scenes } } - m_log.Error("[REGION]: Closing"); - Close(); + m_log.InfoFormat("[REGION]: Restarting region {0}", Name); - if (PhysicsScene != null) - { - PhysicsScene.Dispose(); - } - - m_log.Error("[REGION]: Firing Region Restart Message"); + Close(); base.Restart(); } diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index 1c236db..1e2e973 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs @@ -100,23 +100,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) { @@ -128,7 +130,7 @@ namespace OpenSim.Region.Framework.Scenes } else { - return m_currentScene; + return CurrentScene; } } } @@ -178,8 +180,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) { @@ -187,19 +188,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); } @@ -341,14 +341,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); } } @@ -368,7 +368,7 @@ namespace OpenSim.Region.Framework.Scenes || (String.Compare(regionName, "..") == 0) || (String.Compare(regionName, "/") == 0)) { - m_currentScene = null; + CurrentScene = null; return true; } else @@ -379,7 +379,7 @@ namespace OpenSim.Region.Framework.Scenes { if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0) { - m_currentScene = scene; + CurrentScene = scene; return true; } } @@ -399,7 +399,7 @@ namespace OpenSim.Region.Framework.Scenes { if (scene.RegionInfo.RegionID == regionID) { - m_currentScene = scene; + CurrentScene = scene; return true; } } -- cgit v1.1 From 9b60c14bb10301db9a3333ca815afd3296b981a8 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 23 Nov 2012 03:05:30 +0000 Subject: minor: Add some console feedback on region restart and log who requested a region restart if done from the viewer. --- OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | 4 ++++ OpenSim/Region/CoreModules/World/Region/RestartModule.cs | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 39cc93d..757e5d4 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -271,6 +271,10 @@ namespace OpenSim.Region.CoreModules.World.Estate } restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); + + m_log.InfoFormat( + "User {0} requested restart of region {1} in {2} seconds", + remoteClient.Name, Scene.Name, times.Count != 0 ? times[0] : 0); } } diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs index fea4de0..249a40d 100644 --- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs +++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs @@ -26,6 +26,7 @@ */ using System; +using System.Linq; using System.Reflection; using System.Timers; using System.Threading; @@ -264,7 +265,10 @@ namespace OpenSim.Region.CoreModules.World.Region for (int i = 4 ; i < args.Length ; i++) times.Add(Convert.ToInt32(args[i])); + MainConsole.Instance.OutputFormat( + "Region {0} scheduled for restart in {1} seconds", m_Scene.Name, times.Sum()); + ScheduleRestart(UUID.Zero, args[3], times.ToArray(), notice); } } -} +} \ No newline at end of file -- cgit v1.1 From 36c6edac6903ecb704d382ed0959ff3cc44b73bb Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 23 Nov 2012 03:29:50 +0000 Subject: Remove the redundant BypassPermissions() checks in EstateManagmentModule. This is repeated in the PermissionsModule and checking it earlier does not allow a force override of the bypass value --- .../World/Estate/EstateManagementModule.cs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 757e5d4..f974a63 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -299,7 +299,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if ((estateAccessType & 4) != 0) // User add { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) { if ((estateAccessType & 1) != 0) // All estates { @@ -331,7 +331,7 @@ namespace OpenSim.Region.CoreModules.World.Estate } if ((estateAccessType & 8) != 0) // User remove { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) { if ((estateAccessType & 1) != 0) // All estates { @@ -362,7 +362,7 @@ namespace OpenSim.Region.CoreModules.World.Estate } if ((estateAccessType & 16) != 0) // Group add { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) { if ((estateAccessType & 1) != 0) // All estates { @@ -391,9 +391,10 @@ namespace OpenSim.Region.CoreModules.World.Estate remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); } } + if ((estateAccessType & 32) != 0) // Group remove { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) { if ((estateAccessType & 1) != 0) // All estates { @@ -422,9 +423,10 @@ namespace OpenSim.Region.CoreModules.World.Estate remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); } } + if ((estateAccessType & 64) != 0) // Ban add { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false)) { EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; @@ -499,9 +501,10 @@ namespace OpenSim.Region.CoreModules.World.Estate remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); } } + if ((estateAccessType & 128) != 0) // Ban remove { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false)) { EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; @@ -554,9 +557,10 @@ namespace OpenSim.Region.CoreModules.World.Estate remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); } } + if ((estateAccessType & 256) != 0) // Manager add { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) { if ((estateAccessType & 1) != 0) // All estates { @@ -585,9 +589,10 @@ namespace OpenSim.Region.CoreModules.World.Estate remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); } } + if ((estateAccessType & 512) != 0) // Manager remove { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || Scene.Permissions.BypassPermissions()) + if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) { if ((estateAccessType & 1) != 0) // All estates { -- cgit v1.1