From 703e96b4cbaec3b499284accaeb1f6242e71d7e5 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 31 Jul 2016 19:08:35 +0100 Subject: [PATCH] Change RegionInfoCache again... --- .../Grid/LocalGridServiceConnector.cs | 14 +- .../Grid/RegionInfoCache.cs | 684 ++++++++++-------- .../Grid/RemoteGridServiceConnector.cs | 14 +- 3 files changed, 401 insertions(+), 311 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs index d38ac9bc9b..7d8ae575ce 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs @@ -166,7 +166,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (!m_Enabled) return; - m_RegionInfoCache.Remove(scene.RegionInfo.ScopeID, scene.RegionInfo.RegionID); + m_RegionInfoCache.Remove(scene.RegionInfo.ScopeID, scene.RegionInfo.RegionHandle); scene.EventManager.OnRegionUp -= OnRegionUp; } @@ -220,16 +220,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid // be the base coordinate of the region. public GridRegion GetRegionByPosition(UUID scopeID, int x, int y) { + // try in cache by handler first - ulong regionHandle = Util.RegionWorldLocToHandle((uint)x, (uint)y); +// ulong regionHandle = Util.RegionWorldLocToHandle((uint)x, (uint)y); bool inCache = false; - GridRegion rinfo = m_RegionInfoCache.Get(scopeID, regionHandle, out inCache); - if (inCache) - return rinfo; +// GridRegion rinfo = m_RegionInfoCache.Get(scopeID, regionHandle, out inCache); +// if (inCache) +// return rinfo; - // try in cache by slower position next - rinfo = m_RegionInfoCache.Get(scopeID, x, y, out inCache); + GridRegion rinfo = m_RegionInfoCache.Get(scopeID, (uint)x, (uint)y, out inCache); if (inCache) return rinfo; diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs index 8f3dfc1a2c..03fc9eae51 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs @@ -44,11 +44,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid // LogManager.GetLogger( // MethodBase.GetCurrentMethod().DeclaringType); - private RegionsExpiringCache m_Cache; + private static RegionsExpiringCache m_Cache; + private int numberInstances; public RegionInfoCache() { - m_Cache = new RegionsExpiringCache(); + if(m_Cache == null) + m_Cache = new RegionsExpiringCache(); + numberInstances++; } public void Cache(GridRegion rinfo) @@ -78,8 +81,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (rinfo == null) return; -// m_Cache.AddOrUpdate(scopeID, rinfo, CACHE_EXPIRATION_SECONDS); - m_Cache.Add(scopeID, rinfo, CACHE_EXPIRATION_SECONDS); // don't override local regions + m_Cache.AddOrUpdate(scopeID, rinfo, CACHE_EXPIRATION_SECONDS); } public void Cache(UUID scopeID, GridRegion rinfo, float expireSeconds) @@ -90,9 +92,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid m_Cache.AddOrUpdate(scopeID, rinfo, expireSeconds); } - public void Remove(UUID scopeID, UUID regionID) + public void Remove(UUID scopeID, GridRegion rinfo) { - m_Cache.Remove(scopeID, regionID); + m_Cache.Remove(scopeID, rinfo); + } + + public void Remove(UUID scopeID, ulong regionHandle) + { + m_Cache.Remove(scopeID, regionHandle); } public GridRegion Get(UUID scopeID, UUID regionID, out bool inCache) @@ -137,7 +144,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid return null; } - public GridRegion Get(UUID scopeID, int x, int y, out bool inCache) + public GridRegion Get(UUID scopeID, uint x, uint y, out bool inCache) { inCache = false; @@ -152,109 +159,281 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid } } - - // following code partialy adapted from lib OpenMetaverse - public class RegionKey + public class RegionInfoForScope { - public UUID ScopeID; - public UUID RegionID; + public const ulong HANDLEMASH = 0xffffff00ffffff00ul; + public const ulong HANDLECOORDMASH = 0xffffff00ul; - public RegionKey(UUID scopeID, UUID id) + private Dictionary storage; + private Dictionary expires; + private Dictionary byname; + private Dictionary byuuid; + + public RegionInfoForScope() { - ScopeID = scopeID; - RegionID = id; - } - - public override int GetHashCode() - { - int hash = ScopeID.GetHashCode(); - hash += hash * 23 + RegionID.GetHashCode(); - return hash; + storage = new Dictionary(); + expires = new Dictionary(); + byname = new Dictionary(); + byuuid = new Dictionary(); } - public override bool Equals(Object b) + public RegionInfoForScope(GridRegion region, DateTime expire) { - if(b == null) - return false; - RegionKey kb = b as RegionKey; - return (ScopeID == kb.ScopeID && RegionID == kb.RegionID); - } - } + storage = new Dictionary(); + expires = new Dictionary(); + byname = new Dictionary(); + byuuid = new Dictionary(); - class RegionKeyEqual : EqualityComparer - { - public override int GetHashCode(RegionKey rk) - { - return rk.GetHashCode(); + ulong handle = region.RegionHandle & HANDLEMASH; + storage[handle] = region; + expires[handle] = expire; + byname[region.RegionName] = handle; + byuuid[region.RegionID] = handle; } - public override bool Equals(RegionKey a, RegionKey b) + public void Add(GridRegion region, DateTime expire) { - return (a.ScopeID == b.ScopeID && a.RegionID == b.RegionID); - } - } + ulong handle = region.RegionHandle & HANDLEMASH; - public class RegionInfoByScope - { - private Dictionary byname; - private Dictionary byhandle; + if(storage != null && storage.ContainsKey(handle)) + return; - public RegionInfoByScope() - { - byname = new Dictionary(); - byhandle = new Dictionary(); - } - - public RegionInfoByScope(GridRegion region, RegionKey key) - { - byname = new Dictionary(); - byhandle = new Dictionary(); - - byname[region.RegionName] = key; - byhandle[region.RegionHandle] = key; - } - - public void AddRegion(GridRegion region, RegionKey key) - { + if(storage == null) + storage = new Dictionary(); + if(expires == null) + expires = new Dictionary(); if(byname == null) - byname = new Dictionary(); - if(byhandle == null) - byhandle = new Dictionary(); + byname = new Dictionary(); + if(byuuid == null) + byuuid = new Dictionary(); - byname[region.RegionName] = key; - byhandle[region.RegionHandle] = key; + storage[handle] = region; + expires[handle] = expire; + byname[region.RegionName] = handle; + byuuid[region.RegionID] = handle; } - public void RemoveRegion(GridRegion region) + public void AddUpdate(GridRegion region, DateTime expire) { + if(storage == null) + storage = new Dictionary(); + if(expires == null) + expires = new Dictionary(); + if(byname == null) + byname = new Dictionary(); + if(byuuid == null) + byuuid = new Dictionary(); + + ulong handle = region.RegionHandle & HANDLEMASH; + + storage[handle] = region; + if(expires.ContainsKey(handle)) + { + if(expires[handle] < expire) + expires[handle] = expire; + } + else + expires[handle] = expire; + byname[region.RegionName] = handle; + byuuid[region.RegionID] = handle; + } + + public void Remove(GridRegion region) + { + if(region == null) + return; + if(byname != null) byname.Remove(region.RegionName); - if(byhandle != null) - byhandle.Remove(region.RegionHandle); + if(byuuid != null) + byuuid.Remove(region.RegionID); + + ulong handle = region.RegionHandle & HANDLEMASH; + if(storage != null) + storage.Remove(handle); + if(expires != null) + { + expires.Remove(handle); + if(expires.Count == 0) + Clear(); + } + } + + public void Remove(ulong handle) + { + handle &= HANDLEMASH; + + if(storage != null) + { + if(storage.ContainsKey(handle)) + { + GridRegion r = storage[handle]; + if(byname != null) + byname.Remove(r.RegionName); + if(byuuid != null) + byuuid.Remove(r.RegionID); + } + storage.Remove(handle); + } + if(expires != null) + { + expires.Remove(handle); + if(expires.Count == 0) + Clear(); + } } public void Clear() { + if(expires != null) + expires.Clear(); + if(storage != null) + storage.Clear(); if(byname != null) byname.Clear(); - if(byhandle != null) - byhandle.Clear(); + if(byuuid != null) + byuuid.Clear(); byname = null; - byhandle = null; + byuuid = null; + storage = null; + expires = null; } - public RegionKey get(string name) + public bool Contains(GridRegion region) + { + if(storage == null) + return false; + if(region == null) + return false; + + ulong handle = region.RegionHandle & HANDLEMASH; + return storage.ContainsKey(handle); + } + + public bool Contains(ulong handle) + { + if(storage == null) + return false; + + handle &= HANDLEMASH; + return storage.ContainsKey(handle); + } + + public GridRegion get(ulong handle) + { + if(storage == null) + return null; + + handle &= HANDLEMASH; + if(storage.ContainsKey(handle)) + return storage[handle]; + + return null; + } + + public GridRegion get(string name) { if(byname == null || !byname.ContainsKey(name)) return null; - return byname[name]; + + ulong handle = byname[name]; + if(storage.ContainsKey(handle)) + return storage[handle]; + return null; } - public RegionKey get(ulong handle) + public GridRegion get(UUID id) { - if(byhandle == null || !byhandle.ContainsKey(handle)) + if(byuuid == null || !byuuid.ContainsKey(id)) return null; - return byhandle[handle]; + + ulong handle = byuuid[id]; + if(storage.ContainsKey(handle)) + return storage[handle]; + return null; + } + + public GridRegion get(uint x, uint y) + { + if(storage == null) + return null; + + // look for a handle first this should find normal size regions + ulong handle = (ulong)x & HANDLECOORDMASH; + handle <<= 32; + handle |= ((ulong)y & HANDLECOORDMASH); + + if(storage.ContainsKey(handle)) + return storage[handle]; + + // next do the harder work + foreach(KeyValuePair kvp in storage) + { + GridRegion r = kvp.Value; + if(r == null) // ?? + continue; + + if(handle < r.RegionHandle) + continue; + int test = r.RegionLocX + r.RegionSizeX; + if(x >= test) + continue; + test = r.RegionLocY + r.RegionSizeY; + if (y < test) + return r; + } + return null; + } + + public int expire(DateTime now ) + { + if(expires == null || expires.Count == 0) + return 0; + + List toexpire = new List(); + foreach(KeyValuePair kvp in expires) + { + if(kvp.Value < now) + toexpire.Add(kvp.Key); + } + + if(toexpire.Count == 0) + return expires.Count; + + if(toexpire.Count == expires.Count) + { + Clear(); + return 0; + } + + foreach(ulong h in toexpire) + { + if(storage != null) + { + if(storage.ContainsKey(h)) + { + GridRegion r = storage[h]; + if(byname != null) + byname.Remove(r.RegionName); + if(byuuid != null) + byuuid.Remove(r.RegionID); + } + storage.Remove(h); + } + if(expires != null) + expires.Remove(h); + } + + if(expires.Count == 0) + { + byname = null; + byuuid = null; + storage = null; + expires = null; + return 0; + } + + return expires.Count; } public int Count() @@ -276,10 +455,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid /// For thread safety object isPurging = new object(); - static RegionKeyEqual keyequal = new RegionKeyEqual(); - Dictionary timedStorage = new Dictionary(keyequal); - Dictionary timedExpires = new Dictionary(); - Dictionary InfobyScope = new Dictionary(); + Dictionary InfobyScope = new Dictionary(); private System.Timers.Timer timer = new System.Timers.Timer(TimeSpan.FromSeconds(CACHE_PURGE_HZ).TotalMilliseconds); public RegionsExpiringCache() @@ -288,74 +464,29 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid timer.Start(); } - public bool Add(UUID scope, GridRegion region, float expirationSeconds) + public bool AddOrUpdate(UUID scope, GridRegion region, float expirationSeconds) { + if(region == null) + return false; + if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); - RegionKey key = new RegionKey(scope , region.RegionID); - try { - if (timedStorage.ContainsKey(key)) - return false; - DateTime expire = DateTime.UtcNow + TimeSpan.FromSeconds(expirationSeconds); - timedStorage[key] = region; - timedExpires[key] = expire; - RegionInfoByScope ris = null; + RegionInfoForScope ris = null; if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) { - ris = new RegionInfoByScope(region, key); + ris = new RegionInfoForScope(region, expire); InfobyScope[scope] = ris; } else - ris.AddRegion(region, key); + ris.AddUpdate(region, expire); return true; } - finally { Monitor.Exit(syncRoot);} - } - - public bool AddOrUpdate(UUID scope, GridRegion region, float expirationSeconds) - { - if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) - throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); - - try - { - RegionKey key = new RegionKey(scope, region.RegionID); - DateTime expire = DateTime.UtcNow + TimeSpan.FromSeconds(expirationSeconds); - - if (timedStorage.ContainsKey(key)) - { - timedStorage[key] = region; - if(expire > timedExpires[key]) - timedExpires[key] = expire; - - if(!InfobyScope.ContainsKey(scope)) - { - RegionInfoByScope ris = new RegionInfoByScope(region, key); - InfobyScope[scope] = ris; - } - return false; - } - else - { - timedStorage[key] = region; - timedExpires[key] = expire; - RegionInfoByScope ris = null; - if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) - { - ris = new RegionInfoByScope(region,key); - InfobyScope[scope] = ris; - } - else - ris.AddRegion(region,key); - return true; - } - } finally { Monitor.Exit(syncRoot); } } @@ -365,8 +496,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); try { - timedStorage.Clear(); - timedExpires.Clear(); + foreach(RegionInfoForScope ris in InfobyScope.Values) + ris.Clear(); InfobyScope.Clear(); } finally { Monitor.Exit(syncRoot); } @@ -374,211 +505,184 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public bool Contains(UUID scope, GridRegion region) { - RegionKey key = new RegionKey(scope, region.RegionID); - return Contains(key); - } + if(region == null) + return false; - public bool Contains(RegionKey key) - { if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + try - { - return timedStorage.ContainsKey(key); + { + RegionInfoForScope ris = null; + if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) + return false; + + return ris.Contains(region); } finally { Monitor.Exit(syncRoot); } } - public int Count + public bool Contains(UUID scope, ulong handle) { - get - { - return timedStorage.Count; + if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) + throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + + try + { + RegionInfoForScope ris = null; + if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) + return false; + + return ris.Contains(handle); } + finally { Monitor.Exit(syncRoot); } } + + public int Count() + { + if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) + throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + + try + { + int count = 0; + foreach(RegionInfoForScope ris in InfobyScope.Values) + count += ris.Count(); + return count; + } + finally { Monitor.Exit(syncRoot); } + } + + public bool Remove(UUID scope, ulong handle) + { + if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) + throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + try + { + RegionInfoForScope ris = null; + if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) + return false; + + ris.Remove(handle); + if(ris.Count() == 0) + InfobyScope.Remove(scope); + return true; + } + finally { Monitor.Exit(syncRoot); } + } + public bool Remove(UUID scope, GridRegion region) { - return Remove(scope, region.RegionID); - } - public bool Remove(UUID scope, UUID regionID) - { - RegionKey key = new RegionKey(scope, regionID); + if(region == null) + return false; if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); try { - if (timedStorage.ContainsKey(key)) - { - RegionInfoByScope ris = null; - if(InfobyScope.TryGetValue(scope, out ris) && ris != null) - { - GridRegion r = timedStorage[key]; - if(r != null) - ris.RemoveRegion(r); - if(ris.Count() == 0) - InfobyScope.Remove(scope); - } - timedStorage.Remove(key); - timedExpires.Remove(key); - return true; - } - else - return false; - } - finally { Monitor.Exit(syncRoot); } - } - - public bool TryGetValue(RegionKey key, out GridRegion value) - { - if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) - throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); - try - { - if (timedStorage.ContainsKey(key)) - { - value = timedStorage[key]; - return true; - } - } - finally { Monitor.Exit(syncRoot); } - - value = null; - return false; - } - - public bool TryGetValue(UUID scope, UUID id, out GridRegion value) - { - if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) - throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); - try - { - RegionKey rk = new RegionKey(scope, id); - if(timedStorage.ContainsKey(rk)) - { - value = timedStorage[rk]; - return true; - } - } - finally { Monitor.Exit(syncRoot); } - - value = null; - return false; - } - - public bool TryGetValue(UUID scope, string name, out GridRegion value) - { - if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) - throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); - try - { - value = null; - RegionInfoByScope ris = null; + RegionInfoForScope ris = null; if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) return false; - RegionKey key = ris.get(name); - if(key == null) - return false; - - if(timedStorage.ContainsKey(key)) - { - value = timedStorage[key]; - return true; - } + ris.Remove(region); + if(ris.Count() == 0) + InfobyScope.Remove(scope); + return true; } finally { Monitor.Exit(syncRoot); } - - return false; } public bool TryGetValue(UUID scope, ulong handle, out GridRegion value) { if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + + value = null; try { - value = null; - RegionInfoByScope ris = null; + RegionInfoForScope ris = null; if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) return false; - - RegionKey key = ris.get(handle); - if(key == null) - return false; - - if(timedStorage.ContainsKey(key)) - { - value = timedStorage[key]; - return true; - } + value = ris.get(handle); } finally { Monitor.Exit(syncRoot); } + return value != null; + } + + public bool TryGetValue(UUID scope, string name, out GridRegion value) + { + if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) + throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + value = null; - return false; + try + { + RegionInfoForScope ris = null; + if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) + return false; + value = ris.get(name); + } + finally { Monitor.Exit(syncRoot); } + + return value != null; + } + + public bool TryGetValue(UUID scope, UUID id, out GridRegion value) + { + if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) + throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + + value = null; + try + { + RegionInfoForScope ris = null; + if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) + return false; + value = ris.get(id); + } + finally { Monitor.Exit(syncRoot); } + + return value != null; } // gets a region that contains world position (x,y) // hopefull will not take ages - public bool TryGetValue(UUID scope, int x, int y, out GridRegion value) + public bool TryGetValue(UUID scope, uint x, uint y, out GridRegion value) { if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); + + value = null; try { - value = null; - - if(timedStorage.Count == 0) + RegionInfoForScope ris = null; + if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) return false; - foreach(KeyValuePair kvp in timedStorage) - { - if(kvp.Key.ScopeID != scope) - continue; - - GridRegion r = kvp.Value; - if(r == null) // ?? - continue; - int test = r.RegionLocX; - if(x < test) - continue; - test += r.RegionSizeX; - if(x >= test) - continue; - test = r.RegionLocY; - if(y < test) - continue; - test += r.RegionSizeY; - if (y < test) - { - value = r; - return true; - } - } + value = ris.get(x, y); } finally { Monitor.Exit(syncRoot); } - value = null; - return false; + return value != null; } public bool Update(UUID scope, GridRegion region, double expirationSeconds) { + if(region == null) + return false; + if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); - RegionKey key = new RegionKey(scope, region.RegionID); try { - if (!timedStorage.ContainsKey(key)) + RegionInfoForScope ris = null; + if(!InfobyScope.TryGetValue(scope, out ris) || ris == null) return false; DateTime expire = DateTime.UtcNow + TimeSpan.FromSeconds(expirationSeconds); - timedStorage[key] = region; - if(expire > timedExpires[key]) - timedExpires[key] = expire; - + ris.AddUpdate(region,expire); return true; } finally { Monitor.Exit(syncRoot); } @@ -595,7 +699,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (!Monitor.TryEnter(isPurging)) return; - DateTime signalTime = DateTime.UtcNow; + DateTime now = DateTime.UtcNow; try { @@ -604,32 +708,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid return; try { - List expiredkeys = new List(); + List expiredscopes = new List(); - foreach (KeyValuePair kvp in timedExpires) + foreach (KeyValuePair kvp in InfobyScope) { - if (kvp.Value < signalTime) - expiredkeys.Add(kvp.Key); + if (kvp.Value.expire(now) == 0) + expiredscopes.Add(kvp.Key); } - if (expiredkeys.Count > 0) + if (expiredscopes.Count > 0) { - RegionInfoByScope ris; - foreach (RegionKey key in expiredkeys) - { - ris = null; - if(InfobyScope.TryGetValue(key.ScopeID, out ris) && ris != null) - { - GridRegion r = timedStorage[key]; - if(r != null) - ris.RemoveRegion(r); - - if(ris.Count() == 0) - InfobyScope.Remove(key.ScopeID); - } - timedStorage.Remove(key); - timedExpires.Remove(key); - } + foreach (UUID sid in expiredscopes) + InfobyScope.Remove(sid); } } finally { Monitor.Exit(syncRoot); } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs index 96ff4b3bc4..e6e3abb61e 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs @@ -204,8 +204,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid GridRegion rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y); if (rinfo != null) { - m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Added region {0} to the cache from local. Pos=<{1},{2}>, RegionHandle={3}", - rinfo.RegionName, rinfo.RegionCoordX, rinfo.RegionCoordY, rinfo.RegionHandle); +// m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Found region {0} on local. Pos=<{1},{2}>, RegionHandle={3}", +// rinfo.RegionName, rinfo.RegionCoordX, rinfo.RegionCoordY, rinfo.RegionHandle); return rinfo; } @@ -213,16 +213,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (rinfo == null) { - uint regionX = Util.WorldToRegionLoc((uint)x); - uint regionY = Util.WorldToRegionLoc((uint)y); - m_log.WarnFormat("[REMOTE GRID CONNECTOR]: Requested region {0}-{1} not found", regionX, regionY); +// uint regionX = Util.WorldToRegionLoc((uint)x); +// uint regionY = Util.WorldToRegionLoc((uint)y); +// m_log.WarnFormat("[REMOTE GRID CONNECTOR]: Requested region {0}-{1} not found", regionX, regionY); } else { m_RegionInfoCache.Cache(scopeID, rinfo); - m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Added region {0} to the cache. Pos=<{1},{2}>, RegionHandle={3}", - rinfo.RegionName, rinfo.RegionCoordX, rinfo.RegionCoordY, rinfo.RegionHandle); +// m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Added region {0} to the cache. Pos=<{1},{2}>, RegionHandle={3}", +// rinfo.RegionName, rinfo.RegionCoordX, rinfo.RegionCoordY, rinfo.RegionHandle); } return rinfo; }