diff --git a/OpenSim/Framework/RestClient.cs b/OpenSim/Framework/RestClient.cs
index 5bfc9908c4..f3a4b6d1d9 100644
--- a/OpenSim/Framework/RestClient.cs
+++ b/OpenSim/Framework/RestClient.cs
@@ -93,7 +93,7 @@ namespace OpenSim.Framework
///
/// MemoryStream representing the resulting resource
///
- private Stream _resource;
+ private MemoryStream _resource;
///
/// WebRequest object, held as a member variable
@@ -313,7 +313,7 @@ namespace OpenSim.Framework
///
/// Perform a synchronous request
///
- public Stream Request()
+ public MemoryStream Request()
{
return Request(null);
}
@@ -321,7 +321,7 @@ namespace OpenSim.Framework
///
/// Perform a synchronous request
///
- public Stream Request(IServiceAuth auth)
+ public MemoryStream Request(IServiceAuth auth)
{
lock (_lock)
{
@@ -471,7 +471,7 @@ namespace OpenSim.Framework
try
{
// Perform the operation; if sucessful set the result
- Stream s = Request(null);
+ MemoryStream s = Request(null);
ar.SetAsCompleted(s, false);
}
catch (Exception e)
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index 96855dcaed..d6170760a2 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -1324,15 +1324,12 @@ namespace OpenSim.Framework
{
if (hwr != null)
{
- if (hwr.StatusCode == HttpStatusCode.NotFound)
- return deserial;
-
if (hwr.StatusCode == HttpStatusCode.Unauthorized)
{
m_log.ErrorFormat("[SynchronousRestObjectRequester]: Web request {0} requires authentication",
requestUrl);
}
- else
+ else if(hwr.StatusCode != HttpStatusCode.NotFound)
{
m_log.WarnFormat("[SynchronousRestObjectRequester]: Web request {0} returned error: {1}",
requestUrl, hwr.StatusCode);
@@ -1342,8 +1339,6 @@ namespace OpenSim.Framework
m_log.ErrorFormat(
"[SynchronousRestObjectRequester]: WebException for {0} {1} {2} {3}",
verb, requestUrl, typeof(TResponse).ToString(), e.Message);
-
- return deserial;
}
}
catch (System.InvalidOperationException)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
index 03cd32eaa7..46fe288673 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
@@ -30,6 +30,7 @@ using Mono.Addins;
using Nini.Config;
using System;
using System.Collections.Generic;
+using System.Collections.Concurrent;
using System.Reflection;
using OpenSim.Framework;
@@ -45,26 +46,26 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "HGInventoryBroker")]
public class HGInventoryBroker : ISharedRegionModule, IInventoryService
{
- private static readonly ILog m_log =
- LogManager.GetLogger(
+ private static readonly ILog m_log = LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
private static bool m_Enabled = false;
- private static IInventoryService m_LocalGridInventoryService;
- private Dictionary m_connectors = new Dictionary();
+ private const int CONNECTORS_CACHE_EXPIRE = 60000; // 1 minute
+
+ private readonly List m_Scenes = new List();
+
+ private IInventoryService m_LocalGridInventoryService;
+ private readonly ExpiringCacheOS m_connectors = new ExpiringCacheOS();
// A cache of userIDs --> ServiceURLs, for HGBroker only
- protected Dictionary m_InventoryURLs = new Dictionary();
-
- private List m_Scenes = new List();
-
- private InventoryCache m_Cache = new InventoryCache();
+ protected readonly ConcurrentDictionary m_InventoryURLs = new ConcurrentDictionary();
+ private readonly InventoryCache m_Cache = new InventoryCache();
///
/// Used to serialize inventory requests.
///
- private object m_Lock = new object();
+ private readonly object m_Lock = new object();
protected IUserManagement m_UserManagement;
protected IUserManagement UserManagementModule
@@ -112,9 +113,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
string localDll = inventoryConfig.GetString("LocalGridInventoryService",
String.Empty);
- //string HGDll = inventoryConfig.GetString("HypergridInventoryService",
- // String.Empty);
-
+
if (localDll == String.Empty)
{
m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService");
@@ -176,9 +175,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
((LocalInventoryServicesConnector)m_LocalGridInventoryService).Scene = scene;
}
-
- scene.EventManager.OnClientClosed += OnClientClosed;
}
+ scene.EventManager.OnClientClosed += OnClientClosed;
}
public void RemoveRegion(Scene scene)
@@ -187,6 +185,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return;
m_Scenes.Remove(scene);
+ scene.EventManager.OnClientClosed -= OnClientClosed;
}
public void RegionLoaded(Scene scene)
@@ -202,21 +201,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
void OnClientClosed(UUID clientID, Scene scene)
{
- ScenePresence sp = null;
foreach (Scene s in m_Scenes)
{
- s.TryGetScenePresence(clientID, out sp);
- if ((sp != null) && !sp.IsChildAgent && (s != scene))
+ if(s.TryGetScenePresence(clientID, out ScenePresence sp) && !sp.IsChildAgent && sp.ControllingClient != null && sp.ControllingClient.IsActive)
{
- m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping inventoryURL in cache",
- scene.RegionInfo.RegionName, clientID);
- return;
+ //m_log.DebugFormat("[HG INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping inventoryURL in cache",
+ // scene.RegionInfo.RegionName, clientID);
+ return;
}
}
- if (m_InventoryURLs.ContainsKey(clientID)) // if it's in cache
- DropInventoryServiceURL(clientID);
-
+ m_InventoryURLs.TryRemove(clientID, out string dummy);
m_Cache.RemoveAll(clientID);
}
@@ -225,7 +220,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
/// and sticks it in the cache
///
///
- private void CacheInventoryServiceURL(UUID userID)
+ private string CacheInventoryServiceURL(UUID userID)
{
if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID))
{
@@ -239,9 +234,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
if (aCircuit == null)
- return;
+ return null;
if (aCircuit.ServiceURLs == null)
- return;
+ return null;
if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI"))
{
@@ -249,10 +244,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
if (inventoryURL != null && inventoryURL != string.Empty)
{
inventoryURL = inventoryURL.Trim(new char[] { '/' });
- lock (m_InventoryURLs)
- m_InventoryURLs[userID] = inventoryURL;
+ m_InventoryURLs[userID] = inventoryURL;
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Added {0} to the cache of inventory URLs", inventoryURL);
- return;
+ return inventoryURL;
}
}
// else
@@ -268,46 +262,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
if (!string.IsNullOrEmpty(inventoryURL))
{
inventoryURL = inventoryURL.Trim(new char[] { '/' });
- lock (m_InventoryURLs)
- m_InventoryURLs[userID] = inventoryURL;
+ m_InventoryURLs[userID] = inventoryURL;
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Added {0} to the cache of inventory URLs", inventoryURL);
+ return inventoryURL;
}
}
}
- }
-
- private void DropInventoryServiceURL(UUID userID)
- {
- lock (m_InventoryURLs)
- {
- if (m_InventoryURLs.ContainsKey(userID))
- {
- string url = m_InventoryURLs[userID];
- m_InventoryURLs.Remove(userID);
- m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Removed {0} from the cache of inventory URLs", url);
- }
- }
+ return null;
}
public string GetInventoryServiceURL(UUID userID)
{
- lock (m_InventoryURLs)
- {
- if (m_InventoryURLs.ContainsKey(userID))
- return m_InventoryURLs[userID];
- }
-
- CacheInventoryServiceURL(userID);
-
- lock (m_InventoryURLs)
- {
- if (m_InventoryURLs.ContainsKey(userID))
- return m_InventoryURLs[userID];
- }
-
- return null; //it means that the methods should forward to local grid's inventory
+ if (m_InventoryURLs.TryGetValue(userID, out string value))
+ return value;
+ return CacheInventoryServiceURL(userID);
}
+
#endregion
#region IInventoryService
@@ -685,22 +656,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
IInventoryService connector = null;
lock (m_connectors)
{
- if (m_connectors.ContainsKey(url))
- {
- connector = m_connectors[url];
- }
- else
+ if (!m_connectors.TryGetValue(url, out connector))
{
// Still not as flexible as I would like this to be,
// but good enough for now
RemoteXInventoryServicesConnector rxisc = new RemoteXInventoryServicesConnector(url);
rxisc.Scene = m_Scenes[0];
connector = rxisc;
-
- m_connectors.Add(url, connector);
}
+ if (connector != null)
+ m_connectors.AddOrUpdate(url, connector, CONNECTORS_CACHE_EXPIRE);
}
-
return connector;
}
}