From 71d991fe8a4cfd0c267d4f32bbab88c02247e9c6 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Sat, 4 Jun 2011 19:56:36 -0700 Subject: [PATCH] Added a cache to message transfer module for UUID->GridRegion data --- .../InstantMessage/MessageTransferModule.cs | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index bfb97dd44b..b88bdbb2b7 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs @@ -48,7 +48,8 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage private bool m_Enabled = false; protected List m_Scenes = new List(); - protected Dictionary m_UserRegionMap = new Dictionary(); + protected Dictionary m_UserRegionMap = new Dictionary(); + protected Dictionary m_RegionInfoMap = new Dictionary(); public event UndeliveredMessage OnUndeliveredMessage; @@ -535,9 +536,22 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage } if (upd != null) - { - GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, - upd.RegionID); + { + GridRegion reginfo = null; + // Try to pull reginfo from our cache + lock (m_RegionInfoMap) + { + if (!m_RegionInfoMap.TryGetValue(upd.RegionID, out reginfo)) + reginfo = null; + } + + // If it wasn't there, then look it up from grid. + if (reginfo == null) + { + reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, upd.RegionID); + } + + // If we found the reginfo, send the IM to the region if (reginfo != null) { Hashtable msgdata = ConvertGridInstantMessageToXMLRPC(im); @@ -559,6 +573,13 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage { m_UserRegionMap.Add(toAgentID, upd.RegionID); } + } + lock (m_RegionInfoMap) + { + // Since we never look it up again, we don't need to update it + // but if it's not in the map yet, add it now. + if (!m_RegionInfoMap.ContainsKey(upd.RegionID)) + m_RegionInfoMap.Add(upd.RegionID, reginfo); } result(true); }