Merge branch 'master' into httptests

httptests
UbitUmarov 2016-07-30 04:31:26 +01:00
commit 22b1b91599
3 changed files with 102 additions and 27 deletions

View File

@ -38,7 +38,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
{ {
public class RegionInfoCache public class RegionInfoCache
{ {
private const double CACHE_EXPIRATION_SECONDS = 120; // 2 minutes opensim regions change a lot private const float CACHE_EXPIRATION_SECONDS = 120; // 2 minutes opensim regions change a lot
// private static readonly ILog m_log = // private static readonly ILog m_log =
// LogManager.GetLogger( // LogManager.GetLogger(
@ -54,10 +54,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
public void Cache(GridRegion rinfo) public void Cache(GridRegion rinfo)
{ {
if (rinfo != null) if (rinfo != null)
this.Cache(rinfo.ScopeID,rinfo.RegionID,rinfo); this.Cache(rinfo.ScopeID, rinfo);
} }
public void Cache(UUID scopeID, UUID regionID, GridRegion rinfo) public void Cache(UUID scopeID, GridRegion rinfo)
{ {
// for now, do not cache negative results; this is because // for now, do not cache negative results; this is because
// we need to figure out how to handle regions coming online // we need to figure out how to handle regions coming online
@ -68,6 +68,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
m_Cache.AddOrUpdate(scopeID, rinfo, CACHE_EXPIRATION_SECONDS); m_Cache.AddOrUpdate(scopeID, rinfo, CACHE_EXPIRATION_SECONDS);
} }
public void Cache(UUID scopeID, GridRegion rinfo, float expireSeconds)
{
// for now, do not cache negative results; this is because
// we need to figure out how to handle regions coming online
// in a timely way
if (rinfo == null)
return;
m_Cache.AddOrUpdate(scopeID, rinfo, expireSeconds);
}
public GridRegion Get(UUID scopeID, UUID regionID, out bool inCache) public GridRegion Get(UUID scopeID, UUID regionID, out bool inCache)
{ {
inCache = false; inCache = false;
@ -109,6 +120,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
return null; return null;
} }
public GridRegion Get(UUID scopeID, int x, int y, out bool inCache)
{
inCache = false;
GridRegion rinfo = null;
if (m_Cache.TryGetValue(scopeID, x, y, out rinfo))
{
inCache = true;
return rinfo;
}
return null;
}
} }
@ -222,8 +248,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
public sealed class RegionsExpiringCache public sealed class RegionsExpiringCache
{ {
const double CACHE_PURGE_HZ = 60; const double CACHE_PURGE_HZ = 60; // seconds
const int MAX_LOCK_WAIT = 5000; // milliseconds const int MAX_LOCK_WAIT = 10000; // milliseconds
/// <summary>For thread safety</summary> /// <summary>For thread safety</summary>
object syncRoot = new object(); object syncRoot = new object();
@ -240,7 +266,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
timer.Start(); timer.Start();
} }
public bool Add(UUID scope, GridRegion region, double expirationSeconds) public bool Add(UUID scope, GridRegion region, float expirationSeconds)
{ {
if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT))
throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms");
@ -269,7 +295,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
finally { Monitor.Exit(syncRoot);} finally { Monitor.Exit(syncRoot);}
} }
public bool AddOrUpdate(UUID scope, GridRegion region, double expirationSeconds) public bool AddOrUpdate(UUID scope, GridRegion region, float expirationSeconds)
{ {
if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT))
throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms"); throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms");
@ -463,6 +489,50 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
return false; return false;
} }
// 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)
{
if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT))
throw new ApplicationException("Lock could not be acquired after " + MAX_LOCK_WAIT + "ms");
try
{
value = null;
if(timedStorage.Count == 0)
return false;
foreach(KeyValuePair<RegionKey, GridRegion> 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;
}
}
}
finally { Monitor.Exit(syncRoot); }
value = null;
return false;
}
public bool Update(UUID scope, GridRegion region, double expirationSeconds) public bool Update(UUID scope, GridRegion region, double expirationSeconds)
{ {
if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT)) if (!Monitor.TryEnter(syncRoot, MAX_LOCK_WAIT))

View File

@ -183,7 +183,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
if (rinfo == null) if (rinfo == null)
rinfo = m_RemoteGridService.GetRegionByUUID(scopeID, regionID); rinfo = m_RemoteGridService.GetRegionByUUID(scopeID, regionID);
m_RegionInfoCache.Cache(scopeID,regionID,rinfo); m_RegionInfoCache.Cache(scopeID, rinfo);
return rinfo; return rinfo;
} }
@ -193,46 +193,45 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
// The coordinates are world coords (meters), NOT region units. // The coordinates are world coords (meters), NOT region units.
public GridRegion GetRegionByPosition(UUID scopeID, int x, int y) 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);
uint regionX = Util.WorldToRegionLoc((uint)x);
uint regionY = Util.WorldToRegionLoc((uint)y);
/* this is no longer valid
// Sanity check
if ((Util.RegionToWorldLoc(regionX) != (uint)x) || (Util.RegionToWorldLoc(regionY) != (uint)y))
{
m_log.WarnFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Bad position requested: not the base of the region. Requested Pos=<{0},{1}>, Should Be=<{2},{3}>",
x, y, Util.RegionToWorldLoc(regionX), Util.RegionToWorldLoc(regionY));
}
*/
bool inCache = false; bool inCache = false;
GridRegion rinfo = m_RegionInfoCache.Get(scopeID, regionHandle, out inCache); GridRegion rinfo = m_RegionInfoCache.Get(scopeID, regionHandle, out inCache);
if (inCache) if (inCache)
{
// m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Found region {0} in cache. Pos=<{1},{2}>, RegionHandle={3}",
// (rinfo == null) ? "<missing>" : rinfo.RegionName, regionX, regionY, (rinfo == null) ? regionHandle : rinfo.RegionHandle);
return rinfo; return rinfo;
}
// try in cache by slower position next
rinfo = m_RegionInfoCache.Get(scopeID, x, y, out inCache);
if (inCache)
return rinfo;
rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y); rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y);
if (rinfo == null) if (rinfo == null)
rinfo = m_RemoteGridService.GetRegionByPosition(scopeID, x, y); rinfo = m_RemoteGridService.GetRegionByPosition(scopeID, x, y);
m_RegionInfoCache.Cache(rinfo);
if (rinfo == null) 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); m_log.WarnFormat("[REMOTE GRID CONNECTOR]: Requested region {0}-{1} not found", regionX, regionY);
}
else else
{
m_RegionInfoCache.Cache(scopeID, rinfo);
m_log.DebugFormat("[REMOTE GRID CONNECTOR]: GetRegionByPosition. Added region {0} to the cache. Pos=<{1},{2}>, RegionHandle={3}", 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 == null) ? regionHandle : rinfo.RegionHandle); rinfo.RegionName, rinfo.RegionCoordX, rinfo.RegionCoordY, (rinfo == null) ? regionHandle : rinfo.RegionHandle);
}
return rinfo; return rinfo;
} }
public GridRegion GetRegionByName(UUID scopeID, string regionName) public GridRegion GetRegionByName(UUID scopeID, string regionName)
{ {
bool inCache = false; bool inCache = false;
GridRegion rinfo = m_RegionInfoCache.Get(scopeID,regionName, out inCache); GridRegion rinfo = m_RegionInfoCache.Get(scopeID, regionName, out inCache);
if (inCache) if (inCache)
return rinfo; return rinfo;
@ -241,7 +240,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
rinfo = m_RemoteGridService.GetRegionByName(scopeID, regionName); rinfo = m_RemoteGridService.GetRegionByName(scopeID, regionName);
// can't cache negative results for name lookups // can't cache negative results for name lookups
m_RegionInfoCache.Cache(rinfo); m_RegionInfoCache.Cache(scopeID, rinfo);
return rinfo; return rinfo;
} }

View File

@ -4539,7 +4539,13 @@ namespace OpenSim.Region.Framework.Scenes
if (Scene.AttachmentsModule != null) if (Scene.AttachmentsModule != null)
Scene.AttachmentsModule.CopyAttachments(this, cAgent); Scene.AttachmentsModule.CopyAttachments(this, cAgent);
cAgent.CrossingFlags = isCrossUpdate ? crossingFlags : (byte)0; if(isCrossUpdate)
{
cAgent.CrossingFlags = crossingFlags;
cAgent.CrossingFlags |= 1;
}
else
cAgent.CrossingFlags = 0;
if(isCrossUpdate && haveGroupInformation) if(isCrossUpdate && haveGroupInformation)
{ {