From 5757afe7665543e8b3ed4a322a7d6e095dafcdb3 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 26 Sep 2009 07:48:21 -0700 Subject: First pass at the heart surgery for grid services. Compiles and runs minimally. A few bugs to catch now. --- .../ServiceConnectorsOut/Grid/HGGridConnector.cs | 28 ++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index 0c2a835..b5bade6 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -47,7 +47,7 @@ using Nini.Config; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid { - public class HGGridConnector : ISharedRegionModule, IGridService + public class HGGridConnector : ISharedRegionModule, IGridService, IHyperlinkService { private static readonly ILog m_log = LogManager.GetLogger( @@ -142,6 +142,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid return; scene.RegisterModuleInterface(this); + scene.RegisterModuleInterface(this); } @@ -367,10 +368,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid } #endregion - #region Hyperlinks + #region IHyperlinkService private static Random random = new Random(); + public GridRegion TryLinkRegionToCoords(Scene m_scene, IClientAPI client, string mapName, int xloc, int yloc) { string host = "127.0.0.1"; @@ -417,6 +419,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid return null; } + // From the map search and secondlife://blah public GridRegion TryLinkRegion(Scene m_scene, IClientAPI client, string mapName) { @@ -554,6 +557,27 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid return true; } + public GridRegion TryLinkRegion(IClientAPI client, string regionDescriptor) + { + return TryLinkRegion((Scene)client.Scene, client, regionDescriptor); + } + + public GridRegion GetHyperlinkRegion(ulong handle) + { + foreach (GridRegion r in m_HyperlinkRegions.Values) + if (r.RegionHandle == handle) + return r; + return null; + } + + public ulong FindRegionHandle(ulong handle) + { + foreach (GridRegion r in m_HyperlinkRegions.Values) + if ((r.RegionHandle == handle) && (m_HyperlinkHandles.ContainsKey(r.RegionID))) + return m_HyperlinkHandles[r.RegionID]; + return 0; + } + #endregion } -- cgit v1.1 From d39e67d5b2ca974e7e2506bcb717ec25ae061e75 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 26 Sep 2009 08:06:14 -0700 Subject: More redirects to HGGridConnector-as-HyperlinkService. --- .../Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index b5bade6..66cde91 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -567,6 +567,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid foreach (GridRegion r in m_HyperlinkRegions.Values) if (r.RegionHandle == handle) return r; + foreach (GridRegion r in m_knownRegions.Values) + if (r.RegionHandle == handle) + return r; return null; } @@ -575,7 +578,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid foreach (GridRegion r in m_HyperlinkRegions.Values) if ((r.RegionHandle == handle) && (m_HyperlinkHandles.ContainsKey(r.RegionID))) return m_HyperlinkHandles[r.RegionID]; - return 0; + return handle; } #endregion -- cgit v1.1 From dcfd08b8dd57e667db8e0b5900da4648a020160e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 26 Sep 2009 11:01:18 -0700 Subject: Fixed a bug with link-region. --- .../ServiceConnectorsOut/Grid/HGCommands.cs | 6 ++--- .../ServiceConnectorsOut/Grid/HGGridConnector.cs | 31 ++++++---------------- 2 files changed, 11 insertions(+), 26 deletions(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs index 36915ef..0974372 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs @@ -86,7 +86,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid private void RunHGCommand(string command, string[] cmdparams) { - if (command.Equals("linkk-mapping")) + if (command.Equals("link-mapping")) { if (cmdparams.Length == 2) { @@ -104,7 +104,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid } } } - else if (command.Equals("linkk-region")) + else if (command.Equals("link-region")) { if (cmdparams.Length < 3) { @@ -187,7 +187,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid } return; } - else if (command.Equals("unlinkk-region")) + else if (command.Equals("unlink-region")) { if (cmdparams.Length < 1) { diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index 66cde91..0bb4206 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -159,27 +159,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid { m_HypergridServiceConnector = new HypergridServiceConnector(scene.AssetService); HGCommands hgCommands = new HGCommands(this, scene); - MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "linkk-region", + MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "link-region", "link-region :[:] ", "Link a hypergrid region", hgCommands.RunCommand); - MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "unlinkk-region", + MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "unlink-region", "unlink-region or : ", "Unlink a hypergrid region", hgCommands.RunCommand); - MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "linkk-mapping", "link-mapping [ ] ", + MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "link-mapping", "link-mapping [ ] ", "Set local coordinate to map HG regions to", hgCommands.RunCommand); m_Initialized = true; } - - - //scene.AddCommand("HGGridServicesConnector", "linkk-region", - // "link-region :[:] ", - // "Link a hypergrid region", hgCommands.RunCommand); - //scene.AddCommand("HGGridServicesConnector", "unlinkk-region", - // "unlink-region or : ", - // "Unlink a hypergrid region", hgCommands.RunCommand); - //scene.AddCommand("HGGridServicesConnector", "linkk-mapping", "link-mapping [ ] ", - // "Set local coordinate to map HG regions to", hgCommands.RunCommand); - } #endregion @@ -450,15 +439,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid } // Finally, link it - try - { - RegisterRegion(UUID.Zero, regInfo); - } - catch (Exception e) - { - m_log.Warn("[HGrid]: Unable to link region: " + e.Message); - return false; - } + if (!RegisterRegion(UUID.Zero, regInfo)) + { + m_log.Warn("[HGrid]: Unable to link region"); + return false; + } int x, y; if (!Check4096(m_scene, regInfo, out x, out y)) -- cgit v1.1 From f4bf581b96347b8d7f115eca74fa84a644eb729c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 26 Sep 2009 21:00:51 -0700 Subject: Moved all HG1 operations to HGGridConnector.cs and HypergridServerConnector.cs/HypergridServiceConnector.cs, away from Region.Communications and HGNetworkServersInfo. Fixed small bugs with hyperlinked regions' map positions. --- .../ServiceConnectorsOut/Grid/HGGridConnector.cs | 227 ++++++++++++++++++++- 1 file changed, 221 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index 0bb4206..52db400 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -31,6 +31,7 @@ using System.Net; using System.Reflection; using System.Xml; +using OpenSim.Framework.Communications.Cache; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -52,10 +53,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid private static readonly ILog m_log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); + private static string LocalAssetServerURI, LocalInventoryServerURI, LocalUserServerURI; private bool m_Enabled = false; private bool m_Initialized = false; + private Scene m_aScene; + private Dictionary m_LocalScenes = new Dictionary(); + private IGridService m_GridServiceConnector; private HypergridServiceConnector m_HypergridServiceConnector; @@ -141,6 +146,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (!m_Enabled) return; + m_LocalScenes[scene.RegionInfo.RegionHandle] = scene; scene.RegisterModuleInterface(this); scene.RegisterModuleInterface(this); @@ -148,6 +154,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void RemoveRegion(Scene scene) { + m_LocalScenes.Remove(scene.RegionInfo.RegionHandle); } public void RegionLoaded(Scene scene) @@ -157,7 +164,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (!m_Initialized) { + m_aScene = scene; + LocalAssetServerURI = m_aScene.CommsManager.NetworkServersInfo.UserURL; + LocalInventoryServerURI = m_aScene.CommsManager.NetworkServersInfo.InventoryURL; + LocalUserServerURI = m_aScene.CommsManager.NetworkServersInfo.UserURL; + m_HypergridServiceConnector = new HypergridServiceConnector(scene.AssetService); + HGCommands hgCommands = new HGCommands(this, scene); MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "link-region", "link-region :[:] ", @@ -167,6 +180,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid "Unlink a hypergrid region", hgCommands.RunCommand); MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "link-mapping", "link-mapping [ ] ", "Set local coordinate to map HG regions to", hgCommands.RunCommand); + + // Yikes!! Remove this as soon as user services get refactored + HGNetworkServersInfo.Init(LocalAssetServerURI, LocalInventoryServerURI, LocalUserServerURI); + m_Initialized = true; } } @@ -240,7 +257,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid // Try the foreign users home collection foreach (GridRegion r in m_knownRegions.Values) if (r.RegionID == regionID) - return m_knownRegions[regionID]; + return r; // Finally, try the normal route return m_GridServiceConnector.GetRegionByUUID(scopeID, regionID); @@ -261,7 +278,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid foreach (GridRegion r in m_knownRegions.Values) { if ((r.RegionLocX == snapX) && (r.RegionLocY == snapY)) + { return r; + } } // Finally, try the normal route @@ -328,8 +347,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle) { - m_HyperlinkRegions.Add(regionInfo.RegionID, regionInfo); - m_HyperlinkHandles.Add(regionInfo.RegionID, regionHandle); + m_HyperlinkRegions[regionInfo.RegionID] = regionInfo; + m_HyperlinkHandles[regionInfo.RegionID] = regionHandle; } private void RemoveHyperlinkRegion(UUID regionID) @@ -340,8 +359,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid private void AddHyperlinkHomeRegion(UUID userID, GridRegion regionInfo, ulong regionHandle) { - m_knownRegions.Add(userID, regionInfo); - m_HyperlinkHandles.Add(regionInfo.RegionID, regionHandle); + m_knownRegions[userID] = regionInfo; + m_HyperlinkHandles[regionInfo.RegionID] = regionHandle; } private void RemoveHyperlinkHomeRegion(UUID regionID) @@ -412,7 +431,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid // From the map search and secondlife://blah public GridRegion TryLinkRegion(Scene m_scene, IClientAPI client, string mapName) { - int xloc = random.Next(0, Int16.MaxValue); + int xloc = random.Next(0, Int16.MaxValue) * (int) Constants.RegionSize; return TryLinkRegionToCoords(m_scene, client, mapName, xloc, 0); } @@ -563,10 +582,206 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid foreach (GridRegion r in m_HyperlinkRegions.Values) if ((r.RegionHandle == handle) && (m_HyperlinkHandles.ContainsKey(r.RegionID))) return m_HyperlinkHandles[r.RegionID]; + + foreach (GridRegion r in m_knownRegions.Values) + if ((r.RegionHandle == handle) && (m_HyperlinkHandles.ContainsKey(r.RegionID))) + return m_HyperlinkHandles[r.RegionID]; + return handle; } + public bool SendUserInformation(GridRegion regInfo, AgentCircuitData agentData) + { + CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(agentData.AgentID); + + if ((IsLocalUser(uinfo) && (GetHyperlinkRegion(regInfo.RegionHandle) != null)) || + (!IsLocalUser(uinfo) && !IsGoingHome(uinfo, regInfo))) + { + m_log.Info("[HGrid]: Local user is going to foreign region or foreign user is going elsewhere"); + + // Set the position of the region on the remote grid + ulong realHandle = FindRegionHandle(regInfo.RegionHandle); + uint x = 0, y = 0; + Utils.LongToUInts(regInfo.RegionHandle, out x, out y); + GridRegion clonedRegion = new GridRegion(regInfo); + clonedRegion.RegionLocX = (int)x; + clonedRegion.RegionLocY = (int)y; + + // Get the user's home region information + GridRegion home = m_aScene.GridService.GetRegionByUUID(m_aScene.RegionInfo.ScopeID, uinfo.UserProfile.HomeRegionID); + + // Get the user's service URLs + string serverURI = ""; + if (uinfo.UserProfile is ForeignUserProfileData) + serverURI = Util.ServerURI(((ForeignUserProfileData)uinfo.UserProfile).UserServerURI); + string userServer = (serverURI == "") || (serverURI == null) ? LocalUserServerURI : serverURI; + + string assetServer = Util.ServerURI(uinfo.UserProfile.UserAssetURI); + if ((assetServer == null) || (assetServer == "")) + assetServer = LocalAssetServerURI; + + string inventoryServer = Util.ServerURI(uinfo.UserProfile.UserInventoryURI); + if ((inventoryServer == null) || (inventoryServer == "")) + inventoryServer = LocalInventoryServerURI; + + if (!m_HypergridServiceConnector.InformRegionOfUser(clonedRegion, agentData, home, userServer, assetServer, inventoryServer)) + { + m_log.Warn("[HGrid]: Could not inform remote region of transferring user."); + return false; + } + } + //if ((uinfo == null) || !IsGoingHome(uinfo, regInfo)) + //{ + // m_log.Info("[HGrid]: User seems to be going to foreign region."); + // if (!InformRegionOfUser(regInfo, agentData)) + // { + // m_log.Warn("[HGrid]: Could not inform remote region of transferring user."); + // return false; + // } + //} + //else + // m_log.Info("[HGrid]: User seems to be going home " + uinfo.UserProfile.FirstName + " " + uinfo.UserProfile.SurName); + + // May need to change agent's name + if (IsLocalUser(uinfo) && (GetHyperlinkRegion(regInfo.RegionHandle) != null)) + { + agentData.firstname = agentData.firstname + "." + agentData.lastname; + agentData.lastname = "@" + LocalUserServerURI.Replace("http://", ""); ; //HGNetworkServersInfo.Singleton.LocalUserServerURI; + } + + return true; + } + + public void AdjustUserInformation(AgentCircuitData agentData) + { + CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(agentData.AgentID); + if ((uinfo != null) && (uinfo.UserProfile != null) && + (IsLocalUser(uinfo) || !(uinfo.UserProfile is ForeignUserProfileData))) + { + //m_log.Debug("---------------> Local User!"); + string[] parts = agentData.firstname.Split(new char[] { '.' }); + if (parts.Length == 2) + { + agentData.firstname = parts[0]; + agentData.lastname = parts[1]; + } + } + //else + // m_log.Debug("---------------> Foreign User!"); + } + + // Check if a local user exists with the same UUID as the incoming foreign user + public bool CheckUserAtEntry(UUID userID, UUID sessionID, out bool comingHome) + { + comingHome = false; + if (!m_aScene.SceneGridService.RegionLoginsEnabled) + return false; + + CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(userID); + if (uinfo != null) + { + // uh-oh we have a potential intruder + if (uinfo.SessionID != sessionID) + // can't have a foreigner with a local UUID + return false; + else + // oh, so it's you! welcome back + comingHome = true; + } + + // OK, user can come in + return true; + } + + public void AcceptUser(ForeignUserProfileData user, GridRegion home) + { + m_aScene.CommsManager.UserProfileCacheService.PreloadUserCache(user); + ulong realHandle = home.RegionHandle; + // Change the local coordinates + // X=0 on the map + home.RegionLocX = 0; + home.RegionLocY = random.Next(0, 10000) * (int)Constants.RegionSize; + + AddHyperlinkHomeRegion(user.ID, home, realHandle); + + DumpUserData(user); + DumpRegionData(home); + + } + + public bool IsLocalUser(UUID userID) + { + CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(userID); + return IsLocalUser(uinfo); + } + #endregion + #region IHyperlink Misc + + protected bool IsComingHome(ForeignUserProfileData userData) + { + return (userData.UserServerURI == LocalUserServerURI); + } + + // Is the user going back to the home region or the home grid? + protected bool IsGoingHome(CachedUserInfo uinfo, GridRegion rinfo) + { + if (uinfo.UserProfile == null) + return false; + + if (!(uinfo.UserProfile is ForeignUserProfileData)) + // it's a home user, can't be outside to return home + return false; + + // OK, it's a foreign user with a ForeignUserProfileData + // and is going back to exactly the home region. + // We can't check if it's going back to a non-home region + // of the home grid. That will be dealt with in the + // receiving end + return (uinfo.UserProfile.HomeRegionID == rinfo.RegionID); + } + + protected bool IsLocalUser(CachedUserInfo uinfo) + { + if (uinfo == null) + return false; + + return !(uinfo.UserProfile is ForeignUserProfileData); + + } + + protected bool IsLocalRegion(ulong handle) + { + return m_LocalScenes.ContainsKey(handle); + } + + private void DumpUserData(ForeignUserProfileData userData) + { + m_log.Info(" ------------ User Data Dump ----------"); + m_log.Info(" >> Name: " + userData.FirstName + " " + userData.SurName); + m_log.Info(" >> HomeID: " + userData.HomeRegionID); + m_log.Info(" >> UserServer: " + userData.UserServerURI); + m_log.Info(" >> InvServer: " + userData.UserInventoryURI); + m_log.Info(" >> AssetServer: " + userData.UserAssetURI); + m_log.Info(" ------------ -------------- ----------"); + } + + private void DumpRegionData(GridRegion rinfo) + { + m_log.Info(" ------------ Region Data Dump ----------"); + m_log.Info(" >> handle: " + rinfo.RegionHandle); + m_log.Info(" >> coords: " + rinfo.RegionLocX + ", " + rinfo.RegionLocY); + m_log.Info(" >> external host name: " + rinfo.ExternalHostName); + m_log.Info(" >> http port: " + rinfo.HttpPort); + m_log.Info(" >> external EP address: " + rinfo.ExternalEndPoint.Address); + m_log.Info(" >> external EP port: " + rinfo.ExternalEndPoint.Port); + m_log.Info(" ------------ -------------- ----------"); + } + + + #endregion + + } } -- cgit v1.1 From 2432cc607ec206b79149c1e9b1aa995794fec3bc Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 27 Sep 2009 13:43:57 -0700 Subject: Neighbours cache working. --- .../ServiceConnectorsOut/Grid/HGGridConnector.cs | 4 ++ .../Grid/LocalGridServiceConnector.cs | 54 ++++++++++++++++++++-- .../ServiceConnectorsOut/Grid/RegionCache.cs | 52 +++++++++++++++++++++ .../Grid/RemoteGridServiceConnector.cs | 19 ++++++-- 4 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index 52db400..c8062d7 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -135,6 +135,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void PostInitialise() { + ((ISharedRegionModule)m_GridServiceConnector).PostInitialise(); } public void Close() @@ -150,11 +151,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid scene.RegisterModuleInterface(this); scene.RegisterModuleInterface(this); + ((ISharedRegionModule)m_GridServiceConnector).AddRegion(scene); + } public void RemoveRegion(Scene scene) { m_LocalScenes.Remove(scene.RegionInfo.RegionHandle); + ((ISharedRegionModule)m_GridServiceConnector).RemoveRegion(scene); } public void RegionLoaded(Scene scene) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs index 743d3b9..6c2928a 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs @@ -31,6 +31,7 @@ using System; using System.Collections.Generic; using System.Reflection; using OpenSim.Framework; +using OpenSim.Framework.Console; using OpenSim.Server.Base; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -47,7 +48,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); + private static LocalGridServicesConnector m_MainInstance; + private IGridService m_GridService; + private Dictionary m_LocalCache = new Dictionary(); private bool m_Enabled = false; @@ -58,6 +62,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public LocalGridServicesConnector(IConfigSource source) { m_log.Debug("[LOCAL GRID CONNECTOR]: LocalGridServicesConnector instantiated"); + m_MainInstance = this; InitialiseService(source); } @@ -82,6 +87,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (name == Name) { InitialiseService(source); + m_MainInstance = this; m_Enabled = true; m_log.Info("[LOCAL GRID CONNECTOR]: Local grid connector enabled"); } @@ -120,6 +126,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void PostInitialise() { + if (m_MainInstance == this) + { + MainConsole.Instance.Commands.AddCommand("LocalGridConnector", false, "show neighbours", + "show neighbours", + "Shows the local regions' neighbours", NeighboursCommand); + } } public void Close() @@ -128,14 +140,26 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void AddRegion(Scene scene) { - if (!m_Enabled) - return; + if (m_Enabled) + scene.RegisterModuleInterface(this); + + if (m_MainInstance == this) + { + if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID)) + m_log.ErrorFormat("[LOCAL GRID CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!"); + else + m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene)); - scene.RegisterModuleInterface(this); + } } public void RemoveRegion(Scene scene) { + if (m_MainInstance == this) + { + m_LocalCache[scene.RegionInfo.RegionID].Clear(); + m_LocalCache.Remove(scene.RegionInfo.RegionID); + } } public void RegionLoaded(Scene scene) @@ -158,7 +182,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public List GetNeighbours(UUID scopeID, UUID regionID) { - return m_GridService.GetNeighbours(scopeID, regionID); + if (m_LocalCache.ContainsKey(regionID)) + { + return m_LocalCache[regionID].GetNeighbours(); + } + else + { + m_log.WarnFormat("[LOCAL GRID CONNECTOR]: GetNeighbours: Requested region {0} is not on this sim", regionID); + return new List(); + } + + // Don't go to the DB + //return m_GridService.GetNeighbours(scopeID, regionID); } public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID) @@ -187,5 +222,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid } #endregion + + public void NeighboursCommand(string module, string[] cmdparams) + { + foreach (KeyValuePair kvp in m_LocalCache) + { + m_log.InfoFormat("*** Neighbours of {0} {1} ***", kvp.Key, kvp.Value.RegionName); + List regions = kvp.Value.GetNeighbours(); + foreach (GridRegion r in regions) + m_log.InfoFormat(" {0} @ {1}={2}", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize); + } + } } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs new file mode 100644 index 0000000..ea205a2 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; + +using log4net; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid +{ + public class RegionCache + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + private Scene m_scene; + private Dictionary m_neighbours = new Dictionary(); + + public string RegionName + { + get { return m_scene.RegionInfo.RegionName; } + } + + public RegionCache(Scene s) + { + m_scene = s; + m_scene.EventManager.OnRegionUp += OnRegionUp; + } + + private void OnRegionUp(GridRegion otherRegion) + { + m_log.DebugFormat("[REGION CACHE]: (on region {0}) Region {1} is up @ {2}-{3}", + m_scene.RegionInfo.RegionName, otherRegion.RegionName, otherRegion.RegionLocX, otherRegion.RegionLocY); + + m_neighbours[otherRegion.RegionHandle] = otherRegion; + } + + public void Clear() + { + m_scene.EventManager.OnRegionUp -= OnRegionUp; + m_neighbours.Clear(); + } + + public List GetNeighbours() + { + return new List(m_neighbours.Values); + } + } +} diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs index 91a808b..72c00fc 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs @@ -104,6 +104,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void PostInitialise() { + if (m_LocalGridService != null) + ((ISharedRegionModule)m_LocalGridService).PostInitialise(); } public void Close() @@ -112,14 +114,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void AddRegion(Scene scene) { - if (!m_Enabled) - return; + if (m_Enabled) + scene.RegisterModuleInterface(this); - scene.RegisterModuleInterface(this); + if (m_LocalGridService != null) + ((ISharedRegionModule)m_LocalGridService).AddRegion(scene); } public void RemoveRegion(Scene scene) { + if (m_LocalGridService != null) + ((ISharedRegionModule)m_LocalGridService).RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -146,7 +151,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid return false; } - // Let's not override GetNeighbours -- let's get them all from the grid server + // Let's override GetNeighbours completely -- never go to the grid server + // Neighbours are/should be cached locally + // For retrieval from the DB, caller should call GetRegionByPosition + public override List GetNeighbours(UUID scopeID, UUID regionID) + { + return m_LocalGridService.GetNeighbours(scopeID, regionID); + } public override GridRegion GetRegionByUUID(UUID scopeID, UUID regionID) { -- cgit v1.1 From 689eea3bad7a7dd7fa8dfdacacd891e1d390e51e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 27 Sep 2009 15:06:44 -0700 Subject: Guarding the methods under if (m_Enabled) --- .../CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index c8062d7..1eb481e 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -135,7 +135,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void PostInitialise() { - ((ISharedRegionModule)m_GridServiceConnector).PostInitialise(); + if (m_Enabled) + ((ISharedRegionModule)m_GridServiceConnector).PostInitialise(); } public void Close() @@ -157,8 +158,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public void RemoveRegion(Scene scene) { - m_LocalScenes.Remove(scene.RegionInfo.RegionHandle); - ((ISharedRegionModule)m_GridServiceConnector).RemoveRegion(scene); + if (m_Enabled) + { + m_LocalScenes.Remove(scene.RegionInfo.RegionHandle); + ((ISharedRegionModule)m_GridServiceConnector).RemoveRegion(scene); + } } public void RegionLoaded(Scene scene) -- cgit v1.1 From f00126dc2dfc9e23aa50227f02ee9adbe1efdfa6 Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Tue, 29 Sep 2009 08:32:59 +0900 Subject: Add copyright header. Formatting cleanup. --- .../ServiceConnectorsOut/Grid/RegionCache.cs | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs index ea205a2..2b336bb 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs @@ -1,4 +1,31 @@ -using System; +/* + * 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 System; using System.Collections.Generic; using System.Reflection; -- cgit v1.1 From 4eca59ec13bb48309120fea24890341c65157c65 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 28 Sep 2009 17:33:34 -0700 Subject: Improved the Local grid connector to fetch data from the DB when it doesn't find it in the cache. Commented out the Standalone teleport test because it's failing, and the scene setup is very confusing. I suspect it may be wrong -- the connectors-as-ISharedRegionModules are being instantiated several times when there are several scenes. --- .../ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs | 7 +++++-- .../ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs index 6c2928a..3ca4882 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs @@ -149,7 +149,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid m_log.ErrorFormat("[LOCAL GRID CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!"); else m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene)); - } } @@ -184,7 +183,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid { if (m_LocalCache.ContainsKey(regionID)) { - return m_LocalCache[regionID].GetNeighbours(); + List neighbours = m_LocalCache[regionID].GetNeighbours(); + if (neighbours.Count == 0) + // try the DB + neighbours = m_GridService.GetNeighbours(scopeID, regionID); + return neighbours; } else { diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs index be32d6b..2ca90f8 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs @@ -78,6 +78,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests r1.ExternalHostName = "127.0.0.1"; r1.HttpPort = 9001; r1.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0); + Scene s = new Scene(new RegionInfo()); + s.RegionInfo.RegionID = r1.RegionID; + m_LocalConnector.AddRegion(s); + GridRegion r2 = new GridRegion(); r2.RegionName = "Test Region 2"; @@ -87,6 +91,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests r2.ExternalHostName = "127.0.0.1"; r2.HttpPort = 9002; r2.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0); + s = new Scene(new RegionInfo()); + s.RegionInfo.RegionID = r1.RegionID; + m_LocalConnector.AddRegion(s); GridRegion r3 = new GridRegion(); r3.RegionName = "Test Region 3"; @@ -96,6 +103,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests r3.ExternalHostName = "127.0.0.1"; r3.HttpPort = 9003; r3.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0); + s = new Scene(new RegionInfo()); + s.RegionInfo.RegionID = r1.RegionID; + m_LocalConnector.AddRegion(s); m_LocalConnector.RegisterRegion(UUID.Zero, r1); GridRegion result = m_LocalConnector.GetRegionByName(UUID.Zero, "Test"); -- cgit v1.1 From 95981776dda88f97c4a1d016e1e266e8ff1d54aa Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 28 Sep 2009 20:11:10 -0700 Subject: Fixed bug in Check4096 (HG). --- .../Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index 1eb481e..148331b 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -554,8 +554,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid x = (int)(ux / Constants.RegionSize); y = (int)(uy / Constants.RegionSize); - if ((Math.Abs((int)(m_scene.RegionInfo.RegionLocX / Constants.RegionSize) - x) >= 4096) || - (Math.Abs((int)(m_scene.RegionInfo.RegionLocY / Constants.RegionSize) - y) >= 4096)) + if ((Math.Abs((int)m_scene.RegionInfo.RegionLocX - x) >= 4096) || + (Math.Abs((int)m_scene.RegionInfo.RegionLocY - y) >= 4096)) { return false; } -- cgit v1.1