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.
afrisby
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

@ -32,6 +32,7 @@ namespace OpenSim.Framework.Communications
{ {
public interface IGridServices public interface IGridServices
{ {
string gdebugRegionName { get; set; }
RegionCommsListener RegisterRegion(RegionInfo regionInfos); RegionCommsListener RegisterRegion(RegionInfo regionInfos);
bool DeregisterRegion(RegionInfo regionInfo); bool DeregisterRegion(RegionInfo regionInfo);
List<SimpleRegionInfo> RequestNeighbours(uint x, uint y); List<SimpleRegionInfo> RequestNeighbours(uint x, uint y);

View File

@ -31,6 +31,8 @@ namespace OpenSim.Framework.Communications
{ {
public interface IInterRegionCommunications public interface IInterRegionCommunications
{ {
string rdebugRegionName{ get; set; }
bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData); bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData);
bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData); bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData);
bool RegionUp(RegionInfo region); bool RegionUp(RegionInfo region);

View File

@ -43,6 +43,7 @@ namespace OpenSim.Framework
public event AcknowledgePrimCross OnAcknowledgePrimCrossed; public event AcknowledgePrimCross OnAcknowledgePrimCrossed;
public event CloseAgentConnection OnCloseAgentConnection; public event CloseAgentConnection OnCloseAgentConnection;
public event RegionUp OnRegionUp; public event RegionUp OnRegionUp;
public string debugRegionName="";
/// <summary> /// <summary>

View File

@ -39,6 +39,7 @@ using OpenSim.Framework;
namespace OpenSim.Framework namespace OpenSim.Framework
{ {
[Serializable]
public class SimpleRegionInfo public class SimpleRegionInfo
{ {
public SimpleRegionInfo() public SimpleRegionInfo()
@ -183,7 +184,7 @@ namespace OpenSim.Framework
} }
} }
} }
[Serializable]
public class RegionInfo : SimpleRegionInfo public class RegionInfo : SimpleRegionInfo
{ {
public string RegionName = ""; public string RegionName = "";

View File

@ -350,6 +350,7 @@ namespace OpenSim.Grid.GridServer
NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString(); NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString();
NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString(); NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString();
NeighbourBlock["UUID"] = aSim.Value.UUID.ToString(); NeighbourBlock["UUID"] = aSim.Value.UUID.ToString();
NeighbourBlock["regionHandle"] = aSim.Value.regionHandle.ToString();
if (aSim.Value.UUID != TheSim.UUID) if (aSim.Value.UUID != TheSim.UUID)
SimNeighboursData.Add(NeighbourBlock); SimNeighboursData.Add(NeighbourBlock);
@ -376,6 +377,7 @@ namespace OpenSim.Grid.GridServer
NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString(); NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString(); NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
NeighbourBlock["UUID"] = neighbour.UUID.ToString(); NeighbourBlock["UUID"] = neighbour.UUID.ToString();
NeighbourBlock["regionHandle"] = neighbour.regionHandle.ToString();
if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock); if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock);
} }
@ -438,6 +440,7 @@ namespace OpenSim.Grid.GridServer
responseData["region_locy"] = simData.regionLocY.ToString(); responseData["region_locy"] = simData.regionLocY.ToString();
responseData["region_UUID"] = simData.UUID.UUID.ToString(); responseData["region_UUID"] = simData.UUID.UUID.ToString();
responseData["region_name"] = simData.regionName; responseData["region_name"] = simData.regionName;
responseData["regionHandle"] = simData.regionHandle.ToString();
} }
XmlRpcResponse response = new XmlRpcResponse(); XmlRpcResponse response = new XmlRpcResponse();

View File

@ -722,6 +722,9 @@ namespace OpenSim
case "shutdown": case "shutdown":
Shutdown(); Shutdown();
break; break;
case "restart":
m_sceneManager.RestartCurrentScene();
break;
case "change-region": case "change-region":
if (cmdparams.Length > 0) if (cmdparams.Length > 0)

View File

@ -42,6 +42,28 @@ namespace OpenSim.Region.Communications.Local
private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>(); private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>();
public string _gdebugRegionName = "";
public string gdebugRegionName
{
get { return _gdebugRegionName; }
set
{
_gdebugRegionName = value;
}
}
public string _rdebugRegionName = "";
public string rdebugRegionName
{
get { return _rdebugRegionName; }
set
{
_rdebugRegionName = value;
}
}
public LocalBackEndServices() public LocalBackEndServices()
{ {
} }
@ -54,18 +76,36 @@ namespace OpenSim.Region.Communications.Local
public RegionCommsListener RegisterRegion(RegionInfo regionInfo) public RegionCommsListener RegisterRegion(RegionInfo regionInfo)
{ {
//Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering"); //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering");
if (!m_regions.ContainsKey( regionInfo.RegionHandle)) if (!m_regions.ContainsKey(regionInfo.RegionHandle))
{ {
//Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle ); //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle );
m_regions.Add(regionInfo.RegionHandle, regionInfo); m_regions.Add(regionInfo.RegionHandle, regionInfo);
RegionCommsListener regionHost = new RegionCommsListener(); RegionCommsListener regionHost = new RegionCommsListener();
if (m_regionListeners.ContainsKey(regionInfo.RegionHandle))
{
OpenSim.Framework.Console.MainLog.Instance.Error("INTERREGION", "Error:Region registered twice as an Events listener for Interregion Communications but not as a listed region. In Standalone mode this will cause BIG issues. In grid mode, it means a region went down and came back up.");
m_regionListeners.Remove(regionInfo.RegionHandle);
}
m_regionListeners.Add(regionInfo.RegionHandle, regionHost); m_regionListeners.Add(regionInfo.RegionHandle, regionHost);
return regionHost; return regionHost;
} }
else
{
// Already in our list, so the region went dead and restarted.
m_regions.Remove(regionInfo.RegionHandle);
OpenSim.Framework.Console.MainLog.Instance.Warn("INTERREGION", "Region registered twice. Region went down and came back up.");
//already in our list of regions so for now lets return null RegionCommsListener regionHost = new RegionCommsListener();
if (m_regionListeners.ContainsKey(regionInfo.RegionHandle))
{
m_regionListeners.Remove(regionInfo.RegionHandle);
}
m_regionListeners.Add(regionInfo.RegionHandle, regionHost);
return regionHost;
}
return null; return null;
} }
@ -168,7 +208,7 @@ namespace OpenSim.Region.Communications.Local
listener.TriggerRegionUp(region); listener.TriggerRegionUp(region);
} }
return true; return false;
} }
public bool TriggerRegionUp(RegionInfo region) public bool TriggerRegionUp(RegionInfo region)
@ -181,10 +221,14 @@ namespace OpenSim.Region.Communications.Local
//should change from agentCircuitData //should change from agentCircuitData
{ {
//Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent"); //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent");
//OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Trying to inform region of child agent: " + agentData.firstname + " " + agentData.lastname);
if (m_regionListeners.ContainsKey(regionHandle)) if (m_regionListeners.ContainsKey(regionHandle))
{ {
// Console.WriteLine("CommsManager- Informing a region to expect child agent"); // Console.WriteLine("CommsManager- Informing a region to expect child agent");
m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agentData); m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agentData);
//OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Got Listener trigginering local event: " + agentData.firstname + " " + agentData.lastname);
return true; return true;
} }
return false; return false;
@ -277,8 +321,12 @@ namespace OpenSim.Region.Communications.Local
public void TriggerExpectUser(ulong regionHandle, AgentCircuitData agent) public void TriggerExpectUser(ulong regionHandle, AgentCircuitData agent)
{ {
//OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Other region is sending child agent our way: " + agent.firstname + " " + agent.lastname);
if (m_regionListeners.ContainsKey(regionHandle)) if (m_regionListeners.ContainsKey(regionHandle))
{ {
//OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: FoundLocalRegion To send it to: " + agent.firstname + " " + agent.lastname);
m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agent); m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agent);
} }
} }
@ -327,8 +375,12 @@ namespace OpenSim.Region.Communications.Local
public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData)
{ {
// OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Other local region is sending child agent our way: " + agentData.firstname + " " + agentData.lastname);
if (m_regionListeners.ContainsKey(regionHandle)) if (m_regionListeners.ContainsKey(regionHandle))
{ {
//OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: found local region to trigger event on: " + agentData.firstname + " " + agentData.lastname);
TriggerExpectUser(regionHandle, agentData); TriggerExpectUser(regionHandle, agentData);
return true; return true;
} }

View File

@ -49,11 +49,33 @@ namespace OpenSim.Region.Communications.OGS1
{ {
private LocalBackEndServices m_localBackend = new LocalBackEndServices(); private LocalBackEndServices m_localBackend = new LocalBackEndServices();
private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>(); private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>();
private List<SimpleRegionInfo> m_knownRegions = new List<SimpleRegionInfo>();
public BaseHttpServer httpListener; public BaseHttpServer httpListener;
public NetworkServersInfo serversInfo; public NetworkServersInfo serversInfo;
public BaseHttpServer httpServer; public BaseHttpServer httpServer;
public string _gdebugRegionName = "";
public string gdebugRegionName
{
get { return _gdebugRegionName; }
set
{
_gdebugRegionName = value;
}
}
public string _rdebugRegionName = "";
public string rdebugRegionName
{
get { return _rdebugRegionName; }
set
{
_rdebugRegionName = value;
}
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -105,10 +127,19 @@ namespace OpenSim.Region.Communications.OGS1
// Process Response // Process Response
if (GridRespData.ContainsKey("error")) if (GridRespData.ContainsKey("error"))
{ {
string errorstring = (string) GridRespData["error"]; string errorstring = (string)GridRespData["error"];
MainLog.Instance.Error("Unable to connect to grid: " + errorstring); MainLog.Instance.Error("Unable to connect to grid: " + errorstring);
return null; return null;
} }
else
{
//m_knownRegions = RequestNeighbours(regionInfo.RegionLocX, regionInfo.RegionLocY);
}
//SimpleRegionInfo regiondata = new SimpleRegionInfo();
//regiondata.RegionID = griddatahash["UUID"];
//regiondata.RemotingAddress =
return m_localBackend.RegisterRegion(regionInfo); return m_localBackend.RegisterRegion(regionInfo);
} }
@ -155,7 +186,53 @@ namespace OpenSim.Region.Communications.OGS1
return neighbours; return neighbours;
} }
/// <summary>
///
/// </summary>
/// <param name="regionHandle"></param>
/// <returns></returns>
public RegionInfo RequestNeighbourInfo(LLUUID Region_UUID)
{
RegionInfo regionInfo;
Hashtable requestData = new Hashtable();
requestData["region_UUID"] = Region_UUID.ToStringHyphenated();
requestData["authkey"] = serversInfo.GridSendKey;
ArrayList SendParams = new ArrayList();
SendParams.Add(requestData);
XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams);
XmlRpcResponse GridResp = GridReq.Send(serversInfo.GridURL, 3000);
Hashtable responseData = (Hashtable)GridResp.Value;
if (responseData.ContainsKey("error"))
{
Console.WriteLine("error received from grid server" + responseData["error"]);
return null;
}
uint regX = Convert.ToUInt32((string)responseData["region_locx"]);
uint regY = Convert.ToUInt32((string)responseData["region_locy"]);
string internalIpStr = (string)responseData["sim_ip"];
uint port = Convert.ToUInt32(responseData["sim_port"]);
string externalUri = (string)responseData["sim_uri"];
IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int)port);
string neighbourExternalUri = externalUri;
regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr);
regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]);
regionInfo.RemotingAddress = internalIpStr;
regionInfo.RegionID = new LLUUID((string)responseData["region_UUID"]);
regionInfo.RegionName = (string)responseData["region_name"];
if (requestData.ContainsKey("regionHandle"))
{
m_remoteRegionInfoCache.Add(Convert.ToUInt64((string)requestData["regionHandle"]), regionInfo);
}
return regionInfo;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -381,7 +458,7 @@ namespace OpenSim.Region.Communications.OGS1
InterRegionSingleton.Instance.OnPrimGroupArrival += IncomingPrim; InterRegionSingleton.Instance.OnPrimGroupArrival += IncomingPrim;
InterRegionSingleton.Instance.OnPrimGroupNear += TriggerExpectPrimCrossing; InterRegionSingleton.Instance.OnPrimGroupNear += TriggerExpectPrimCrossing;
InterRegionSingleton.Instance.OnRegionUp += TriggerRegionUp; InterRegionSingleton.Instance.OnRegionUp += TriggerRegionUp;
InterRegionSingleton.Instance.OnRegionUp += RegionUp;
} }
#region Methods called by regions in this instance #region Methods called by regions in this instance
@ -427,7 +504,7 @@ namespace OpenSim.Region.Communications.OGS1
Console.WriteLine("remoting object not found"); Console.WriteLine("remoting object not found");
} }
remObject = null; remObject = null;
MainLog.Instance.Verbose("INTER", gdebugRegionName + ": OGS1 tried to InformRegionOfChildAgent for " + agentData.firstname + " " + agentData.lastname + " and got " + retValue.ToString());
return retValue; return retValue;
} }
@ -470,17 +547,27 @@ namespace OpenSim.Region.Communications.OGS1
// UGLY! // UGLY!
public bool RegionUp(RegionInfo region) public bool RegionUp(RegionInfo region)
{ {
RegionInfo regInfo = null;
try // This is stupid. For this to work, when the region registers it must request nearby map blocks.
// In addition to filling the map blocks, it fills a 'known regions' list.
// This known regions list then gets queried on here to get the remoting data from the neighbors.
// *Pull yourself up by your bootstraps?*
if (m_localBackend.RegionUp(region))
{ {
if (m_localBackend.RegionUp(region)) return true;
{ }
return true; return true;
} foreach (SimpleRegionInfo knownregion in m_knownRegions)
foreach (RegionInfo remoteInfo in m_remoteRegionInfoCache.Values) {
{ // Wha?
regInfo = RequestNeighbourInfo(remoteInfo.RegionHandle); RegionInfo regInfo = RequestNeighbourInfo(knownregion.RegionID);
if (regInfo != null)
try
{
if ((!(regInfo.Equals(null)) && regInfo.RemotingAddress.Length > 0))
{ {
//don't want to be creating a new link to the remote instance every time like we are here //don't want to be creating a new link to the remote instance every time like we are here
bool retValue = false; bool retValue = false;
@ -501,43 +588,41 @@ namespace OpenSim.Region.Communications.OGS1
Console.WriteLine("remoting object not found"); Console.WriteLine("remoting object not found");
} }
remObject = null; remObject = null;
//MainLog.Instance.Verbose("INTER", gdebugRegionName + ": OGS1 tried to NotifyRegionUp for " + region.RegionName + " and got " + retValue.ToString());
} }
} }
catch (RemotingException e)
{
return true; MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
} MainLog.Instance.Debug(e.ToString());
catch (RemotingException e) //return false;
{ }
MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); catch (SocketException e)
MainLog.Instance.Debug(e.ToString()); {
return false; MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
} MainLog.Instance.Debug(e.ToString());
catch (SocketException e) //return false;
{ }
MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); catch (InvalidCredentialException e)
MainLog.Instance.Debug(e.ToString()); {
return false; MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
} MainLog.Instance.Debug(e.ToString());
catch (InvalidCredentialException e) //return false;
{ }
MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); catch (AuthenticationException e)
MainLog.Instance.Debug(e.ToString()); {
return false; MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
} MainLog.Instance.Debug(e.ToString());
catch (AuthenticationException e) //return false;
{ }
MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); catch (Exception e)
MainLog.Instance.Debug(e.ToString()); {
return false; MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
} MainLog.Instance.Debug(e.ToString());
catch (Exception e) //return false;
{ }
MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
MainLog.Instance.Debug(e.ToString());
return false;
} }
return true; return true;
} }
@ -745,19 +830,23 @@ namespace OpenSim.Region.Communications.OGS1
/// <returns></returns> /// <returns></returns>
public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData)
{ {
//MainLog.Instance.Verbose("INTER", gdebugRegionName + ": Incoming OGS1 Agent " + agentData.firstname + " " + agentData.lastname);
try try
{ {
return m_localBackend.IncomingChildAgent(regionHandle, agentData); return m_localBackend.IncomingChildAgent(regionHandle, agentData);
} }
catch (RemotingException e) catch (RemotingException e)
{ {
MainLog.Instance.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString()); //MainLog.Instance.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString());
return false; return false;
} }
} }
public bool TriggerRegionUp(RegionInfo regionData) public bool TriggerRegionUp(RegionInfo regionData)
{ {
//MainLog.Instance.Verbose("INTER", gdebugRegionName + ": Incoming OGS1 RegionUpReport " + regionData.RegionName);
try try
{ {
return m_localBackend.TriggerRegionUp(regionData); return m_localBackend.TriggerRegionUp(regionData);

View File

@ -57,6 +57,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
#region Fields #region Fields
protected Timer m_heartbeatTimer = new Timer(); protected Timer m_heartbeatTimer = new Timer();
protected Timer m_restartWaitTimer = new Timer();
protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
public InnerScene m_innerScene; public InnerScene m_innerScene;
@ -210,6 +213,7 @@ namespace OpenSim.Region.Environment.Scenes
m_authenticateHandler = authen; m_authenticateHandler = authen;
CommsManager = commsMan; CommsManager = commsMan;
m_sceneGridService = sceneGridService; m_sceneGridService = sceneGridService;
m_sceneGridService.debugRegionName = regInfo.RegionName;
m_storageManager = storeManager; m_storageManager = storeManager;
AssetCache = assetCach; AssetCache = assetCach;
m_regInfo = regInfo; m_regInfo = regInfo;
@ -244,6 +248,8 @@ namespace OpenSim.Region.Environment.Scenes
httpListener = httpServer; httpListener = httpServer;
m_dumpAssetsToFile = dumpAssetsToFile; m_dumpAssetsToFile = dumpAssetsToFile;
// This function was moved to terrain for some kind of map hack by babble
RegisterRegionWithComms(); RegisterRegionWithComms();
} }
@ -262,29 +268,23 @@ namespace OpenSim.Region.Environment.Scenes
{ {
// Another region is up. We have to tell all our ScenePresences about it // Another region is up. We have to tell all our ScenePresences about it
// This fails to get the desired effect and needs further work. // This fails to get the desired effect and needs further work.
try if (RegionInfo.RegionHandle != otherRegion.RegionHandle)
{ {
if (!(m_regionRestartNotifyList.Contains(otherRegion)))
ForEachScenePresence(delegate(ScenePresence agent)
{ {
if (!(agent.IsChildAgent)) m_regionRestartNotifyList.Add(otherRegion);
{
this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); m_restartWaitTimer = new Timer(20000);
InformClientOfNeighbor(agent, otherRegion); 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; return true;
} }
public virtual void Restart(float seconds) public virtual void Restart(float seconds)
{ {
if (seconds < 100) if (seconds < 15)
{ {
t_restartTimer.Stop(); t_restartTimer.Stop();
SendGeneralAlert("Restart Aborted"); SendGeneralAlert("Restart Aborted");
@ -314,6 +314,7 @@ namespace OpenSim.Region.Environment.Scenes
else else
{ {
t_restartTimer.Stop(); t_restartTimer.Stop();
t_restartTimer.AutoReset = false;
MainLog.Instance.Error("REGION", "Closing"); MainLog.Instance.Error("REGION", "Closing");
Close(); Close();
MainLog.Instance.Error("REGION", "Firing Region Restart Message"); 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() public override void Close()
{ {
ForEachScenePresence(delegate(ScenePresence avatar) ForEachScenePresence(delegate(ScenePresence avatar)
@ -642,7 +671,11 @@ namespace OpenSim.Region.Environment.Scenes
} }
CreateTerrainTextureInitial(); 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) catch (Exception e)
{ {
@ -1073,13 +1106,17 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
public void RegisterRegionWithComms() 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.OnExpectUser += NewUserConnection;
m_sceneGridService.OnAvatarCrossingIntoRegion += AgentCrossing; m_sceneGridService.OnAvatarCrossingIntoRegion += AgentCrossing;
m_sceneGridService.OnCloseAgentConnection += CloseConnection; m_sceneGridService.OnCloseAgentConnection += CloseConnection;
m_sceneGridService.OnRegionUp += OtherRegionUp; m_sceneGridService.OnRegionUp += OtherRegionUp;
// Tell Other regions that I'm here. // Tell Other regions that I'm here.
m_sceneGridService.InformNeighborsThatRegionisUp(RegionInfo);
} }
public void UnRegisterReginWithComms() public void UnRegisterReginWithComms()
{ {

View File

@ -22,25 +22,48 @@ namespace OpenSim.Region.Environment.Scenes
public event CloseAgentConnection OnCloseAgentConnection; public event CloseAgentConnection OnCloseAgentConnection;
public event PrimCrossing OnPrimCrossingIntoRegion; public event PrimCrossing OnPrimCrossingIntoRegion;
public event RegionUp OnRegionUp; public event RegionUp OnRegionUp;
public string _debugRegionName = "";
public string debugRegionName
{
get { return _debugRegionName; }
set
{
_debugRegionName = value;
}
}
public SceneCommunicationService(CommunicationsManager commsMan) public SceneCommunicationService(CommunicationsManager commsMan)
{ {
m_commsProvider = commsMan; m_commsProvider = commsMan;
m_commsProvider.GridService.gdebugRegionName = _debugRegionName;
m_commsProvider.InterRegion.rdebugRegionName = _debugRegionName;
} }
public void RegisterRegion(RegionInfo regionInfos) public void RegisterRegion(RegionInfo regionInfos)
{ {
m_regionInfo = regionInfos; m_regionInfo = regionInfos;
regionCommsHost = m_commsProvider.GridService.RegisterRegion(m_regionInfo); regionCommsHost = m_commsProvider.GridService.RegisterRegion(m_regionInfo);
if (regionCommsHost != null) if (regionCommsHost != null)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString());
regionCommsHost.debugRegionName = _debugRegionName;
regionCommsHost.OnExpectUser += NewUserConnection; regionCommsHost.OnExpectUser += NewUserConnection;
regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing; regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing;
regionCommsHost.OnPrimCrossingIntoRegion += PrimCrossing; regionCommsHost.OnPrimCrossingIntoRegion += PrimCrossing;
regionCommsHost.OnCloseAgentConnection += CloseConnection; regionCommsHost.OnCloseAgentConnection += CloseConnection;
regionCommsHost.OnRegionUp += newRegionUp; 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) if (OnExpectUser != null)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname);
OnExpectUser(regionHandle, agent); OnExpectUser(regionHandle, agent);
} }
} }
@ -78,6 +102,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (OnRegionUp != null) if (OnRegionUp != null)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: newRegionUp Fired for User:" + region.RegionName);
OnRegionUp(region); OnRegionUp(region);
} }
return true; return true;
@ -188,6 +213,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <returns></returns> /// <returns></returns>
public virtual RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle) 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); return m_commsProvider.GridService.RequestNeighbourInfo(regionHandle);
} }
@ -275,6 +301,7 @@ namespace OpenSim.Region.Environment.Scenes
public void InformNeighborsThatRegionisUp(RegionInfo region) 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); 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() public void BackupCurrentScene()
{ {
ForEachCurrentScene(delegate(Scene scene) { scene.Backup(); }); ForEachCurrentScene(delegate(Scene scene) { scene.Backup(); });