From cf24069227f9a32272c873d4423e2e11f5da25a8 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 3 Feb 2011 12:43:46 -0800 Subject: Change UpdateAgent (for changes in agent position) to be sent once to each simulator rather than once to each region. This should help with some of the delays caused by multiple outstanding requests to a single service point. --- .../Simulation/SimulationServiceConnector.cs | 55 ++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) (limited to 'OpenSim/Services/Connectors') diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index c5313fc..cc6bffb 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -48,6 +48,9 @@ namespace OpenSim.Services.Connectors.Simulation { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + // we use this dictionary to track the pending updateagent requests, maps URI --> position update + private Dictionary m_updateAgentQueue = new Dictionary(); + //private GridRegion m_Region; public SimulationServiceConnector() @@ -133,10 +136,56 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool UpdateAgent(GridRegion destination, AgentPosition data) { - // we need a better throttle for these - // return false; + // The basic idea of this code is that the first thread that needs to + // send an update for a specific avatar becomes the worker for any subsequent + // requests until there are no more outstanding requests. Further, only send the most + // recent update; this *should* never be needed but some requests get + // slowed down and once that happens the problem with service end point + // limits kicks in and nothing proceeds + string uri = destination.ServerURI + AgentPath() + data.AgentID + "/"; + lock (m_updateAgentQueue) + { + if (m_updateAgentQueue.ContainsKey(uri)) + { + // Another thread is already handling + // updates for this simulator, just update + // the position and return, overwrites are + // not a problem since we only care about the + // last update anyway + m_updateAgentQueue[uri] = data; + return true; + } + + // Otherwise update the reference and start processing + m_updateAgentQueue[uri] = data; + } - return UpdateAgent(destination, (IAgentData)data); + AgentPosition pos = null; + while (true) + { + lock (m_updateAgentQueue) + { + // save the position + AgentPosition lastpos = pos; + + pos = m_updateAgentQueue[uri]; + + // this is true if no one put a new + // update in the map since the last + // one we processed, if thats the + // case then we are done + if (pos == lastpos) + { + m_updateAgentQueue.Remove(uri); + return true; + } + } + + UpdateAgent(destination,(IAgentData)pos); + } + + // unreachable + return true; } /// -- cgit v1.1 From 7a6e1fa4cfa01873f9e9420267cae47f58839128 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Fri, 4 Feb 2011 14:21:18 -0800 Subject: Convert SimianMaptile refresh time from ms to seconds. Too many 0's in the config file. --- .../SimianGrid/SimianGridMaptileModule.cs | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'OpenSim/Services/Connectors') diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs index dd8fe2b..93fdae3 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs @@ -87,16 +87,17 @@ namespace OpenSim.Region.OptionalModules.Simian if (String.IsNullOrEmpty(m_serverUrl)) return; - m_refreshtime = Convert.ToInt32(config.GetString("RefreshTime")); - if (m_refreshtime <= 0) + int refreshseconds = Convert.ToInt32(config.GetString("RefreshTime")); + if (refreshseconds <= 0) return; + m_refreshtime = refreshseconds * 1000; // convert from seconds to ms m_log.InfoFormat("[SIMIAN MAPTILE] enabled with refresh timeout {0} and URL {1}", m_refreshtime,m_serverUrl); - + m_enabled = true; } - + /// /// /// @@ -106,7 +107,7 @@ namespace OpenSim.Region.OptionalModules.Simian { m_refreshTimer.Enabled = true; m_refreshTimer.AutoReset = true; - m_refreshTimer.Interval = 5 * 60 * 1000; // every 5 minutes + m_refreshTimer.Interval = 5 * 60 * 1000; // every 5 minutes m_refreshTimer.Elapsed += new ElapsedEventHandler(HandleMaptileRefresh); } } @@ -120,12 +121,12 @@ namespace OpenSim.Region.OptionalModules.Simian if (! m_enabled) return; - // Every shared region module has to maintain an indepedent list of - // currently running regions + // Every shared region module has to maintain an indepedent list of + // currently running regions lock (m_scenes) m_scenes[scene.RegionInfo.RegionID] = scene; } - + /// /// /// @@ -150,7 +151,7 @@ namespace OpenSim.Region.OptionalModules.Simian // loaded and initialized if (m_lastrefresh > 0 && Util.EnvironmentTickCountSubtract(m_lastrefresh) < m_refreshtime) return; - + m_log.DebugFormat("[SIMIAN MAPTILE] map refresh fired"); lock (m_scenes) { @@ -169,7 +170,7 @@ namespace OpenSim.Region.OptionalModules.Simian m_lastrefresh = Util.EnvironmentTickCount(); } - + /// /// /// @@ -211,7 +212,7 @@ namespace OpenSim.Region.OptionalModules.Simian HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_serverUrl); request.Timeout = 20000; request.ReadWriteTimeout = 5000; - + using (HttpWebResponse response = MultipartForm.Post(request, postParameters)) { using (Stream responseStream = response.GetResponseStream()) -- cgit v1.1 From 632babf8fba8180764b359b9716eaac904b1b4ac Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 4 Feb 2011 19:19:38 -0800 Subject: Added an additional debug message, and removed a bunch of files that weren't being used anymore -- the old RemotsInventory connectors stuff. --- .../Inventory/HGInventoryServiceConnector.cs | 335 ------------ .../Inventory/ISessionAuthInventoryService.cs | 140 ----- .../Inventory/InventoryServiceConnector.cs | 582 --------------------- .../QuickAndDirtyInventoryServiceConnector.cs | 196 ------- 4 files changed, 1253 deletions(-) delete mode 100644 OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs delete mode 100644 OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs delete mode 100644 OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs delete mode 100644 OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs (limited to 'OpenSim/Services/Connectors') diff --git a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs deleted file mode 100644 index 9878855..0000000 --- a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using log4net; -using Nini.Config; -using System; -using System.Collections.Generic; -using System.Reflection; -using OpenSim.Framework; -using OpenSim.Services.Interfaces; -using OpenMetaverse; - -namespace OpenSim.Services.Connectors.Inventory -{ - public class HGInventoryServiceConnector : ISessionAuthInventoryService - { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); - - private Dictionary m_connectors = new Dictionary(); - - public HGInventoryServiceConnector(IConfigSource source) - { - IConfig moduleConfig = source.Configs["Modules"]; - if (moduleConfig != null) - { - - IConfig inventoryConfig = source.Configs["InventoryService"]; - if (inventoryConfig == null) - { - m_log.Error("[HG INVENTORY SERVICE]: InventoryService missing from OpenSim.ini"); - return; - } - - m_log.Info("[HG INVENTORY SERVICE]: HG inventory service enabled"); - } - } - - private bool StringToUrlAndUserID(string id, out string url, out string userID) - { - url = String.Empty; - userID = String.Empty; - - Uri assetUri; - - if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) && - assetUri.Scheme == Uri.UriSchemeHttp) - { - url = "http://" + assetUri.Authority; - userID = assetUri.LocalPath.Trim(new char[] { '/' }); - return true; - } - - return false; - } - private ISessionAuthInventoryService GetConnector(string url) - { - InventoryServicesConnector connector = null; - lock (m_connectors) - { - if (m_connectors.ContainsKey(url)) - { - connector = m_connectors[url]; - } - else - { - // We're instantiating this class explicitly, but this won't - // work in general, because the remote grid may be running - // an inventory server that has a different protocol. - // Eventually we will want a piece of protocol asking - // the remote server about its kind. Definitely cool thing to do! - connector = new InventoryServicesConnector(url); - m_connectors.Add(url, connector); - } - } - return connector; - } - - public string Host - { - get { return string.Empty; } - } - - public void GetUserInventory(string id, UUID sessionID, InventoryReceiptCallback callback) - { - m_log.Debug("[HGInventory]: GetUserInventory " + id); - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - connector.GetUserInventory(userID, sessionID, callback); - } - - } - - /// - /// Gets the user folder for the given folder-type - /// - /// - /// - /// - public Dictionary GetSystemFolders(string id, UUID sessionID) - { - m_log.Debug("[HGInventory]: GetSystemFolders " + id); - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.GetSystemFolders(userID, sessionID); - } - - return new Dictionary(); - } - - /// - /// Gets everything (folders and items) inside a folder - /// - /// - /// - /// - public InventoryCollection GetFolderContent(string id, UUID folderID, UUID sessionID) - { - m_log.Debug("[HGInventory]: GetFolderContent " + id); - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.GetFolderContent(userID, folderID, sessionID); - } - - return null; - } - - public bool AddFolder(string id, InventoryFolderBase folder, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.AddFolder(userID, folder, sessionID); - } - return false; - } - - public bool UpdateFolder(string id, InventoryFolderBase folder, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.UpdateFolder(userID, folder, sessionID); - } - return false; - } - - public bool MoveFolder(string id, InventoryFolderBase folder, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.MoveFolder(userID, folder, sessionID); - } - return false; - } - - public bool DeleteFolders(string id, List folders, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.DeleteFolders(userID, folders, sessionID); - } - return false; - } - - public bool PurgeFolder(string id, InventoryFolderBase folder, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.PurgeFolder(userID, folder, sessionID); - } - return false; - } - - public List GetFolderItems(string id, UUID folderID, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.GetFolderItems(userID, folderID, sessionID); - } - return new List(); - } - - public bool AddItem(string id, InventoryItemBase item, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.AddItem(userID, item, sessionID); - } - return false; - } - - public bool UpdateItem(string id, InventoryItemBase item, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.UpdateItem(userID, item, sessionID); - } - return false; - } - - public bool MoveItems(string id, List items, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.MoveItems(userID, items, sessionID); - } - return false; - } - - public bool DeleteItems(string id, List itemIDs, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.DeleteItems(userID, itemIDs, sessionID); - } - return false; - } - - public InventoryItemBase QueryItem(string id, InventoryItemBase item, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - //m_log.DebugFormat("[HGInventory CONNECTOR]: calling {0}", url); - ISessionAuthInventoryService connector = GetConnector(url); - return connector.QueryItem(userID, item, sessionID); - } - return null; - } - - public InventoryFolderBase QueryFolder(string id, InventoryFolderBase folder, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.QueryFolder(userID, folder, sessionID); - } - return null; - } - - public int GetAssetPermissions(string id, UUID assetID, UUID sessionID) - { - string url = string.Empty; - string userID = string.Empty; - - if (StringToUrlAndUserID(id, out url, out userID)) - { - ISessionAuthInventoryService connector = GetConnector(url); - return connector.GetAssetPermissions(userID, assetID, sessionID); - } - return 0; - } - } -} diff --git a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs deleted file mode 100644 index da8c7e2..0000000 --- a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Collections.Generic; -using OpenSim.Framework; -using OpenSim.Services.Interfaces; -using OpenMetaverse; - -namespace OpenSim.Services.Connectors -{ - /// - /// Defines all operations to access a remote inventory service - /// using session authentication as a form of security. - /// - public interface ISessionAuthInventoryService - { - string Host - { - get; - } - - /// - /// Request the inventory for a user. This is an asynchronous operation that will call the callback when the - /// inventory has been received - /// - /// - /// - void GetUserInventory(string userID, UUID session_id, InventoryReceiptCallback callback); - - /// - /// Gets the user folder for the given folder-type - /// - /// - /// - /// - Dictionary GetSystemFolders(string userID, UUID session_id); - - /// - /// Gets everything (folders and items) inside a folder - /// - /// - /// - /// - InventoryCollection GetFolderContent(string userID, UUID folderID, UUID session_id); - - /// - /// Add a new folder to the user's inventory - /// - /// - /// true if the folder was successfully added - bool AddFolder(string userID, InventoryFolderBase folder, UUID session_id); - - /// - /// Update a folder in the user's inventory - /// - /// - /// true if the folder was successfully updated - bool UpdateFolder(string userID, InventoryFolderBase folder, UUID session_id); - - /// - /// Move an inventory folder to a new location - /// - /// A folder containing the details of the new location - /// true if the folder was successfully moved - bool MoveFolder(string userID, InventoryFolderBase folder, UUID session_id); - - /// - /// Delete a list of inventory folders (from trash) - /// - bool DeleteFolders(string userID, List folders, UUID session_id); - - /// - /// Purge an inventory folder of all its items and subfolders. - /// - /// - /// true if the folder was successfully purged - bool PurgeFolder(string userID, InventoryFolderBase folder, UUID session_id); - - /// - /// Get items from a folder. - /// - /// - /// true if the folder was successfully purged - List GetFolderItems(string userID, UUID folderID, UUID session_id); - - /// - /// Add a new item to the user's inventory - /// - /// - /// true if the item was successfully added - bool AddItem(string userID, InventoryItemBase item, UUID session_id); - - /// - /// Update an item in the user's inventory - /// - /// - /// true if the item was successfully updated - bool UpdateItem(string userID, InventoryItemBase item, UUID session_id); - - bool MoveItems(string userID, List items, UUID session_id); - - /// - /// Delete an item from the user's inventory - /// - /// - /// true if the item was successfully deleted - bool DeleteItems(string userID, List itemIDs, UUID session_id); - - InventoryItemBase QueryItem(string userID, InventoryItemBase item, UUID session_id); - - InventoryFolderBase QueryFolder(string userID, InventoryFolderBase item, UUID session_id); - - int GetAssetPermissions(string userID, UUID assetID, UUID session_id); - - } -} diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs deleted file mode 100644 index f86b453..0000000 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using log4net; -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Nini.Config; -using OpenSim.Framework; -using OpenSim.Framework.Servers.HttpServer; -using OpenSim.Services.Interfaces; -using OpenMetaverse; - -namespace OpenSim.Services.Connectors -{ - public class InventoryServicesConnector : ISessionAuthInventoryService - { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); - - private string m_ServerURI = String.Empty; - - private Dictionary m_RequestingInventory = new Dictionary(); - private Dictionary m_RequestTime = new Dictionary(); - - public InventoryServicesConnector() - { - } - - public InventoryServicesConnector(string serverURI) - { - m_ServerURI = serverURI.TrimEnd('/'); - } - - public InventoryServicesConnector(IConfigSource source) - { - Initialise(source); - } - - public virtual void Initialise(IConfigSource source) - { - IConfig inventoryConfig = source.Configs["InventoryService"]; - if (inventoryConfig == null) - { - m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); - throw new Exception("InventoryService missing from OpenSim.ini"); - } - - string serviceURI = inventoryConfig.GetString("InventoryServerURI", - String.Empty); - - if (serviceURI == String.Empty) - { - m_log.Error("[INVENTORY CONNECTOR]: No Server URI named in section InventoryService"); - throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); - } - m_ServerURI = serviceURI.TrimEnd('/'); - } - - #region ISessionAuthInventoryService - - public string Host - { - get { return m_ServerURI; } - } - - /// - /// Caller must catch eventual Exceptions. - /// - /// - /// - /// - public void GetUserInventory(string userIDStr, UUID sessionID, InventoryReceiptCallback callback) - { - UUID userID = UUID.Zero; - if (UUID.TryParse(userIDStr, out userID)) - { - lock (m_RequestingInventory) - { - // *HACK ALERT* - - // If an inventory request times out, it blocks any further requests from the - // same user, even after a relog. This is bad, and makes me sad. - - // Really, we should detect a timeout and report a failure to the callback, - // BUT in my testing i found that it's hard to detect a timeout.. sometimes, - // a partial response is recieved, and sometimes a null response. - - // So, for now, add a timer of ten seconds (which is the request timeout). - - // This should basically have the same effect. - - lock (m_RequestTime) - { - if (m_RequestTime.ContainsKey(userID)) - { - TimeSpan interval = DateTime.Now - m_RequestTime[userID]; - if (interval.TotalSeconds > 10) - { - m_RequestTime.Remove(userID); - if (m_RequestingInventory.ContainsKey(userID)) - { - m_RequestingInventory.Remove(userID); - } - } - } - if (!m_RequestingInventory.ContainsKey(userID)) - { - m_RequestTime.Add(userID, DateTime.Now); - m_RequestingInventory.Add(userID, callback); - } - else - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetUserInventory - ignoring repeated request for user {0}", userID); - return; - } - } - } - - m_log.InfoFormat( - "[INVENTORY CONNECTOR]: Requesting inventory from {0}/GetInventory/ for user {1}", - m_ServerURI, userID); - - RestSessionObjectPosterResponse requester - = new RestSessionObjectPosterResponse(); - requester.ResponseCallback = InventoryResponse; - - requester.BeginPostObject(m_ServerURI + "/GetInventory/", userID.Guid, sessionID.ToString(), userID.ToString()); - } - } - - /// - /// Gets the user folder for the given folder-type - /// - /// - /// - /// - public Dictionary GetSystemFolders(string userID, UUID sessionID) - { - List folders = null; - Dictionary dFolders = new Dictionary(); - try - { - folders = SynchronousRestSessionObjectPoster>.BeginPostObject( - "POST", m_ServerURI + "/SystemFolders/", new Guid(userID), sessionID.ToString(), userID.ToString()); - - foreach (InventoryFolderBase f in folders) - dFolders[(AssetType)f.Type] = f; - - return dFolders; - } - catch (Exception e) - { - // Maybe we're talking to an old inventory server. Try this other thing. - m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1} (old sever?). Trying GetInventory.", - e.Source, e.Message); - - try - { - InventoryCollection inventory = SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/GetInventory/", new Guid(userID), sessionID.ToString(), userID.ToString()); - folders = inventory.Folders; - } - catch (Exception ex) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetInventory operation also failed, {0} {1}. Giving up.", - e.Source, ex.Message); - } - - if ((folders != null) && (folders.Count > 0)) - { - m_log.DebugFormat("[INVENTORY CONNECTOR]: Received entire inventory ({0} folders) for user {1}", - folders.Count, userID); - foreach (InventoryFolderBase f in folders) - { - if ((f.Type != (short)AssetType.Folder) && (f.Type != (short)AssetType.Unknown)) - dFolders[(AssetType)f.Type] = f; - } - - UUID rootFolderID = dFolders[AssetType.Animation].ParentID; - InventoryFolderBase rootFolder = new InventoryFolderBase(rootFolderID, new UUID(userID)); - rootFolder = QueryFolder(userID, rootFolder, sessionID); - dFolders[AssetType.Folder] = rootFolder; - m_log.DebugFormat("[INVENTORY CONNECTOR]: {0} system folders for user {1}", dFolders.Count, userID); - return dFolders; - } - } - - return new Dictionary(); - } - - /// - /// Gets everything (folders and items) inside a folder - /// - /// - /// - /// - public InventoryCollection GetFolderContent(string userID, UUID folderID, UUID sessionID) - { - try - { - // normal case - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/GetFolderContent/", folderID.Guid, sessionID.ToString(), userID.ToString()); - } - catch (TimeoutException e) - { - m_log.ErrorFormat( - "[INVENTORY CONNECTOR]: GetFolderContent operation to {0} for {1} timed out {2} {3}.", - m_ServerURI, folderID, e.Source, e.Message); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation failed for {0}, {1} {2} (old server?).", - folderID, e.Source, e.Message); - } - - InventoryCollection nullCollection = new InventoryCollection(); - nullCollection.Folders = new List(); - nullCollection.Items = new List(); - nullCollection.UserID = new UUID(userID); - return nullCollection; - } - - public bool AddFolder(string userID, InventoryFolderBase folder, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/NewFolder/", folder, sessionID.ToString(), folder.Owner.ToString()); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Add new inventory folder operation failed for {0} {1}, {2} {3}", - folder.Name, folder.ID, e.Source, e.Message); - } - - return false; - } - - public bool UpdateFolder(string userID, InventoryFolderBase folder, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/UpdateFolder/", folder, sessionID.ToString(), folder.Owner.ToString()); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Update inventory folder operation failed for {0} {1}, {2} {3}", - folder.Name, folder.ID, e.Source, e.Message); - } - - return false; - } - - public bool DeleteFolders(string userID, List folderIDs, UUID sessionID) - { - try - { - List guids = new List(); - foreach (UUID u in folderIDs) - guids.Add(u.Guid); - return SynchronousRestSessionObjectPoster, bool>.BeginPostObject( - "POST", m_ServerURI + "/DeleteFolders/", guids, sessionID.ToString(), userID); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Delete inventory folders operation failed, {0} {1}", - e.Source, e.Message); - } - - return false; - } - - public bool MoveFolder(string userID, InventoryFolderBase folder, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/MoveFolder/", folder, sessionID.ToString(), folder.Owner.ToString()); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Move inventory folder operation failed for {0} {1}, {2} {3}", - folder.Name, folder.ID, e.Source, e.Message); - } - - return false; - } - - public bool PurgeFolder(string userID, InventoryFolderBase folder, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/PurgeFolder/", folder, sessionID.ToString(), folder.Owner.ToString()); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Purge inventory folder operation failed for {0} {1}, {2} {3}", - folder.Name, folder.ID, e.Source, e.Message); - } - - return false; - } - - public List GetFolderItems(string userID, UUID folderID, UUID sessionID) - { - try - { - InventoryFolderBase folder = new InventoryFolderBase(folderID, new UUID(userID)); - return SynchronousRestSessionObjectPoster>.BeginPostObject( - "POST", m_ServerURI + "/GetItems/", folder, sessionID.ToString(), userID); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Get folder items operation failed for folder {0}, {1} {2}", - folderID, e.Source, e.Message); - } - - return null; - } - - public bool AddItem(string userID, InventoryItemBase item, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/NewItem/", item, sessionID.ToString(), item.Owner.ToString()); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Add new inventory item operation failed for {0} {1}, {2} {3}", - item.Name, item.ID, e.Source, e.Message); - } - - return false; - } - - public bool UpdateItem(string userID, InventoryItemBase item, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/NewItem/", item, sessionID.ToString(), item.Owner.ToString()); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Update new inventory item operation failed for {0} {1}, {2} {3}", - item.Name, item.ID, e.Source, e.Message); - } - - return false; - } - - /** - * MoveItems Async group - */ - - delegate void MoveItemsDelegate(string userID, List items, UUID sessionID); - - private void MoveItemsAsync(string userID, List items, UUID sessionID) - { - if (items == null) - { - m_log.WarnFormat("[INVENTORY CONNECTOR]: request to move items got a null list."); - return; - } - - try - { - //SynchronousRestSessionObjectPoster, bool>.BeginPostObject( - // "POST", m_ServerURI + "/MoveItems/", items, sessionID.ToString(), userID.ToString()); - - //// Success - //return; - string uri = m_ServerURI + "/inventory/" + userID; - if (SynchronousRestObjectRequester. - MakeRequest, bool>("PUT", uri, items)) - m_log.DebugFormat("[INVENTORY CONNECTOR]: move {0} items poster succeeded {1}", items.Count, uri); - else - m_log.DebugFormat("[INVENTORY CONNECTOR]: move {0} items poster failed {1}", items.Count, uri); ; - - return; - - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Move inventory items operation failed, {0} {1} (old server?). Trying slow way.", - e.Source, e.Message); - } - - } - - private void MoveItemsCompleted(IAsyncResult iar) - { - MoveItemsDelegate d = (MoveItemsDelegate)iar.AsyncState; - d.EndInvoke(iar); - } - - public bool MoveItems(string userID, List items, UUID sessionID) - { - MoveItemsDelegate d = MoveItemsAsync; - d.BeginInvoke(userID, items, sessionID, MoveItemsCompleted, d); - return true; - } - - public bool DeleteItems(string userID, List items, UUID sessionID) - { - try - { - List guids = new List(); - foreach (UUID u in items) - guids.Add(u.Guid); - return SynchronousRestSessionObjectPoster, bool>.BeginPostObject( - "POST", m_ServerURI + "/DeleteItem/", guids, sessionID.ToString(), userID); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Delete inventory items operation failed, {0} {1}", - e.Source, e.Message); - } - - return false; - } - - public InventoryItemBase QueryItem(string userID, InventoryItemBase item, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/QueryItem/", item, sessionID.ToString(), item.Owner.ToString()); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Query inventory item operation failed, {0} {1}", - e.Source, e.Message); - } - - return null; - } - - public InventoryFolderBase QueryFolder(string userID, InventoryFolderBase folder, UUID sessionID) - { - try - { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/QueryFolder/", folder, sessionID.ToString(), userID); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Query inventory folder operation failed, {0} {1}", - e.Source, e.Message); - } - - return null; - } - - public int GetAssetPermissions(string userID, UUID assetID, UUID sessionID) - { - try - { - InventoryItemBase item = new InventoryItemBase(); - item.Owner = new UUID(userID); - item.AssetID = assetID; - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/AssetPermissions/", item, sessionID.ToString(), userID); - } - catch (Exception e) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: AssetPermissions operation failed, {0} {1}", - e.Source, e.Message); - } - - return 0; - } - - #endregion - - /// - /// Callback used by the inventory server GetInventory request - /// - /// - private void InventoryResponse(InventoryCollection response) - { - UUID userID = response.UserID; - InventoryReceiptCallback callback = null; - lock (m_RequestingInventory) - { - if (m_RequestingInventory.ContainsKey(userID)) - { - callback = m_RequestingInventory[userID]; - m_RequestingInventory.Remove(userID); - lock (m_RequestTime) - { - if (m_RequestTime.ContainsKey(userID)) - { - m_RequestTime.Remove(userID); - } - } - } - else - { - m_log.WarnFormat( - "[INVENTORY CONNECTOR]: " + - "Received inventory response for {0} for which we do not have a record of requesting!", - userID); - return; - } - } - - m_log.InfoFormat("[INVENTORY CONNECTOR]: " + - "Received inventory response for user {0} containing {1} folders and {2} items", - userID, response.Folders.Count, response.Items.Count); - - InventoryFolderImpl rootFolder = null; - - ICollection folders = new List(); - ICollection items = new List(); - - foreach (InventoryFolderBase folder in response.Folders) - { - if (folder.ParentID == UUID.Zero) - { - rootFolder = new InventoryFolderImpl(folder); - folders.Add(rootFolder); - - break; - } - } - - if (rootFolder != null) - { - foreach (InventoryFolderBase folder in response.Folders) - { - if (folder.ID != rootFolder.ID) - { - folders.Add(new InventoryFolderImpl(folder)); - } - } - - foreach (InventoryItemBase item in response.Items) - { - items.Add(item); - } - } - else - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: Did not get back an inventory containing a root folder for user {0}", userID); - } - - callback(folders, items); - } - } -} diff --git a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs deleted file mode 100644 index a7aa138..0000000 --- a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using log4net; -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Nini.Config; -using OpenSim.Framework; -using OpenSim.Framework.Servers.HttpServer; -using OpenSim.Services.Interfaces; -using OpenMetaverse; - -namespace OpenSim.Services.Connectors -{ - /// - /// This connector is temporary. It's used by the user server, before that server is refactored. - /// - public class QuickAndDirtyInventoryServiceConnector : IInventoryService - { -// private static readonly ILog m_log = -// LogManager.GetLogger( -// MethodBase.GetCurrentMethod().DeclaringType); - - private string m_ServerURI = String.Empty; - - //private Dictionary m_RequestingInventory = new Dictionary(); - - public QuickAndDirtyInventoryServiceConnector() - { - } - - public QuickAndDirtyInventoryServiceConnector(string serverURI) - { - m_ServerURI = serverURI.TrimEnd('/'); - } - - /// - /// - /// - /// - /// - public bool CreateUserInventory(UUID userId) - { - return SynchronousRestObjectPoster.BeginPostObject( - "POST", m_ServerURI + "CreateInventory/", userId.Guid); - } - - /// - /// - /// - /// - /// - public List GetInventorySkeleton(UUID userId) - { - return SynchronousRestObjectPoster.BeginPostObject>( - "POST", m_ServerURI + "RootFolders/", userId.Guid); - } - - /// - /// Returns a list of all the active gestures in a user's inventory. - /// - /// - /// The of the user - /// - /// - /// A flat list of the gesture items. - /// - public List GetActiveGestures(UUID userId) - { - return SynchronousRestObjectPoster.BeginPostObject>( - "POST", m_ServerURI + "ActiveGestures/", userId.Guid); - } - - public InventoryCollection GetUserInventory(UUID userID) - { - return null; - } - - public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) - { - } - - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) - { - return null; - } - - public InventoryCollection GetFolderContent(UUID userID, UUID folderID) - { - return null; - } - - public List GetFolderItems(UUID userID, UUID folderID) - { - return null; - } - - public bool AddFolder(InventoryFolderBase folder) - { - return false; - } - - public bool UpdateFolder(InventoryFolderBase folder) - { - return false; - } - - public bool MoveFolder(InventoryFolderBase folder) - { - return false; - } - - public bool DeleteFolders(UUID ownerID, List folderIDs) - { - return false; - } - - - public bool PurgeFolder(InventoryFolderBase folder) - { - return false; - } - - public bool AddItem(InventoryItemBase item) - { - return false; - } - - public bool UpdateItem(InventoryItemBase item) - { - return false; - } - - public bool MoveItems(UUID ownerID, List items) - { - return false; - } - - public bool DeleteItems(UUID owner, List itemIDs) - { - return false; - } - - public InventoryItemBase GetItem(InventoryItemBase item) - { - return null; - } - - public InventoryFolderBase GetFolder(InventoryFolderBase folder) - { - return null; - } - - public bool HasInventoryForUser(UUID userID) - { - return false; - } - - public InventoryFolderBase GetRootFolder(UUID userID) - { - return null; - } - - public int GetAssetPermissions(UUID userID, UUID assetID) - { - return 0; - } - - } -} -- cgit v1.1