From 31419a70ce05e7db0c54f4c4ec827a0d1fe23402 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 11 Aug 2009 10:30:03 -0700 Subject: System folders inventory cache added to OUT inventory modules. This tracks agents in and out of *sims* in order to fetch/drop their system folders from the cache. Also added region-side support for fetching the system folders from the inventory service. Nothing of this is called yet. --- .../Inventory/HGInventoryBroker.cs | 68 ++++++++++--- .../Inventory/InventoryCache.cs | 108 +++++++++++++++++++++ .../Inventory/LocalInventoryServiceConnector.cs | 35 ++++++- .../Inventory/RemoteInventoryServiceConnector.cs | 33 +++---- 4 files changed, 207 insertions(+), 37 deletions(-) create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index f5e6824..1562172 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -41,7 +41,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class HGInventoryBroker : ISharedRegionModule, IInventoryService + public class HGInventoryBroker : InventoryCache, ISharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger( @@ -122,6 +122,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory m_LocalGridInventoryURI = inventoryConfig.GetString("InventoryServerURI", string.Empty); + Init(source); + m_Enabled = true; m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled"); } @@ -136,7 +138,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { } - public void AddRegion(Scene scene) + public override void AddRegion(Scene scene) { if (!m_Enabled) return; @@ -154,10 +156,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } scene.RegisterModuleInterface(this); + base.AddRegion(scene); } - public void RemoveRegion(Scene scene) + public override void RemoveRegion(Scene scene) { + base.RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -165,7 +169,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory if (!m_Enabled) return; - m_log.InfoFormat("[INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName); + m_log.InfoFormat("[HG INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName); } @@ -201,32 +205,72 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } } - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + // Inherited. See base + //public override InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + //{ + // if (IsLocalGridUser(userID)) + // return m_GridService.GetFolderForType(userID, type); + // else + // { + // UUID sessionID = GetSessionID(userID); + // string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); + // // !!!!!! + // return null; + // //return m_HGService.GetFolderForType(uri, sessionID, type); + // } + //} + + public InventoryCollection GetFolderContent(UUID userID, UUID folderID) { if (IsLocalGridUser(userID)) - return m_GridService.GetFolderForType(userID, type); + return m_GridService.GetFolderContent(userID, folderID); else { UUID sessionID = GetSessionID(userID); string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); - // !!!!!! - return null; - //return m_HGService.GetFolderForType(uri, sessionID, type); + return m_HGService.GetFolderContent(uri, folderID, sessionID); } } - public InventoryCollection GetFolderContent(UUID userID, UUID folderID) + public override Dictionary GetSystemFolders(UUID userID) { if (IsLocalGridUser(userID)) - return m_GridService.GetFolderContent(userID, folderID); + return GetSystemFoldersLocal(userID); else { UUID sessionID = GetSessionID(userID); string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); - return m_HGService.GetFolderContent(uri, folderID, sessionID); + return m_HGService.GetSystemFolders(uri, sessionID); } } + private Dictionary GetSystemFoldersLocal(UUID userID) + { + InventoryFolderBase root = m_GridService.GetRootFolder(userID); + if (root != null) + { + InventoryCollection content = m_GridService.GetFolderContent(userID, root.ID); + if (content != null) + { + Dictionary folders = new Dictionary(); + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count); + foreach (InventoryFolderBase folder in content.Folders) + { + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scanning folder type {0}", (AssetType)folder.Type); + if (folder.Type != (short)AssetType.Folder) + folders[(AssetType)folder.Type] = folder; + } + return folders; + } + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID); + + } + + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder not found for {0}", userID); + + return new Dictionary(); + } + public List GetFolderItems(UUID userID, UUID folderID) { return new List(); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs new file mode 100644 index 0000000..57c2091 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +using OpenSim.Framework; +using OpenSim.Framework.Client; +using OpenSim.Region.Framework.Scenes; + +using OpenMetaverse; +using Nini.Config; +using log4net; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory +{ + public abstract class InventoryCache + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + protected List m_Scenes; + + // The cache proper + protected Dictionary> m_InventoryCache; + + protected virtual void Init(IConfigSource source) + { + m_Scenes = new List(); + m_InventoryCache = new Dictionary>(); + } + + public virtual void AddRegion(Scene scene) + { + m_Scenes.Add(scene); + scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; + scene.EventManager.OnClientClosed += OnClientClosed; + } + + public virtual void RemoveRegion(Scene scene) + { + if ((m_Scenes != null) && m_Scenes.Contains(scene)) + { + m_Scenes.Remove(scene); + } + } + + void OnMakeRootAgent(ScenePresence presence) + { + // Get system folders + + // First check if they're here already + lock (m_InventoryCache) + { + if (m_InventoryCache.ContainsKey(presence.UUID)) + { + m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, system folders for {0} {1} already in cache", presence.Firstname, presence.Lastname); + return; + } + } + + // If not, go get them and place them in the cache + Dictionary folders = GetSystemFolders(presence.UUID); + m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, fetched system folders for {0} {1}: count {2}", + presence.Firstname, presence.Lastname, folders.Count); + if (folders.Count > 0) + lock (m_InventoryCache) + m_InventoryCache.Add(presence.UUID, folders); + } + + void OnClientClosed(UUID clientID, Scene scene) + { + ScenePresence sp = null; + foreach (Scene s in m_Scenes) + { + s.TryGetAvatar(clientID, out sp); + if (sp != null) + { + m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed, but user {0} still in sim. Keeping system folders in cache", clientID); + return; + } + } + + m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed, user {0} out of sim. Dropping system folders", clientID); + // Drop system folders + lock (m_InventoryCache) + if (m_InventoryCache.ContainsKey(clientID)) + m_InventoryCache.Remove(clientID); + + } + + public abstract Dictionary GetSystemFolders(UUID userID); + + public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + { + Dictionary folders = null; + lock (m_InventoryCache) + { + m_InventoryCache.TryGetValue(userID, out folders); + } + if ((folders != null) && folders.ContainsKey(type)) + { + return folders[type]; + } + + return null; + } + } +} diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index bab0044..5c52897f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -41,7 +41,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class LocalInventoryServicesConnector : ISharedRegionModule, IInventoryService + public class LocalInventoryServicesConnector : InventoryCache, ISharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger( @@ -108,6 +108,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory // m_InventoryService.AddPlugin(new OspInventoryWrapperPlugin(plugin, this)); //} + Init(source); + m_Enabled = true; m_log.Info("[INVENTORY CONNECTOR]: Local inventory connector enabled"); } @@ -122,7 +124,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { } - public void AddRegion(Scene scene) + public override void AddRegion(Scene scene) { if (!m_Enabled) return; @@ -139,10 +141,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory // "[INVENTORY CONNECTOR]: Registering IInventoryService to scene {0}", scene.RegionInfo.RegionName); scene.RegisterModuleInterface(this); + base.AddRegion(scene); } - public void RemoveRegion(Scene scene) + public override void RemoveRegion(Scene scene) { + base.RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -176,9 +180,30 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory m_InventoryService.GetUserInventory(userID, callback); } - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + // Inherited. See base + //public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + //{ + // return m_InventoryService.GetFolderForType(userID, type); + //} + + public override Dictionary GetSystemFolders(UUID userID) { - return m_InventoryService.GetFolderForType(userID, type); + InventoryFolderBase root = GetRootFolder(userID); + if (root != null) + { + InventoryCollection content = GetFolderContent(userID, root.ID); + if (content != null) + { + Dictionary folders = new Dictionary(); + foreach (InventoryFolderBase folder in content.Folders) + { + if (folder.Type != (short)AssetType.Folder) + folders[(AssetType)folder.Type] = folder; + } + return folders; + } + } + return new Dictionary(); } public InventoryCollection GetFolderContent(UUID userID, UUID folderID) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index 2064558..dceda38 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -40,7 +40,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class RemoteInventoryServicesConnector : ISharedRegionModule, IInventoryService + public class RemoteInventoryServicesConnector : InventoryCache, ISharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -69,9 +69,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory Init(source); } - private void Init(IConfigSource source) + protected override void Init(IConfigSource source) { m_RemoteConnector = new InventoryServicesConnector(source); + base.Init(source); } @@ -101,7 +102,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { } - public void AddRegion(Scene scene) + public override void AddRegion(Scene scene) { if (!m_Enabled) return; @@ -116,10 +117,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } scene.RegisterModuleInterface(this); + base.AddRegion(scene); } - public void RemoveRegion(Scene scene) + public override void RemoveRegion(Scene scene) { + base.RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -168,23 +171,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) - { - //UUID sessionID = GetSessionID(userID); - //List sysFolders; - //try - //{ - // sysFolders = m_RemoteConnector.GetSystemFolders(userID.ToString(), sessionID); - //} - //catch (Exception e) - //{ - // m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderForType operation failed, {0} {1}", - // e.Source, e.Message); - //} - - // PLACEHOLDER UNTIL CACHE IS DONE - return null; + // inherited. See base class + // public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + public override Dictionary GetSystemFolders(UUID userID) + { + UUID sessionID = GetSessionID(userID); + return m_RemoteConnector.GetSystemFolders(userID.ToString(), sessionID); } public InventoryCollection GetFolderContent(UUID userID, UUID folderID) -- cgit v1.1