* Eliminate a class of errors where an inventory request could be made before the region had completely received the inventory for the user.
* A much larger race condition where the inventory request could be made before the region gets any data at all will also be fixed in the near future. * This change also fixes a regression from two patches ago where items stopped appearing in standalone inventory0.6.0-stable
parent
649f304e76
commit
7ac7f79f88
|
@ -47,10 +47,18 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
|
|
||||||
private UserProfileData m_userProfile;
|
private UserProfileData m_userProfile;
|
||||||
public UserProfileData UserProfile { get { return m_userProfile; } }
|
public UserProfileData UserProfile { get { return m_userProfile; } }
|
||||||
|
|
||||||
|
|
||||||
|
private bool m_hasInventory;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Has this user info object yet received its inventory information from the invetnroy service?
|
||||||
|
/// </summary>
|
||||||
|
public bool HasInventory { get { return m_hasInventory; } }
|
||||||
|
|
||||||
// FIXME: These need to be hidden behind accessors
|
// FIXME: These need to be hidden behind accessors
|
||||||
private InventoryFolderImpl m_rootFolder;
|
private InventoryFolderImpl m_rootFolder;
|
||||||
public InventoryFolderImpl RootFolder { get { return m_rootFolder; } }
|
public InventoryFolderImpl RootFolder { get { return m_rootFolder; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Stores received folders for which we have not yet received the parents.
|
/// Stores received folders for which we have not yet received the parents.
|
||||||
|
@ -68,11 +76,6 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
m_commsManager = commsManager;
|
m_commsManager = commsManager;
|
||||||
m_userProfile = userProfile;
|
m_userProfile = userProfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Has this user info object yet received its inventory information from the invetnroy service?
|
|
||||||
/// </summary>
|
|
||||||
public bool HasInventory { get { return RootFolder != null; } }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Store a folder pending categorization when its parent is received.
|
/// Store a folder pending categorization when its parent is received.
|
||||||
|
@ -142,8 +145,10 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[INVENTORY CACHE]: {0}", e);
|
m_log.ErrorFormat("[INVENTORY CACHE]: Error processing inventory received from inventory service, {0}", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_hasInventory = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -153,9 +158,9 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
/// <param name="folderInfo"></param>
|
/// <param name="folderInfo"></param>
|
||||||
private void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo)
|
private void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
// "[INVENTORY CACHE]: Received folder {0} {1} for user {2}",
|
"[INVENTORY CACHE]: Received folder {0} {1} for user {2}",
|
||||||
// folderInfo.name, folderInfo.folderID, userID);
|
folderInfo.Name, folderInfo.ID, userID);
|
||||||
|
|
||||||
if (userID == UserProfile.ID)
|
if (userID == UserProfile.ID)
|
||||||
{
|
{
|
||||||
|
@ -207,6 +212,10 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
/// <param name="folderInfo"></param>
|
/// <param name="folderInfo"></param>
|
||||||
private void ItemReceive(LLUUID userID, InventoryItemBase itemInfo)
|
private void ItemReceive(LLUUID userID, InventoryItemBase itemInfo)
|
||||||
{
|
{
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[INVENTORY CACHE]: Received item {0} {1} for user {2}",
|
||||||
|
itemInfo.Name, itemInfo.ID, userID);
|
||||||
|
|
||||||
if ((userID == UserProfile.ID) && (RootFolder != null))
|
if ((userID == UserProfile.ID) && (RootFolder != null))
|
||||||
{
|
{
|
||||||
if (itemInfo.Folder == RootFolder.ID)
|
if (itemInfo.Folder == RootFolder.ID)
|
||||||
|
|
|
@ -39,13 +39,18 @@ namespace OpenSim.Region.Communications.Local
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class LocalInventoryService : InventoryServiceBase
|
public class LocalInventoryService : InventoryServiceBase
|
||||||
{
|
{
|
||||||
|
private static readonly log4net.ILog m_log
|
||||||
|
= log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
public override void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback)
|
public override void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback)
|
||||||
{
|
{
|
||||||
|
m_log.InfoFormat("[LOCAL INVENTORY SERVICE]: Requesting inventory for user {0}", userID);
|
||||||
|
|
||||||
List<InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID);
|
List<InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID);
|
||||||
InventoryFolderImpl rootFolder = null;
|
InventoryFolderImpl rootFolder = null;
|
||||||
|
|
||||||
ICollection<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
|
List<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
|
||||||
ICollection<InventoryItemBase> items = new List<InventoryItemBase>();
|
List<InventoryItemBase> items = new List<InventoryItemBase>();
|
||||||
|
|
||||||
// Need to retrieve the root folder on the first pass
|
// Need to retrieve the root folder on the first pass
|
||||||
foreach (InventoryFolderBase folder in skeletonFolders)
|
foreach (InventoryFolderBase folder in skeletonFolders)
|
||||||
|
@ -54,6 +59,7 @@ namespace OpenSim.Region.Communications.Local
|
||||||
{
|
{
|
||||||
rootFolder = new InventoryFolderImpl(folder);
|
rootFolder = new InventoryFolderImpl(folder);
|
||||||
folders.Add(rootFolder);
|
folders.Add(rootFolder);
|
||||||
|
items.AddRange(RequestFolderItems(rootFolder.ID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +70,7 @@ namespace OpenSim.Region.Communications.Local
|
||||||
if (folder.ID != rootFolder.ID)
|
if (folder.ID != rootFolder.ID)
|
||||||
{
|
{
|
||||||
folders.Add(new InventoryFolderImpl(folder));
|
folders.Add(new InventoryFolderImpl(folder));
|
||||||
|
items.AddRange(RequestFolderItems(folder.ID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,8 @@ namespace OpenSim.Region.Communications.OGS1
|
||||||
{
|
{
|
||||||
public class OGS1InventoryService : IInventoryServices
|
public class OGS1InventoryService : IInventoryServices
|
||||||
{
|
{
|
||||||
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly log4net.ILog m_log
|
||||||
|
= log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private string _inventoryServerUrl;
|
private string _inventoryServerUrl;
|
||||||
private Dictionary<LLUUID, InventoryRequest> m_RequestingInventory = new Dictionary<LLUUID, InventoryRequest>();
|
private Dictionary<LLUUID, InventoryRequest> m_RequestingInventory = new Dictionary<LLUUID, InventoryRequest>();
|
||||||
|
|
Loading…
Reference in New Issue