aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorUbitUmarov2016-07-30 03:13:23 +0100
committerUbitUmarov2016-07-30 03:13:23 +0100
commit202212bcbcb64ad1889025dedc34b48d0704de96 (patch)
tree2168c87892f518991c9d95855b93243ec7e57add /OpenSim/Region
parentin RegionInfoCache, replace lib omv ExpireCaches by a single dedicated one (diff)
downloadopensim-SC_OLD-202212bcbcb64ad1889025dedc34b48d0704de96.zip
opensim-SC_OLD-202212bcbcb64ad1889025dedc34b48d0704de96.tar.gz
opensim-SC_OLD-202212bcbcb64ad1889025dedc34b48d0704de96.tar.bz2
opensim-SC_OLD-202212bcbcb64ad1889025dedc34b48d0704de96.tar.xz
add a regionInfoCache get by world 2D position
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs63
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs24
2 files changed, 71 insertions, 16 deletions
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs
index 4dc9033..8403362 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs
@@ -109,6 +109,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
109 109
110 return null; 110 return null;
111 } 111 }
112
113 public GridRegion Get(UUID scopeID, int x, int y, out bool inCache)
114 {
115 inCache = false;
116
117 GridRegion rinfo = null;
118 if (m_Cache.TryGetValue(scopeID, x, y, out rinfo))
119 {
120 inCache = true;
121 return rinfo;
122 }
123
124 return null;
125 }
126
112 } 127 }
113 128
114 129
@@ -222,8 +237,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
222 237
223 public sealed class RegionsExpiringCache 238 public sealed class RegionsExpiringCache
224 { 239 {
225 const double CACHE_PURGE_HZ = 60; 240 const double CACHE_PURGE_HZ = 60; // seconds
226 const int MAX_LOCK_WAIT = 5000; // milliseconds 241 const int MAX_LOCK_WAIT = 10000; // milliseconds
227 242
228 /// <summary>For thread safety</summary> 243 /// <summary>For thread safety</summary>
229 object syncRoot = new object(); 244 object syncRoot = new object();
@@ -463,6 +478,50 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
463 return false; 478 return false;
464 } 479 }
465 480
481 // gets a region that contains world position (x,y)
482 // hopefull will not take ages
483 public bool TryGetValue(UUID scope, int x, int y, out GridRegion value)
484 {
485 if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT))
486 throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms");
487 try
488 {
489 value = null;
490
491 if(timedStorage.Count == 0)
492 return false;
493
494 foreach(KeyValuePair<RegionKey, GridRegion> kvp in timedStorage)
495 {
496 if(kvp.Key.ScopeID != scope)
497 continue;
498
499 GridRegion r = kvp.Value;
500 if(r == null) // ??
501 continue;
502 int test = r.RegionLocX;
503 if(x < test)
504 continue;
505 test += r.RegionSizeX;
506 if(x >= test)
507 continue;
508 test = r.RegionLocY;
509 if(y < test)
510 continue;
511 test += r.RegionSizeY;
512 if (y < test)
513 {
514 value = r;
515 return true;
516 }
517 }
518 }
519 finally { Monitor.Exit(syncRoot); }
520
521 value = null;
522 return false;
523 }
524
466 public bool Update(UUID scope, GridRegion region, double expirationSeconds) 525 public bool Update(UUID scope, GridRegion region, double expirationSeconds)
467 { 526 {
468 if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) 527 if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT))
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
index 9e27abe..1e1e8f8 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -193,26 +193,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
193 // The coordinates are world coords (meters), NOT region units. 193 // The coordinates are world coords (meters), NOT region units.
194 public GridRegion GetRegionByPosition(UUID scopeID, int x, int y) 194 public GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
195 { 195 {
196 // try in cache by handler first
196 ulong regionHandle = Util.RegionWorldLocToHandle((uint)x, (uint)y); 197 ulong regionHandle = Util.RegionWorldLocToHandle((uint)x, (uint)y);
197 uint regionX = Util.WorldToRegionLoc((uint)x);
198 uint regionY = Util.WorldToRegionLoc((uint)y);
199 198
200/* this is no longer valid
201 // Sanity check
202 if ((Util.RegionToWorldLoc(regionX) != (uint)x) || (Util.RegionToWorldLoc(regionY) != (uint)y))
203 {
204 m_log.WarnFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Bad position requested: not the base of the region. Requested Pos=<{0},{1}>, Should Be=<{2},{3}>",
205 x, y, Util.RegionToWorldLoc(regionX), Util.RegionToWorldLoc(regionY));
206 }
207*/
208 bool inCache = false; 199 bool inCache = false;
209 GridRegion rinfo = m_RegionInfoCache.Get(scopeID, regionHandle, out inCache); 200 GridRegion rinfo = m_RegionInfoCache.Get(scopeID, regionHandle, out inCache);
210 if (inCache) 201 if (inCache)
211 {
212// m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Found region {0} in cache. Pos=<{1},{2}>, RegionHandle={3}",
213// (rinfo == null) ? "<missing>" : rinfo.RegionName, regionX, regionY, (rinfo == null) ? regionHandle : rinfo.RegionHandle);
214 return rinfo; 202 return rinfo;
215 } 203
204 // try in cache by slower position next
205 rinfo = m_RegionInfoCache.Get(scopeID, x, y, out inCache);
206 if (inCache)
207 return rinfo;
216 208
217 rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y); 209 rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y);
218 if (rinfo == null) 210 if (rinfo == null)
@@ -221,7 +213,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
221 m_RegionInfoCache.Cache(rinfo); 213 m_RegionInfoCache.Cache(rinfo);
222 214
223 if (rinfo == null) 215 if (rinfo == null)
216 {
217 uint regionX = Util.WorldToRegionLoc((uint)x);
218 uint regionY = Util.WorldToRegionLoc((uint)y);
224 m_log.WarnFormat("[REMOTE GRID CONNECTOR]: Requested region {0}-{1} not found", regionX, regionY); 219 m_log.WarnFormat("[REMOTE GRID CONNECTOR]: Requested region {0}-{1} not found", regionX, regionY);
220 }
225 else 221 else
226 m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Added region {0} to the cache. Pos=<{1},{2}>, RegionHandle={3}", 222 m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Added region {0} to the cache. Pos=<{1},{2}>, RegionHandle={3}",
227 rinfo.RegionName, rinfo.RegionCoordX, rinfo.RegionCoordY, (rinfo == null) ? regionHandle : rinfo.RegionHandle); 223 rinfo.RegionName, rinfo.RegionCoordX, rinfo.RegionCoordY, (rinfo == null) ? regionHandle : rinfo.RegionHandle);