* 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.
This commit is contained in:
Justin Clarke Casey
2008-04-11 18:13:10 +00:00
parent 9c5d0f50fa
commit a5176c2e2c
8 changed files with 152 additions and 90 deletions

View File

@@ -39,32 +39,38 @@ namespace OpenSim.Region.Communications.Local
/// </summary>
public class LocalInventoryService : InventoryServiceBase
{
public override void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack,
InventoryItemInfo itemCallBack)
public override void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback)
{
List<InventoryFolderBase> folders = GetInventorySkeleton(userID);
List<InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID);
InventoryFolderImpl rootFolder = null;
ICollection<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
ICollection<InventoryItemBase> items = new List<InventoryItemBase>();
//need to make sure we send root folder first
foreach (InventoryFolderBase folder in folders)
// Need to retrieve the root folder on the first pass
foreach (InventoryFolderBase folder in skeletonFolders)
{
if (folder.ParentID == LLUUID.Zero)
{
rootFolder = RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack);
//rootFolder = RequestInventoryFolder(userID, folder, callback);
rootFolder = new InventoryFolderImpl(folder);
folders.Add(rootFolder);
}
}
if (rootFolder != null)
{
foreach (InventoryFolderBase folder in folders)
foreach (InventoryFolderBase folder in skeletonFolders)
{
if (folder.ID != rootFolder.ID)
{
RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack);
//RequestInventoryFolder(userID, folder, callback);
folders.Add(new InventoryFolderImpl(folder));
}
}
}
callback(userID, folders, items);
}
public override void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder)
@@ -99,26 +105,5 @@ namespace OpenSim.Region.Communications.Local
return true;
}
}
/// <summary>
/// Send the given inventory folder and its item contents back to the requester.
/// </summary>
/// <param name="userID"></param>
/// <param name="folder"></param>
private InventoryFolderImpl RequestInventoryFolder(LLUUID userID, InventoryFolderBase folder,
InventoryFolderInfo folderCallBack,
InventoryItemInfo itemCallBack)
{
InventoryFolderImpl newFolder = new InventoryFolderImpl(folder);
folderCallBack(userID, newFolder);
List<InventoryItemBase> items = RequestFolderItems(newFolder.ID);
foreach (InventoryItemBase item in items)
{
itemCallBack(userID, item);
}
return newFolder;
}
}
}

View File

@@ -51,12 +51,11 @@ namespace OpenSim.Region.Communications.OGS1
#region IInventoryServices Members
// See IInventoryServices
public void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack,
InventoryItemInfo itemCallBack)
public void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback)
{
if (!m_RequestingInventory.ContainsKey(userID))
{
InventoryRequest request = new InventoryRequest(userID, folderCallBack, itemCallBack);
InventoryRequest request = new InventoryRequest(userID, callback);
m_RequestingInventory.Add(userID, request);
RequestInventory(userID);
}
@@ -105,13 +104,17 @@ namespace OpenSim.Region.Communications.OGS1
InventoryFolderImpl rootFolder = null;
InventoryRequest request = m_RequestingInventory[userID];
ICollection<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
ICollection<InventoryItemBase> items = new List<InventoryItemBase>();
foreach (InventoryFolderBase folder in response.Folders)
{
if (folder.ParentID == LLUUID.Zero)
{
InventoryFolderImpl newfolder = new InventoryFolderImpl(folder);
rootFolder = newfolder;
request.FolderCallBack(userID, newfolder);
rootFolder = new InventoryFolderImpl(folder);
folders.Add(rootFolder);
//request.FolderCallBack(userID, newfolder);
}
}
@@ -121,16 +124,20 @@ namespace OpenSim.Region.Communications.OGS1
{
if (folder.ID != rootFolder.ID)
{
InventoryFolderImpl newfolder = new InventoryFolderImpl(folder);
request.FolderCallBack(userID, newfolder);
folders.Add(new InventoryFolderImpl(folder));
//request.FolderCallBack(userID, newfolder);
}
}
foreach (InventoryItemBase item in response.AllItems)
{
request.ItemCallBack(userID, item);
items.Add(item);
//request.ItemCallBack(userID, item);
}
}
request.Callback(userID, folders, items);
m_RequestingInventory.Remove(userID);
}
else
@@ -223,17 +230,22 @@ namespace OpenSim.Region.Communications.OGS1
#endregion
/// <summary>
/// Caches a pending inventory request that has yet to be satisfied by the inventory service
/// </summary>
public class InventoryRequest
{
public LLUUID UserID;
public InventoryFolderInfo FolderCallBack;
public InventoryItemInfo ItemCallBack;
public InventoryReceiptCallback Callback;
//public InventoryFolderInfo FolderCallBack;
//public InventoryItemInfo ItemCallBack;
public InventoryRequest(LLUUID userId, InventoryFolderInfo folderCall, InventoryItemInfo itemCall)
public InventoryRequest(LLUUID userId, InventoryReceiptCallback callback)
{
UserID = userId;
FolderCallBack = folderCall;
ItemCallBack = itemCall;
//FolderCallBack = folderCall;
//ItemCallBack = itemCall;
Callback = callback;
}
}
}