From a5176c2e2c4d2791ec15a22db4309bb15bc3ae98 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 11 Apr 2008 18:13:10 +0000 Subject: * Change inventory async response deliver to deliver all items and folders at once, rather than each individual * This is required in order to work towards eliminating some inventory race conditions and to better deal with situations where a grid inventory server is slow or not responding. --- .../Communications/Cache/CachedUserInfo.cs | 109 ++++++++++++++------- 1 file changed, 72 insertions(+), 37 deletions(-) (limited to 'OpenSim/Framework/Communications/Cache/CachedUserInfo.cs') diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index 1208605..cf701cb 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs @@ -118,64 +118,82 @@ namespace OpenSim.Framework.Communications.Cache } } } - + /// - /// Callback invoked when a folder is received from an async request to the inventory service. + /// Callback invoked when the inventory is received from an async request to the inventory service /// /// - /// - public void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo) + /// + public void InventoryReceive(LLUUID userID, ICollection folders, ICollection items) { // FIXME: Exceptions thrown upwards never appear on the console. Could fix further up if these // are simply being swallowed try + { + foreach (InventoryFolderImpl folder in folders) + { + FolderReceive(userID, folder); + } + + foreach (InventoryItemBase item in items) + { + ItemReceive(userID, item); + } + } + catch (Exception e) { + m_log.ErrorFormat("[INVENTORY CACHE]: {0}", e); + } + } + + /// + /// Callback invoked when a folder is received from an async request to the inventory service. + /// + /// + /// + private void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo) + { // m_log.DebugFormat( // "[INVENTORY CACHE]: Received folder {0} {1} for user {2}", // folderInfo.name, folderInfo.folderID, userID); - - if (userID == UserProfile.ID) + + if (userID == UserProfile.ID) + { + if (RootFolder == null) { - if (RootFolder == null) + if (folderInfo.ParentID == LLUUID.Zero) { - if (folderInfo.ParentID == LLUUID.Zero) - { - m_rootFolder = folderInfo; - } + m_rootFolder = folderInfo; } - else if (RootFolder.ID == folderInfo.ParentID) + } + else if (RootFolder.ID == folderInfo.ParentID) + { + if (!RootFolder.SubFolders.ContainsKey(folderInfo.ID)) { - if (!RootFolder.SubFolders.ContainsKey(folderInfo.ID)) - { - RootFolder.SubFolders.Add(folderInfo.ID, folderInfo); - } - else - { - AddPendingFolder(folderInfo); - } + RootFolder.SubFolders.Add(folderInfo.ID, folderInfo); } else { - InventoryFolderImpl folder = RootFolder.HasSubFolder(folderInfo.ParentID); - if (folder != null) - { - if (!folder.SubFolders.ContainsKey(folderInfo.ID)) - { - folder.SubFolders.Add(folderInfo.ID, folderInfo); - } - } - else + AddPendingFolder(folderInfo); + } + } + else + { + InventoryFolderImpl folder = RootFolder.HasSubFolder(folderInfo.ParentID); + if (folder != null) + { + if (!folder.SubFolders.ContainsKey(folderInfo.ID)) { - AddPendingFolder(folderInfo); + folder.SubFolders.Add(folderInfo.ID, folderInfo); } } - - ResolvePendingFolders(folderInfo); + else + { + AddPendingFolder(folderInfo); + } } - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CACHE] {0}", e); + + ResolvePendingFolders(folderInfo); } } @@ -187,7 +205,7 @@ namespace OpenSim.Framework.Communications.Cache /// /// /// - public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) + private void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) { if ((userID == UserProfile.ID) && (RootFolder != null)) { @@ -212,6 +230,11 @@ namespace OpenSim.Framework.Communications.Cache } } + /// + /// Add an item to the user's inventory + /// + /// + /// public void AddItem(LLUUID userID, InventoryItemBase itemInfo) { if ((userID == UserProfile.ID) && HasInventory) @@ -221,6 +244,11 @@ namespace OpenSim.Framework.Communications.Cache } } + /// + /// Update an item in the user's inventory + /// + /// + /// public void UpdateItem(LLUUID userID, InventoryItemBase itemInfo) { if ((userID == UserProfile.ID) && HasInventory) @@ -229,6 +257,12 @@ namespace OpenSim.Framework.Communications.Cache } } + /// + /// Delete an item from the user's inventory + /// + /// + /// + /// public bool DeleteItem(LLUUID userID, InventoryItemBase item) { bool result = false; @@ -240,6 +274,7 @@ namespace OpenSim.Framework.Communications.Cache m_commsManager.InventoryService.DeleteInventoryItem(userID, item); } } + return result; } } -- cgit v1.1