From 7a9c85526cb99495bdd436150679941ef021b782 Mon Sep 17 00:00:00 2001
From: diva
Date: Sun, 14 Jun 2009 15:35:09 +0000
Subject: Pulled out HelloNeighbour into its own service, INeighbourService,
which may get more functions as we go along. It's a very simple service and
service connectors, and it served primarily to establish the design of
services that dependent on Scenes and that must always have a local
connector. More refactoring coming, as this showed how to do it right.
---
.../Resources/CoreModulePlugin.addin.xml | 2 +
.../Interregion/LocalInterregionComms.cs | 17 ---
.../Interregion/RESTInterregionComms.cs | 119 -----------------
.../Neighbour/LocalNeighbourServiceConnector.cs | 136 +++++++++++++++++++
.../Neighbour/RemoteNeighourServiceConnector.cs | 146 +++++++++++++++++++++
.../Framework/Interfaces/IInterregionComms.cs | 5 -
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +-
.../Framework/Scenes/SceneCommunicationService.cs | 16 ++-
8 files changed, 296 insertions(+), 147 deletions(-)
create mode 100644 OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs
create mode 100644 OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index 10e2ec2..bb67794 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -23,6 +23,8 @@
+
+
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs
index 5d2fc37..d2af2db 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs
@@ -258,23 +258,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
}
- /**
- * Region-related communications
- */
-
- public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
- {
- foreach (Scene s in m_sceneList)
- {
- if (s.RegionInfo.RegionHandle == regionHandle)
- {
- //m_log.Debug("[LOCAL COMMS]: Found region to SendHelloNeighbour");
- return s.IncomingHelloNeighbour(thisRegion);
- }
- }
- return false;
- }
-
#endregion /* IInterregionComms */
#region Misc
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs
index dd37d47..37305d5 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs
@@ -130,7 +130,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
{
m_aScene.CommsManager.HttpServer.AddHTTPHandler("/agent/", AgentHandler);
m_aScene.CommsManager.HttpServer.AddHTTPHandler("/object/", ObjectHandler);
- m_aScene.CommsManager.HttpServer.AddHTTPHandler("/region/", RegionHandler);
}
#endregion /* IRegionModule */
@@ -291,32 +290,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
return false;
}
- /**
- * Region-related communications
- */
-
- public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
- {
- // Try local first
- if (m_localBackend.SendHelloNeighbour(regionHandle, thisRegion))
- {
- //m_log.Debug("[REST COMMS]: LocalBackEnd SendHelloNeighbour succeeded");
- return true;
- }
-
- // else do the remote thing
- RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
- if ((regInfo != null) &&
- // Don't remote-call this instance; that's a startup hickup
- !((regInfo.ExternalHostName == thisRegion.ExternalHostName) && (regInfo.HttpPort == thisRegion.HttpPort)))
- {
- return m_regionClient.DoHelloNeighbourCall(regInfo, thisRegion);
- }
- //else
- // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
- return false;
- }
-
#endregion /* IInterregionComms */
#region Incoming calls from remote instances
@@ -702,98 +675,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
responsedata["str_response_string"] = result.ToString();
}
- /*
- * Region-related incoming calls
- *
- */
-
- public Hashtable RegionHandler(Hashtable request)
- {
- //m_log.Debug("[CONNECTION DEBUGGING]: RegionHandler Called");
-
- //m_log.Debug("---------------------------");
- //m_log.Debug(" >> uri=" + request["uri"]);
- //m_log.Debug(" >> content-type=" + request["content-type"]);
- //m_log.Debug(" >> http-method=" + request["http-method"]);
- //m_log.Debug("---------------------------\n");
-
- Hashtable responsedata = new Hashtable();
- responsedata["content_type"] = "text/html";
-
- UUID regionID;
- string action;
- ulong regionHandle;
- if (!GetParams((string)request["uri"], out regionID, out regionHandle, out action))
- {
- m_log.InfoFormat("[REST COMMS]: Invalid parameters for object message {0}", request["uri"]);
- responsedata["int_response_code"] = 404;
- responsedata["str_response_string"] = "false";
-
- return responsedata;
- }
-
- // Next, let's parse the verb
- string method = (string)request["http-method"];
- if (method.Equals("POST"))
- {
- DoRegionPost(request, responsedata, regionID);
- return responsedata;
- }
- //else if (method.Equals("PUT"))
- //{
- // DoRegionPut(request, responsedata, regionID);
- // return responsedata;
- //}
- //else if (method.Equals("DELETE"))
- //{
- // DoRegionDelete(request, responsedata, regiontID);
- // return responsedata;
- //}
- else
- {
- m_log.InfoFormat("[REST COMMS]: method {0} not supported in region message", method);
- responsedata["int_response_code"] = 404;
- responsedata["str_response_string"] = "false";
-
- return responsedata;
- }
-
- }
-
- protected virtual void DoRegionPost(Hashtable request, Hashtable responsedata, UUID id)
- {
- OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
- if (args == null)
- {
- responsedata["int_response_code"] = 400;
- responsedata["str_response_string"] = "false";
- return;
- }
-
- // retrieve the regionhandle
- ulong regionhandle = 0;
- if (args["destination_handle"] != null)
- UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
-
- RegionInfo aRegion = new RegionInfo();
- try
- {
- aRegion.UnpackRegionInfoData(args);
- }
- catch (Exception ex)
- {
- m_log.InfoFormat("[REST COMMS]: exception on unpacking HelloNeighbour message {0}", ex.Message);
- return;
- }
-
- // This is the meaning of POST region
- bool result = m_localBackend.SendHelloNeighbour(regionhandle, aRegion);
-
- responsedata["int_response_code"] = 200;
- responsedata["str_response_string"] = result.ToString();
- }
-
-
#endregion
#region Misc
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs
new file mode 100644
index 0000000..7f6186c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs
@@ -0,0 +1,136 @@
+/*
+ * 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 log4net;
+using Nini.Config;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using OpenSim.Framework;
+using OpenSim.Server.Base;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour
+{
+ public class LocalNeighbourServicesConnector :
+ ISharedRegionModule, INeighbourService
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
+ private List m_Scenes = new List();
+
+ private bool m_Enabled = false;
+
+ public LocalNeighbourServicesConnector()
+ {
+ }
+
+ public LocalNeighbourServicesConnector(List scenes)
+ {
+ m_Scenes = scenes;
+ }
+
+ #region ISharedRegionModule
+
+ public string Name
+ {
+ get { return "LocalNeighbourServicesConnector"; }
+ }
+
+ public void Initialise(IConfigSource source)
+ {
+ IConfig moduleConfig = source.Configs["Modules"];
+ if (moduleConfig != null)
+ {
+ string name = moduleConfig.GetString("NeighbourServices", this.Name);
+ if (name == Name)
+ {
+ // m_Enabled rules whether this module registers as INeighbourService or not
+ m_Enabled = true;
+ m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled");
+ }
+ }
+ }
+
+ public void Close()
+ {
+ }
+
+ public void AddRegion(Scene scene)
+ {
+ // Always add
+ m_Scenes.Add(scene);
+
+ if (!m_Enabled)
+ return;
+
+ scene.RegisterModuleInterface(this);
+ }
+
+ public void RegionLoaded(Scene scene)
+ {
+ m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled for region " + scene.RegionInfo.RegionName);
+ }
+
+ public void PostInitialise()
+ {
+ }
+
+ public void RemoveRegion(Scene scene)
+ {
+ // Always remove
+ if (m_Scenes.Contains(scene))
+ m_Scenes.Remove(scene);
+ }
+
+ #endregion ISharedRegionModule
+
+ #region INeighbourService
+
+ public bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
+ {
+ m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}",
+ thisRegion.RegionName, regionHandle, m_Scenes.Count);
+ foreach (Scene s in m_Scenes)
+ {
+ if (s.RegionInfo.RegionHandle == regionHandle)
+ {
+ m_log.Debug("[NEIGHBOUR CONNECTOR]: Found region to SendHelloNeighbour");
+ return s.IncomingHelloNeighbour(thisRegion);
+ }
+ }
+ m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: region handle {0} not found", regionHandle);
+ return false;
+ }
+
+ #endregion INeighbourService
+ }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs
new file mode 100644
index 0000000..b0bd428
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs
@@ -0,0 +1,146 @@
+/*
+ * 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 log4net;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Nini.Config;
+using OpenSim.Framework;
+using OpenSim.Services.Connectors;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using OpenSim.Server.Base;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour
+{
+ public class RemoteNeighbourServicesConnector :
+ NeighbourServicesConnector, ISharedRegionModule, INeighbourService
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
+ private bool m_Enabled = false;
+ private LocalNeighbourServicesConnector m_LocalService;
+ private string serviceDll;
+ private List m_Scenes = new List();
+
+ public string Name
+ {
+ get { return "RemoteNeighbourServicesConnector"; }
+ }
+
+ public void Initialise(IConfigSource source)
+ {
+ IConfig moduleConfig = source.Configs["Modules"];
+ if (moduleConfig != null)
+ {
+ string name = moduleConfig.GetString("NeighbourServices");
+ if (name == Name)
+ {
+ m_LocalService = new LocalNeighbourServicesConnector();
+
+ //IConfig neighbourConfig = source.Configs["NeighbourService"];
+ //if (neighbourConfig == null)
+ //{
+ // m_log.Error("[NEIGHBOUR CONNECTOR]: NeighbourService missing from OpenSim.ini");
+ // return;
+ //}
+ //serviceDll = neighbourConfig.GetString("LocalServiceModule", String.Empty);
+ //if (serviceDll == String.Empty)
+ //{
+ // m_log.Error("[NEIGHBOUR CONNECTOR]: No LocalServiceModule named in section NeighbourService");
+ // return;
+ //}
+
+ m_Enabled = true;
+
+ m_log.Info("[NEIGHBOUR CONNECTOR]: Remote Neighbour connector enabled");
+ }
+ }
+ }
+
+ public void PostInitialise()
+ {
+ //if (m_Enabled)
+ //{
+ // Object[] args = new Object[] { m_Scenes };
+ // m_LocalService =
+ // ServerUtils.LoadPlugin(serviceDll,
+ // args);
+
+ // if (m_LocalService == null)
+ // {
+ // m_log.Error("[NEIGHBOUR CONNECTOR]: Can't load neighbour service");
+ // Unregister();
+ // return;
+ // }
+ //}
+ }
+
+ public void Close()
+ {
+ }
+
+ public void AddRegion(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ scene.RegisterModuleInterface(this);
+ }
+
+ public void RemoveRegion(Scene scene)
+ {
+ if (m_Enabled && m_Scenes.Contains(scene))
+ m_Scenes.Remove(scene);
+ }
+
+ public void RegionLoaded(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ m_log.InfoFormat("[NEIGHBOUR CONNECTOR]: Enabled remote neighbours for region {0}", scene.RegionInfo.RegionName);
+
+ }
+
+ #region INeighbourService
+
+ public override bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
+ {
+ if (m_LocalService.HelloNeighbour(regionHandle, thisRegion))
+ return true;
+
+ return base.HelloNeighbour(regionHandle, thisRegion);
+ }
+
+ #endregion INeighbourService
+ }
+}
diff --git a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
index d239ef4..8f4d3d5 100644
--- a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
@@ -100,11 +100,6 @@ namespace OpenSim.Region.Framework.Interfaces
#endregion Objects
- #region Regions
-
- bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion);
-
- #endregion Regions
}
// This may not be needed, but having it here for now.
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 5349d87..d3437b9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1198,7 +1198,7 @@ namespace OpenSim.Region.Framework.Scenes
// These two 'commands' *must be* next to each other or sim rebooting fails.
m_sceneGridService.RegisterRegion(m_interregionCommsOut, RegionInfo);
- m_sceneGridService.InformNeighborsThatRegionisUp(RegionInfo);
+ m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface(), RegionInfo);
Dictionary dGridSettings = m_sceneGridService.GetGridSettings();
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 8cc5cd8..833f804 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -39,6 +39,7 @@ using OpenSim.Framework.Communications;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Communications.Capabilities;
using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Services.Interfaces;
using OSD = OpenMetaverse.StructuredData.OSD;
namespace OpenSim.Region.Framework.Scenes
@@ -485,7 +486,7 @@ namespace OpenSim.Region.Framework.Scenes
#endregion
- public delegate void InformNeighbourThatRegionUpDelegate(RegionInfo region, ulong regionhandle);
+ public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle);
private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar)
{
@@ -498,7 +499,7 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- private void InformNeighboursThatRegionIsUpAsync(RegionInfo region, ulong regionhandle)
+ private void InformNeighboursThatRegionIsUpAsync(INeighbourService neighbourService, RegionInfo region, ulong regionhandle)
{
m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here");
//RegionUpData regiondata = new RegionUpData(region.RegionLocX, region.RegionLocY, region.ExternalHostName, region.InternalEndPoint.Port);
@@ -506,7 +507,12 @@ namespace OpenSim.Region.Framework.Scenes
//bool regionAccepted =
// m_commsProvider.InterRegion.RegionUp(new SerializableRegionInfo(region), regionhandle);
- bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region);
+ //bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region);
+ bool regionAccepted = false;
+ if (neighbourService != null)
+ regionAccepted = neighbourService.HelloNeighbour(regionhandle, region);
+ else
+ m_log.DebugFormat("[SCS]: No neighbour service provided for informing neigbhours of this region");
if (regionAccepted)
{
@@ -527,7 +533,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Called by scene when region is initialized (not always when it's listening for agents)
/// This is an inter-region message that informs the surrounding neighbors that the sim is up.
///
- public void InformNeighborsThatRegionisUp(RegionInfo region)
+ public void InformNeighborsThatRegionisUp(INeighbourService neighbourService, RegionInfo region)
{
//m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
@@ -541,7 +547,7 @@ namespace OpenSim.Region.Framework.Scenes
{
InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync;
- d.BeginInvoke(region, neighbours[i].RegionHandle,
+ d.BeginInvoke(neighbourService, region, neighbours[i].RegionHandle,
InformNeighborsThatRegionisUpCompleted,
d);
}
--
cgit v1.1