From 8299941517d33f533dff7b571cd7a915064b6871 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 1 Dec 2016 03:45:43 +0000 Subject: [PATCH] fix region overlaps on registration --- OpenSim/Services/GridService/GridService.cs | 112 +++----------------- 1 file changed, 17 insertions(+), 95 deletions(-) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 66c918f9e3..a340612320 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -202,10 +202,24 @@ namespace OpenSim.Services.GridService if (regionInfos.RegionID == UUID.Zero) return "Invalid RegionID - cannot be zero UUID"; - String reason = "Region overlaps another region"; - // we should not need to check for overlaps + String reason = "Region overlaps another region"; + + List rdatas = m_Database.Get( + regionInfos.RegionLocX, + regionInfos.RegionLocY, + regionInfos.RegionLocX + regionInfos.RegionSizeX, + regionInfos.RegionLocY + regionInfos.RegionSizeY, + scopeID); + + RegionData region = null; + if(rdatas.Count > 1) + { + m_log.WarnFormat("{0} Register region overlaps with {1} regions", LogHeader, scopeID, rdatas.Count); + return reason; + } + else if(rdatas.Count == 1) + region = rdatas[0]; - RegionData region = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); if ((region != null) && (region.RegionID != regionInfos.RegionID)) { // If not same ID and same coordinates, this new region has conflicts and can't be registered. @@ -341,99 +355,7 @@ namespace OpenSim.Services.GridService return String.Empty; } -/* - /// - /// Search the region map for regions conflicting with this region. - /// The region to be added is passed and we look for any existing regions that are - /// in the requested location, that are large varregions that overlap this region, or - /// are previously defined regions that would lie under this new region. - /// - /// Information on region requested to be added to the world map - /// Grid id for region - /// The reason the returned region conflicts with passed region - /// - private RegionData FindAnyConflictingRegion(GridRegion regionInfos, UUID scopeID, out string reason) - { - reason = "Reregistration"; - // First see if there is an existing region right where this region is trying to go - // (We keep this result so it can be returned if suppressing errors) - RegionData noErrorRegion = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); - RegionData region = noErrorRegion; - if (region != null - && region.RegionID == regionInfos.RegionID - && region.sizeX == regionInfos.RegionSizeX - && region.sizeY == regionInfos.RegionSizeY) - { - // If this seems to be exactly the same region, return this as it could be - // a re-registration (permissions checked by calling routine). - m_log.DebugFormat("{0} FindAnyConflictingRegion: re-register of {1}", - LogHeader, RegionString(regionInfos)); - return region; - } - // No region exactly there or we're resizing an existing region. - // Fetch regions that could be varregions overlapping requested location. - int xmin = regionInfos.RegionLocX - (int)Constants.MaximumRegionSize + 10; - int xmax = regionInfos.RegionLocX; - int ymin = regionInfos.RegionLocY - (int)Constants.MaximumRegionSize + 10; - int ymax = regionInfos.RegionLocY; - List rdatas = m_Database.Get(xmin, ymin, xmax, ymax, scopeID); - foreach (RegionData rdata in rdatas) - { - // m_log.DebugFormat("{0} FindAnyConflictingRegion: find existing. Checking {1}", LogHeader, RegionString(rdata) ); - if ( (rdata.posX + rdata.sizeX > regionInfos.RegionLocX) - && (rdata.posY + rdata.sizeY > regionInfos.RegionLocY) ) - { - region = rdata; - m_log.WarnFormat("{0} FindAnyConflictingRegion: conflict of {1} by existing varregion {2}", - LogHeader, RegionString(regionInfos), RegionString(region)); - reason = String.Format("Region location is overlapped by existing varregion {0}", - RegionString(region)); - - if (m_SuppressVarregionOverlapCheckOnRegistration) - region = noErrorRegion; - return region; - } - } - - // There isn't a region that overlaps this potential region. - // See if this potential region overlaps an existing region. - // First, a shortcut of not looking for overlap if new region is legacy region sized - // and connot overlap anything. - if (regionInfos.RegionSizeX != Constants.RegionSize - || regionInfos.RegionSizeY != Constants.RegionSize) - { - // trim range looked for so we don't pick up neighbor regions just off the edges - xmin = regionInfos.RegionLocX; - xmax = regionInfos.RegionLocX + regionInfos.RegionSizeX - 10; - ymin = regionInfos.RegionLocY; - ymax = regionInfos.RegionLocY + regionInfos.RegionSizeY - 10; - rdatas = m_Database.Get(xmin, ymin, xmax, ymax, scopeID); - - // If the region is being resized, the found region could be ourself. - foreach (RegionData rdata in rdatas) - { - // m_log.DebugFormat("{0} FindAnyConflictingRegion: see if overlap. Checking {1}", LogHeader, RegionString(rdata) ); - if (region == null || region.RegionID != regionInfos.RegionID) - { - region = rdata; - m_log.WarnFormat("{0} FindAnyConflictingRegion: conflict of varregion {1} overlaps existing region {2}", - LogHeader, RegionString(regionInfos), RegionString(region)); - reason = String.Format("Region {0} would overlap existing region {1}", - RegionString(regionInfos), RegionString(region)); - - if (m_SuppressVarregionOverlapCheckOnRegistration) - region = noErrorRegion; - return region; - } - } - } - - // If we get here, region is either null (nothing found here) or - // is the non-conflicting region found at the location being requested. - return region; - } -*/ // String describing name and region location of passed region private String RegionString(RegionData reg) {