From 57c4def254b85997f5b8a4cd4e7d1db550947290 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 25 Nov 2010 03:16:52 +0000 Subject: [PATCH] Change all restarting to use the restart module. Remove hardcoded behavior --- .../RemoteController/RemoteAdminPlugin.cs | 17 ++++-- OpenSim/Framework/IScene.cs | 2 +- .../World/Estate/EstateManagementModule.cs | 18 +++++- OpenSim/Region/Framework/Scenes/Scene.cs | 57 +------------------ OpenSim/Region/Framework/Scenes/SceneBase.cs | 20 +++---- .../Shared/Api/Implementation/OSSL_Api.cs | 25 +++++++- 6 files changed, 62 insertions(+), 77 deletions(-) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index c09252a971..1b4d1ea9f9 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -208,18 +208,25 @@ namespace OpenSim.ApplicationPlugins.RemoteController UUID regionID = new UUID((string) requestData["regionID"]); - responseData["accepted"] = true; - responseData["success"] = true; - response.Value = responseData; - Scene rebootedScene; + responseData["success"] = false; + responseData["accepted"] = true; if (!m_application.SceneManager.TryGetScene(regionID, out rebootedScene)) throw new Exception("region not found"); responseData["rebooting"] = true; + + IRestartModule restartModule = rebootedScene.RequestModuleInterface(); + if (restartModule != null) + { + List times = new List { 30, 15 }; + + restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); + responseData["success"] = true; + } response.Value = responseData; - rebootedScene.Restart(30); + } catch (Exception e) { diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index 6798b7be8a..1298f26a62 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs @@ -73,7 +73,7 @@ namespace OpenSim.Framework void AddNewClient(IClientAPI client); void RemoveClient(UUID agentID); - void Restart(int seconds); + void Restart(); //RegionInfo OtherRegionUp(RegionInfo thisRegion); string GetSimulatorVersion(); diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 622fc0802d..ddae20f21c 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -231,7 +231,23 @@ namespace OpenSim.Region.CoreModules.World.Estate private void handleEstateRestartSimRequest(IClientAPI remoteClient, int timeInSeconds) { - m_scene.Restart(timeInSeconds); + IRestartModule restartModule = m_scene.RequestModuleInterface(); + if (restartModule != null) + { + List times = new List(); + while (timeInSeconds > 0) + { + times.Add(timeInSeconds); + if (timeInSeconds > 300) + timeInSeconds -= 120; + else if (timeInSeconds > 30) + timeInSeconds -= 30; + else + timeInSeconds -= 15; + } + + restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); + } } private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 4fc2cbca5e..129b52d919 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -893,60 +893,6 @@ namespace OpenSim.Region.Framework.Scenes return new GridRegion(RegionInfo); } - /// - /// Given float seconds, this will restart the region. - /// - /// float indicating duration before restart. - public virtual void Restart(float seconds) - { - // notifications are done in 15 second increments - // so .. if the number of seconds is less then 15 seconds, it's not really a restart request - // It's a 'Cancel restart' request. - - // RestartNow() does immediate restarting. - if (seconds < 15) - { - m_restartTimer.Stop(); - m_dialogModule.SendGeneralAlert("Restart Aborted"); - } - else - { - // Now we figure out what to set the timer to that does the notifications and calls, RestartNow() - m_restartTimer.Interval = 15000; - m_incrementsof15seconds = (int)seconds / 15; - m_RestartTimerCounter = 0; - m_restartTimer.AutoReset = true; - m_restartTimer.Elapsed += new ElapsedEventHandler(RestartTimer_Elapsed); - m_log.Info("[REGION]: Restarting Region in " + (seconds / 60) + " minutes"); - m_restartTimer.Start(); - m_dialogModule.SendNotificationToUsersInRegion( - UUID.Random(), String.Empty, RegionInfo.RegionName + String.Format(": Restarting in {0} Minutes", (int)(seconds / 60.0))); - } - } - - // The Restart timer has occured. - // We have to figure out if this is a notification or if the number of seconds specified in Restart - // have elapsed. - // If they have elapsed, call RestartNow() - public void RestartTimer_Elapsed(object sender, ElapsedEventArgs e) - { - m_RestartTimerCounter++; - if (m_RestartTimerCounter <= m_incrementsof15seconds) - { - if (m_RestartTimerCounter == 4 || m_RestartTimerCounter == 6 || m_RestartTimerCounter == 7) - m_dialogModule.SendNotificationToUsersInRegion( - UUID.Random(), - String.Empty, - RegionInfo.RegionName + ": Restarting in " + ((8 - m_RestartTimerCounter) * 15) + " seconds"); - } - else - { - m_restartTimer.Stop(); - m_restartTimer.AutoReset = false; - RestartNow(); - } - } - // This causes the region to restart immediatley. public void RestartNow() { @@ -969,7 +915,8 @@ namespace OpenSim.Region.Framework.Scenes Close(); m_log.Error("[REGION]: Firing Region Restart Message"); - base.Restart(0); + + base.Restart(); } // This is a helper function that notifies root agents in this region that a new sim near them has come up diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index c71aefadee..f343bc861e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -218,18 +218,6 @@ namespace OpenSim.Region.Framework.Scenes #region admin stuff - /// - /// Region Restart - Seconds till restart. - /// - /// - public virtual void Restart(int seconds) - { - m_log.Error("[REGION]: passing Restart Message up the namespace"); - restart handlerPhysicsCrash = OnRestart; - if (handlerPhysicsCrash != null) - handlerPhysicsCrash(RegionInfo); - } - public virtual bool PresenceChildStatus(UUID avatarID) { return false; @@ -562,6 +550,14 @@ namespace OpenSim.Region.Framework.Scenes get { return false; } } + public void Restart() + { + // This has to be here to fire the event + restart handlerPhysicsCrash = OnRestart; + if (handlerPhysicsCrash != null) + handlerPhysicsCrash(RegionInfo); + } + public abstract bool CheckClient(UUID agentID, System.Net.IPEndPoint ep); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index fc92f23a62..827626f46e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -395,10 +395,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // CheckThreatLevel(ThreatLevel.High, "osRegionRestart"); + IRestartModule restartModule = World.RequestModuleInterface(); m_host.AddScriptLPS(1); - if (World.Permissions.CanIssueEstateCommand(m_host.OwnerID, false)) + if (World.Permissions.CanIssueEstateCommand(m_host.OwnerID, false) && (restartModule != null)) { - World.Restart((float)seconds); + if (seconds < 15) + { + restartModule.AbortRestart("Restart aborted"); + return 1; + } + + List times = new List(); + while (seconds > 0) + { + times.Add((int)seconds); + if (seconds > 300) + seconds -= 120; + else if (seconds > 30) + seconds -= 30; + else + seconds -= 15; + } + + restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); return 1; } else @@ -2315,4 +2334,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return date.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); } } -} \ No newline at end of file +}