Add test for PCM taint. This currently fails due to unexpected behaviour of SceneGraph.ForEachSOG(). This will be corrected soon.
Also adds lots of temproarily debug logging0.7.1-dev
parent
6ae04448f7
commit
cc8897fceb
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework
|
||||||
|
{
|
||||||
|
public delegate int overrideParcelMaxPrimCountDelegate(ILandObject obj);
|
||||||
|
public delegate int overrideSimulatorMaxPrimCountDelegate(ILandObject obj);
|
||||||
|
|
||||||
|
public interface ILandObject
|
||||||
|
{
|
||||||
|
int GetParcelMaxPrimCount(ILandObject thisObject);
|
||||||
|
int GetSimulatorMaxPrimCount(ILandObject thisObject);
|
||||||
|
int GetPrimsFree();
|
||||||
|
|
||||||
|
LandData LandData { get; set; }
|
||||||
|
bool[,] LandBitmap { get; set; }
|
||||||
|
UUID RegionUUID { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Prim counts for this land object.
|
||||||
|
/// </summary>
|
||||||
|
IPrimCounts PrimCounts { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The start point for the land object. This is the western-most point as one scans land working from
|
||||||
|
/// north to south.
|
||||||
|
/// </summary>
|
||||||
|
Vector3 StartPoint { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The end point for the land object. This is the eastern-most point as one scans land working from
|
||||||
|
/// south to north.
|
||||||
|
/// </summary>
|
||||||
|
Vector3 EndPoint { get; }
|
||||||
|
|
||||||
|
bool ContainsPoint(int x, int y);
|
||||||
|
|
||||||
|
ILandObject Copy();
|
||||||
|
|
||||||
|
void SendLandUpdateToAvatarsOverMe();
|
||||||
|
|
||||||
|
void SendLandProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client);
|
||||||
|
void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client);
|
||||||
|
bool IsEitherBannedOrRestricted(UUID avatar);
|
||||||
|
bool IsBannedFromLand(UUID avatar);
|
||||||
|
bool IsRestrictedFromLand(UUID avatar);
|
||||||
|
void SendLandUpdateToClient(IClientAPI remote_client);
|
||||||
|
void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client);
|
||||||
|
List<UUID> CreateAccessListArrayByFlag(AccessList flag);
|
||||||
|
void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client);
|
||||||
|
void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
|
||||||
|
void UpdateLandBitmapByteArray();
|
||||||
|
void SetLandBitmapFromByteArray();
|
||||||
|
bool[,] GetLandBitmap();
|
||||||
|
void ForceUpdateLandInfo();
|
||||||
|
void SetLandBitmap(bool[,] bitmap);
|
||||||
|
|
||||||
|
bool[,] BasicFullRegionLandBitmap();
|
||||||
|
bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y);
|
||||||
|
bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value);
|
||||||
|
bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add);
|
||||||
|
void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client);
|
||||||
|
void SendLandObjectOwners(IClientAPI remote_client);
|
||||||
|
void ReturnLandObjects(uint type, UUID[] owners, UUID[] tasks, IClientAPI remote_client);
|
||||||
|
void ResetLandPrimCounts();
|
||||||
|
void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area);
|
||||||
|
|
||||||
|
void DeedToGroup(UUID groupID);
|
||||||
|
|
||||||
|
void SetParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel);
|
||||||
|
void SetSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the media url for this land parcel
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="url"></param>
|
||||||
|
void SetMediaUrl(string url);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the music url for this land parcel
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="url"></param>
|
||||||
|
void SetMusicUrl(string url);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4276,6 +4276,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
int sequence_id, bool snap_selection, int request_result, ILandObject lo,
|
int sequence_id, bool snap_selection, int request_result, ILandObject lo,
|
||||||
float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
|
float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
|
||||||
{
|
{
|
||||||
|
m_log.DebugFormat("[LLCLIENTVIEW]: Sending land properties for {0} to {1}", lo.LandData.GlobalID, Name);
|
||||||
|
|
||||||
LandData landData = lo.LandData;
|
LandData landData = lo.LandData;
|
||||||
|
|
||||||
ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage();
|
ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage();
|
||||||
|
|
|
@ -51,8 +51,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public class PrimCountModule : IPrimCountModule, INonSharedRegionModule
|
public class PrimCountModule : IPrimCountModule, INonSharedRegionModule
|
||||||
{
|
{
|
||||||
// private static readonly ILog m_log =
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
|
||||||
|
|
||||||
private Scene m_Scene;
|
private Scene m_Scene;
|
||||||
private Dictionary<UUID, PrimCounts> m_PrimCounts =
|
private Dictionary<UUID, PrimCounts> m_PrimCounts =
|
||||||
|
@ -123,6 +122,11 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
if (!m_Tainted)
|
if (!m_Tainted)
|
||||||
AddObject(obj);
|
AddObject(obj);
|
||||||
|
else
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted",
|
||||||
|
obj.Name, m_Scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,11 +137,18 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
if (!m_Tainted)
|
if (!m_Tainted)
|
||||||
RemoveObject(obj);
|
RemoveObject(obj);
|
||||||
|
else
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: Ignoring OnObjectBeingRemovedFromScene() for {0} on {1} since count is tainted",
|
||||||
|
obj.Name, m_Scene.RegionInfo.RegionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnParcelPrimCountTainted()
|
private void OnParcelPrimCountTainted()
|
||||||
{
|
{
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: OnParcelPrimCountTainted() called on {0}", m_Scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
lock (m_TaintLock)
|
lock (m_TaintLock)
|
||||||
m_Tainted = true;
|
m_Tainted = true;
|
||||||
}
|
}
|
||||||
|
@ -163,7 +174,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
// NOTE: Call under Taint Lock
|
// NOTE: Call under Taint Lock
|
||||||
private void AddObject(SceneObjectGroup obj)
|
private void AddObject(SceneObjectGroup obj)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} to prim count", obj.Name);
|
m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} {1} to prim count", obj.Name, obj.UUID);
|
||||||
|
|
||||||
if (obj.IsAttachment)
|
if (obj.IsAttachment)
|
||||||
return;
|
return;
|
||||||
|
@ -214,10 +225,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
// NOTE: Call under Taint Lock
|
// NOTE: Call under Taint Lock
|
||||||
private void RemoveObject(SceneObjectGroup obj)
|
private void RemoveObject(SceneObjectGroup obj)
|
||||||
{
|
{
|
||||||
|
m_log.DebugFormat("[PRIM COUNT MODULE]: Removing object {0} {1} from prim count", obj.Name, obj.UUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IPrimCounts GetPrimCounts(UUID parcelID)
|
public IPrimCounts GetPrimCounts(UUID parcelID)
|
||||||
{
|
{
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: GetPrimCounts for parcel {0} in {1}", parcelID, m_Scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
PrimCounts primCounts;
|
PrimCounts primCounts;
|
||||||
|
|
||||||
lock (m_PrimCounts)
|
lock (m_PrimCounts)
|
||||||
|
@ -239,7 +254,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public int GetOwnerCount(UUID parcelID)
|
public int GetOwnerCount(UUID parcelID)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[PRIM COUNT MODULE]: GetOwnerCount for {0}", parcelID);
|
int count = 0;
|
||||||
|
|
||||||
lock (m_TaintLock)
|
lock (m_TaintLock)
|
||||||
{
|
{
|
||||||
|
@ -248,9 +263,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
ParcelCounts counts;
|
ParcelCounts counts;
|
||||||
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
||||||
return counts.Owner;
|
count = counts.Owner;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: GetOwnerCount for parcel {0} in {1} returning {2}",
|
||||||
|
parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -260,6 +280,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public int GetGroupCount(UUID parcelID)
|
public int GetGroupCount(UUID parcelID)
|
||||||
{
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
lock (m_TaintLock)
|
lock (m_TaintLock)
|
||||||
{
|
{
|
||||||
if (m_Tainted)
|
if (m_Tainted)
|
||||||
|
@ -267,9 +289,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
ParcelCounts counts;
|
ParcelCounts counts;
|
||||||
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
||||||
return counts.Group;
|
count = counts.Group;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: GetGroupCount for parcel {0} in {1} returning {2}",
|
||||||
|
parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -279,6 +306,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public int GetOthersCount(UUID parcelID)
|
public int GetOthersCount(UUID parcelID)
|
||||||
{
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
lock (m_TaintLock)
|
lock (m_TaintLock)
|
||||||
{
|
{
|
||||||
if (m_Tainted)
|
if (m_Tainted)
|
||||||
|
@ -286,9 +315,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
ParcelCounts counts;
|
ParcelCounts counts;
|
||||||
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
||||||
return counts.Others;
|
count = counts.Others;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}",
|
||||||
|
parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -298,6 +332,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public int GetSimulatorCount(UUID parcelID)
|
public int GetSimulatorCount(UUID parcelID)
|
||||||
{
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
lock (m_TaintLock)
|
lock (m_TaintLock)
|
||||||
{
|
{
|
||||||
if (m_Tainted)
|
if (m_Tainted)
|
||||||
|
@ -308,10 +344,15 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
int val;
|
int val;
|
||||||
if (m_SimwideCounts.TryGetValue(owner, out val))
|
if (m_SimwideCounts.TryGetValue(owner, out val))
|
||||||
return val;
|
count = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}",
|
||||||
|
parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -322,6 +363,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public int GetUserCount(UUID parcelID, UUID userID)
|
public int GetUserCount(UUID parcelID, UUID userID)
|
||||||
{
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
lock (m_TaintLock)
|
lock (m_TaintLock)
|
||||||
{
|
{
|
||||||
if (m_Tainted)
|
if (m_Tainted)
|
||||||
|
@ -332,16 +375,21 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
int val;
|
int val;
|
||||||
if (counts.Users.TryGetValue(userID, out val))
|
if (counts.Users.TryGetValue(userID, out val))
|
||||||
return val;
|
count = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[PRIM COUNT MODULE]: GetUserCount for user {0} in parcel {1} in region {2} returning {3}",
|
||||||
|
userID, parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: This method MUST be called while holding the taint lock!
|
// NOTE: This method MUST be called while holding the taint lock!
|
||||||
private void Recount()
|
private void Recount()
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[PRIM COUNT MODULE]: Recounting prims on {0}", m_Scene.RegionInfo.RegionName);
|
m_log.DebugFormat("[PRIM COUNT MODULE]: Recounting prims on {0}", m_Scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
m_OwnerMap.Clear();
|
m_OwnerMap.Clear();
|
||||||
m_SimwideCounts.Clear();
|
m_SimwideCounts.Clear();
|
||||||
|
@ -367,6 +415,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
if (!m_OwnerMap.ContainsKey(k))
|
if (!m_OwnerMap.ContainsKey(k))
|
||||||
m_PrimCounts.Remove(k);
|
m_PrimCounts.Remove(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Tainted = false;
|
m_Tainted = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,6 +126,28 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
|
||||||
Assert.That(pc.Users[m_userId], Is.EqualTo(1));
|
Assert.That(pc.Users[m_userId], Is.EqualTo(1));
|
||||||
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||||
Assert.That(pc.Simulator, Is.EqualTo(1));
|
Assert.That(pc.Simulator, Is.EqualTo(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test the count is correct after is has been tainted.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestTaint()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
IPrimCounts pc = m_lo.PrimCounts;
|
||||||
|
|
||||||
|
SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
|
||||||
|
m_scene.AddNewSceneObject(sog, false);
|
||||||
|
|
||||||
|
m_pcm.TaintPrimCount();
|
||||||
|
|
||||||
|
Assert.That(pc.Owner, Is.EqualTo(3));
|
||||||
|
Assert.That(pc.Group, Is.EqualTo(0));
|
||||||
|
Assert.That(pc.Others, Is.EqualTo(0));
|
||||||
|
Assert.That(pc.Users[m_userId], Is.EqualTo(3));
|
||||||
|
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||||
|
Assert.That(pc.Simulator, Is.EqualTo(3));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue