From 082f2baebe300e1313a34444c42dcc0a20c44baf Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Tue, 27 Nov 2007 13:46:52 +0000 Subject: Fixed an event in the events chain in inter-region communications. As a consequence, restarting sims in the same process instance now shows them when they come back up in grid mode and standalone mode. --- OpenSim/Region/Environment/Scenes/Scene.cs | 73 ++++++++++++++++------ .../Scenes/SceneCommunicationService.cs | 31 ++++++++- OpenSim/Region/Environment/Scenes/SceneManager.cs | 6 ++ 3 files changed, 90 insertions(+), 20 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes') diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index a9791ee..d8723f6 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -57,6 +57,9 @@ namespace OpenSim.Region.Environment.Scenes { #region Fields protected Timer m_heartbeatTimer = new Timer(); + protected Timer m_restartWaitTimer = new Timer(); + + protected List m_regionRestartNotifyList = new List(); public InnerScene m_innerScene; @@ -210,6 +213,7 @@ namespace OpenSim.Region.Environment.Scenes m_authenticateHandler = authen; CommsManager = commsMan; m_sceneGridService = sceneGridService; + m_sceneGridService.debugRegionName = regInfo.RegionName; m_storageManager = storeManager; AssetCache = assetCach; m_regInfo = regInfo; @@ -244,6 +248,8 @@ namespace OpenSim.Region.Environment.Scenes httpListener = httpServer; m_dumpAssetsToFile = dumpAssetsToFile; + + // This function was moved to terrain for some kind of map hack by babble RegisterRegionWithComms(); } @@ -262,29 +268,23 @@ namespace OpenSim.Region.Environment.Scenes { // Another region is up. We have to tell all our ScenePresences about it // This fails to get the desired effect and needs further work. - try + if (RegionInfo.RegionHandle != otherRegion.RegionHandle) { - - ForEachScenePresence(delegate(ScenePresence agent) + if (!(m_regionRestartNotifyList.Contains(otherRegion))) { - if (!(agent.IsChildAgent)) - { - this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); - InformClientOfNeighbor(agent, otherRegion); - } + m_regionRestartNotifyList.Add(otherRegion); + + m_restartWaitTimer = new Timer(20000); + m_restartWaitTimer.AutoReset = false; + m_restartWaitTimer.Elapsed += new ElapsedEventHandler(restart_Notify_Wait_Elapsed); + m_restartWaitTimer.Start(); } - - ); - } - catch (System.NullReferenceException) - { - // This means that we're not booted up completely yet. } return true; } public virtual void Restart(float seconds) { - if (seconds < 100) + if (seconds < 15) { t_restartTimer.Stop(); SendGeneralAlert("Restart Aborted"); @@ -314,6 +314,7 @@ namespace OpenSim.Region.Environment.Scenes else { t_restartTimer.Stop(); + t_restartTimer.AutoReset = false; MainLog.Instance.Error("REGION", "Closing"); Close(); MainLog.Instance.Error("REGION", "Firing Region Restart Message"); @@ -321,6 +322,34 @@ namespace OpenSim.Region.Environment.Scenes } } + public void restart_Notify_Wait_Elapsed(object sender, ElapsedEventArgs e) + { + m_restartWaitTimer.Stop(); + foreach (RegionInfo region in m_regionRestartNotifyList) + { + try + { + + ForEachScenePresence(delegate(ScenePresence agent) + { + if (!(agent.IsChildAgent)) + { + //agent.ControllingClient.new + //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); + InformClientOfNeighbor(agent, region); + } + } + + ); + } + catch (System.NullReferenceException) + { + // This means that we're not booted up completely yet. + } + } + // Reset list to nothing. + m_regionRestartNotifyList = new List(); + } public override void Close() { ForEachScenePresence(delegate(ScenePresence avatar) @@ -642,7 +671,11 @@ namespace OpenSim.Region.Environment.Scenes } CreateTerrainTextureInitial(); - CommsManager.GridService.RegisterRegion(RegionInfo); //hack to update the terrain texture in grid mode so it shows on world map + //CommsManager.GridService.RegisterRegion(RegionInfo); //hack to update the terrain texture in grid mode so it shows on world map + + // These two 'commands' *must be* next to each other or sim rebooting fails. + m_sceneGridService.RegisterRegion(RegionInfo); + m_sceneGridService.InformNeighborsThatRegionisUp(RegionInfo); } catch (Exception e) { @@ -1073,13 +1106,17 @@ namespace OpenSim.Region.Environment.Scenes /// public void RegisterRegionWithComms() { - m_sceneGridService.RegisterRegion(m_regInfo); + // Don't register here. babblefro moved registration to *after *the map + // functions on line 675 so that a proper map will generate and get sent to grid services + // Double registrations will cause inter region communication issues + + //m_sceneGridService.RegisterRegion(m_regInfo); m_sceneGridService.OnExpectUser += NewUserConnection; m_sceneGridService.OnAvatarCrossingIntoRegion += AgentCrossing; m_sceneGridService.OnCloseAgentConnection += CloseConnection; m_sceneGridService.OnRegionUp += OtherRegionUp; // Tell Other regions that I'm here. - m_sceneGridService.InformNeighborsThatRegionisUp(RegionInfo); + } public void UnRegisterReginWithComms() { diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index 18ce34d..0355a1b 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs @@ -22,25 +22,48 @@ namespace OpenSim.Region.Environment.Scenes public event CloseAgentConnection OnCloseAgentConnection; public event PrimCrossing OnPrimCrossingIntoRegion; public event RegionUp OnRegionUp; - + public string _debugRegionName = ""; + + public string debugRegionName + { + get { return _debugRegionName; } + set + { + _debugRegionName = value; + + + + } + } public SceneCommunicationService(CommunicationsManager commsMan) { m_commsProvider = commsMan; + m_commsProvider.GridService.gdebugRegionName = _debugRegionName; + m_commsProvider.InterRegion.rdebugRegionName = _debugRegionName; } public void RegisterRegion(RegionInfo regionInfos) { m_regionInfo = regionInfos; regionCommsHost = m_commsProvider.GridService.RegisterRegion(m_regionInfo); + if (regionCommsHost != null) { + //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString()); + + regionCommsHost.debugRegionName = _debugRegionName; regionCommsHost.OnExpectUser += NewUserConnection; regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing; regionCommsHost.OnPrimCrossingIntoRegion += PrimCrossing; regionCommsHost.OnCloseAgentConnection += CloseConnection; regionCommsHost.OnRegionUp += newRegionUp; - + + + } + else + { + //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: registered with gridservice and got null"); } } @@ -70,6 +93,7 @@ namespace OpenSim.Region.Environment.Scenes { if (OnExpectUser != null) { + //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname); OnExpectUser(regionHandle, agent); } } @@ -78,6 +102,7 @@ namespace OpenSim.Region.Environment.Scenes { if (OnRegionUp != null) { + //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: newRegionUp Fired for User:" + region.RegionName); OnRegionUp(region); } return true; @@ -188,6 +213,7 @@ namespace OpenSim.Region.Environment.Scenes /// public virtual RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle) { + //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: Sending Grid Services Request about neighbor " + regionHandle.ToString()); return m_commsProvider.GridService.RequestNeighbourInfo(regionHandle); } @@ -275,6 +301,7 @@ namespace OpenSim.Region.Environment.Scenes public void InformNeighborsThatRegionisUp(RegionInfo region) { + //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); bool val = m_commsProvider.InterRegion.RegionUp(region); } diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index c28269e..eba45fc 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs @@ -214,6 +214,12 @@ namespace OpenSim.Region.Environment.Scenes } } + public void RestartCurrentScene() + { + ForEachCurrentScene(delegate(Scene scene) { scene.Restart(15); }); + + } + public void BackupCurrentScene() { ForEachCurrentScene(delegate(Scene scene) { scene.Backup(); }); -- cgit v1.1