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 ++++++++++++++-------
.../Cache/UserProfileCacheService.cs | 16 ++-
2 files changed, 87 insertions(+), 38 deletions(-)
(limited to 'OpenSim/Framework/Communications/Cache')
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;
}
}
diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs
index b924d5c..6b09e01 100644
--- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs
+++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs
@@ -97,7 +97,7 @@ namespace OpenSim.Framework.Communications.Cache
CachedUserInfo userInfo = GetUserDetails(userID);
if (userInfo != null)
{
- m_commsManager.InventoryService.RequestInventoryForUser(userID, userInfo.FolderReceive, userInfo.ItemReceive);
+ m_commsManager.InventoryService.RequestInventoryForUser(userID, userInfo.InventoryReceive);
}
else
{
@@ -118,6 +118,14 @@ namespace OpenSim.Framework.Communications.Cache
return null;
}
+ ///
+ /// Handle an inventory folder creation request from the client.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType,
string folderName, LLUUID parentID)
{
@@ -189,6 +197,12 @@ namespace OpenSim.Framework.Communications.Cache
}
}
+ ///
+ /// Handle an inventory folder move request from the client.
+ ///
+ ///
+ ///
+ ///
public void HandleMoveInventoryFolder(IClientAPI remoteClient, LLUUID folderID, LLUUID parentID)
{
CachedUserInfo userProfile;
--
cgit v1.1