More on inventory transfer hold ups:
- Added an inventory cache for caching root and system folders - Synchronized the remote inventory connector, so that all the remote inventory calls are serialized This will not make much difference in the hold ups. We'd have to move the FireAndForget high up to AddInventoryItem, but that opens up a can of worms regarding the notification of the recipient... the recipient would be notified of the offer before the items are effectively in his inventory, which could lead to surprises.0.7.4.1
parent
81869c4a3f
commit
a58152bd2a
|
@ -58,6 +58,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
private List<Scene> m_Scenes = new List<Scene>();
|
private List<Scene> m_Scenes = new List<Scene>();
|
||||||
|
|
||||||
|
private InventoryCache m_Cache = new InventoryCache();
|
||||||
|
|
||||||
protected IUserManagement m_UserManagement;
|
protected IUserManagement m_UserManagement;
|
||||||
protected IUserManagement UserManagementModule
|
protected IUserManagement UserManagementModule
|
||||||
{
|
{
|
||||||
|
@ -312,6 +314,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
public InventoryFolderBase GetRootFolder(UUID userID)
|
public InventoryFolderBase GetRootFolder(UUID userID)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", userID);
|
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", userID);
|
||||||
|
InventoryFolderBase root = m_Cache.GetRootFolder(userID);
|
||||||
|
if (root != null)
|
||||||
|
return root;
|
||||||
|
|
||||||
string invURL = GetInventoryServiceURL(userID);
|
string invURL = GetInventoryServiceURL(userID);
|
||||||
|
|
||||||
|
@ -320,12 +325,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
IInventoryService connector = GetConnector(invURL);
|
IInventoryService connector = GetConnector(invURL);
|
||||||
|
|
||||||
return connector.GetRootFolder(userID);
|
root = connector.GetRootFolder(userID);
|
||||||
|
|
||||||
|
m_Cache.Cache(userID, root);
|
||||||
|
|
||||||
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, type);
|
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, type);
|
||||||
|
InventoryFolderBase f = m_Cache.GetFolderForType(userID, type);
|
||||||
|
if (f != null)
|
||||||
|
return f;
|
||||||
|
|
||||||
string invURL = GetInventoryServiceURL(userID);
|
string invURL = GetInventoryServiceURL(userID);
|
||||||
|
|
||||||
|
@ -334,7 +346,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
IInventoryService connector = GetConnector(invURL);
|
IInventoryService connector = GetConnector(invURL);
|
||||||
|
|
||||||
return connector.GetFolderForType(userID, type);
|
f = connector.GetFolderForType(userID, type);
|
||||||
|
|
||||||
|
m_Cache.Cache(userID, type, f);
|
||||||
|
|
||||||
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
{
|
||||||
|
public class InventoryCache
|
||||||
|
{
|
||||||
|
private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour
|
||||||
|
|
||||||
|
private static ExpiringCache<UUID, InventoryFolderBase> m_RootFolders = new ExpiringCache<UUID, InventoryFolderBase>();
|
||||||
|
private static ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>> m_FolderTypes = new ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>>();
|
||||||
|
|
||||||
|
public void Cache(UUID userID, InventoryFolderBase root)
|
||||||
|
{
|
||||||
|
lock (m_RootFolders)
|
||||||
|
m_RootFolders.AddOrUpdate(userID, root, CACHE_EXPIRATION_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryFolderBase GetRootFolder(UUID userID)
|
||||||
|
{
|
||||||
|
InventoryFolderBase root = null;
|
||||||
|
if (m_RootFolders.TryGetValue(userID, out root))
|
||||||
|
return root;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Cache(UUID userID, AssetType type, InventoryFolderBase folder)
|
||||||
|
{
|
||||||
|
lock (m_FolderTypes)
|
||||||
|
{
|
||||||
|
Dictionary<AssetType, InventoryFolderBase> ff = null;
|
||||||
|
if (!m_FolderTypes.TryGetValue(userID, out ff))
|
||||||
|
{
|
||||||
|
ff = new Dictionary<AssetType, InventoryFolderBase>();
|
||||||
|
m_FolderTypes.Add(userID, ff, CACHE_EXPIRATION_SECONDS);
|
||||||
|
}
|
||||||
|
if (!ff.ContainsKey(type))
|
||||||
|
ff.Add(type, folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||||
|
{
|
||||||
|
Dictionary<AssetType, InventoryFolderBase> ff = null;
|
||||||
|
if (m_FolderTypes.TryGetValue(userID, out ff))
|
||||||
|
{
|
||||||
|
InventoryFolderBase f = null;
|
||||||
|
if (ff.TryGetValue(type, out f))
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,6 +48,8 @@ namespace OpenSim.Services.Connectors
|
||||||
|
|
||||||
private string m_ServerURI = String.Empty;
|
private string m_ServerURI = String.Empty;
|
||||||
|
|
||||||
|
private object m_Lock = new object();
|
||||||
|
|
||||||
public XInventoryServicesConnector()
|
public XInventoryServicesConnector()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -514,7 +516,9 @@ namespace OpenSim.Services.Connectors
|
||||||
{
|
{
|
||||||
sendData["METHOD"] = method;
|
sendData["METHOD"] = method;
|
||||||
|
|
||||||
string reply = SynchronousRestFormsRequester.MakeRequest("POST",
|
string reply = string.Empty;
|
||||||
|
lock (m_Lock)
|
||||||
|
reply = SynchronousRestFormsRequester.MakeRequest("POST",
|
||||||
m_ServerURI + "/xinventory",
|
m_ServerURI + "/xinventory",
|
||||||
ServerUtils.BuildQueryString(sendData));
|
ServerUtils.BuildQueryString(sendData));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue