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.
This commit is contained in:
Teravus Ovares
2007-11-27 13:46:52 +00:00
parent 959084f885
commit 082f2baebe
11 changed files with 293 additions and 71 deletions

View File

@@ -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<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
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<RegionInfo>();
}
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
/// </summary>
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()
{

View File

@@ -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
/// <returns></returns>
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);
}

View File

@@ -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(); });