aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-03-26 00:34:49 +0000
committerJustin Clark-Casey (justincc)2011-03-26 00:34:49 +0000
commitcc8897fcebdc9d3e875c9bf745ecb77678a776e9 (patch)
treedbc71e5174977e5e4ab2a5115c72b377acafa5d8 /OpenSim
parentStart using IPrimCounts populated by PrimCountModule instead of LandData coun... (diff)
downloadopensim-SC_OLD-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.zip
opensim-SC_OLD-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.tar.gz
opensim-SC_OLD-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.tar.bz2
opensim-SC_OLD-cc8897fcebdc9d3e875c9bf745ecb77678a776e9.tar.xz
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 logging
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Framework/ILandObject.cs112
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs79
-rw-r--r--OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs24
4 files changed, 201 insertions, 16 deletions
diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs
new file mode 100644
index 0000000..931e24a
--- /dev/null
+++ b/OpenSim/Framework/ILandObject.cs
@@ -0,0 +1,112 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System.Collections.Generic;
29using OpenMetaverse;
30
31namespace OpenSim.Framework
32{
33 public delegate int overrideParcelMaxPrimCountDelegate(ILandObject obj);
34 public delegate int overrideSimulatorMaxPrimCountDelegate(ILandObject obj);
35
36 public interface ILandObject
37 {
38 int GetParcelMaxPrimCount(ILandObject thisObject);
39 int GetSimulatorMaxPrimCount(ILandObject thisObject);
40 int GetPrimsFree();
41
42 LandData LandData { get; set; }
43 bool[,] LandBitmap { get; set; }
44 UUID RegionUUID { get; }
45
46 /// <summary>
47 /// Prim counts for this land object.
48 /// </summary>
49 IPrimCounts PrimCounts { get; set; }
50
51 /// <summary>
52 /// The start point for the land object. This is the western-most point as one scans land working from
53 /// north to south.
54 /// </summary>
55 Vector3 StartPoint { get; }
56
57 /// <summary>
58 /// The end point for the land object. This is the eastern-most point as one scans land working from
59 /// south to north.
60 /// </summary>
61 Vector3 EndPoint { get; }
62
63 bool ContainsPoint(int x, int y);
64
65 ILandObject Copy();
66
67 void SendLandUpdateToAvatarsOverMe();
68
69 void SendLandProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client);
70 void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client);
71 bool IsEitherBannedOrRestricted(UUID avatar);
72 bool IsBannedFromLand(UUID avatar);
73 bool IsRestrictedFromLand(UUID avatar);
74 void SendLandUpdateToClient(IClientAPI remote_client);
75 void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client);
76 List<UUID> CreateAccessListArrayByFlag(AccessList flag);
77 void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client);
78 void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
79 void UpdateLandBitmapByteArray();
80 void SetLandBitmapFromByteArray();
81 bool[,] GetLandBitmap();
82 void ForceUpdateLandInfo();
83 void SetLandBitmap(bool[,] bitmap);
84
85 bool[,] BasicFullRegionLandBitmap();
86 bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y);
87 bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value);
88 bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add);
89 void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client);
90 void SendLandObjectOwners(IClientAPI remote_client);
91 void ReturnLandObjects(uint type, UUID[] owners, UUID[] tasks, IClientAPI remote_client);
92 void ResetLandPrimCounts();
93 void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area);
94
95 void DeedToGroup(UUID groupID);
96
97 void SetParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel);
98 void SetSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel);
99
100 /// <summary>
101 /// Set the media url for this land parcel
102 /// </summary>
103 /// <param name="url"></param>
104 void SetMediaUrl(string url);
105
106 /// <summary>
107 /// Set the music url for this land parcel
108 /// </summary>
109 /// <param name="url"></param>
110 void SetMusicUrl(string url);
111 }
112}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 6138056..0b6b04d 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -4276,6 +4276,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4276 int sequence_id, bool snap_selection, int request_result, ILandObject lo, 4276 int sequence_id, bool snap_selection, int request_result, ILandObject lo,
4277 float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags) 4277 float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
4278 { 4278 {
4279 m_log.DebugFormat("[LLCLIENTVIEW]: Sending land properties for {0} to {1}", lo.LandData.GlobalID, Name);
4280
4279 LandData landData = lo.LandData; 4281 LandData landData = lo.LandData;
4280 4282
4281 ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage(); 4283 ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage();
diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
index 9fd347e..72115a8 100644
--- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
@@ -51,8 +51,7 @@ namespace OpenSim.Region.CoreModules.World.Land
51 51
52 public class PrimCountModule : IPrimCountModule, INonSharedRegionModule 52 public class PrimCountModule : IPrimCountModule, INonSharedRegionModule
53 { 53 {
54// private static readonly ILog m_log = 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
56 55
57 private Scene m_Scene; 56 private Scene m_Scene;
58 private Dictionary<UUID, PrimCounts> m_PrimCounts = 57 private Dictionary<UUID, PrimCounts> m_PrimCounts =
@@ -123,6 +122,11 @@ namespace OpenSim.Region.CoreModules.World.Land
123 { 122 {
124 if (!m_Tainted) 123 if (!m_Tainted)
125 AddObject(obj); 124 AddObject(obj);
125 else
126 m_log.DebugFormat(
127 "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted",
128 obj.Name, m_Scene.RegionInfo.RegionName);
129
126 } 130 }
127 } 131 }
128 132
@@ -133,11 +137,18 @@ namespace OpenSim.Region.CoreModules.World.Land
133 { 137 {
134 if (!m_Tainted) 138 if (!m_Tainted)
135 RemoveObject(obj); 139 RemoveObject(obj);
140 else
141 m_log.DebugFormat(
142 "[PRIM COUNT MODULE]: Ignoring OnObjectBeingRemovedFromScene() for {0} on {1} since count is tainted",
143 obj.Name, m_Scene.RegionInfo.RegionName);
136 } 144 }
137 } 145 }
138 146
139 private void OnParcelPrimCountTainted() 147 private void OnParcelPrimCountTainted()
140 { 148 {
149 m_log.DebugFormat(
150 "[PRIM COUNT MODULE]: OnParcelPrimCountTainted() called on {0}", m_Scene.RegionInfo.RegionName);
151
141 lock (m_TaintLock) 152 lock (m_TaintLock)
142 m_Tainted = true; 153 m_Tainted = true;
143 } 154 }
@@ -163,7 +174,7 @@ namespace OpenSim.Region.CoreModules.World.Land
163 // NOTE: Call under Taint Lock 174 // NOTE: Call under Taint Lock
164 private void AddObject(SceneObjectGroup obj) 175 private void AddObject(SceneObjectGroup obj)
165 { 176 {
166// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} to prim count", obj.Name); 177 m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} {1} to prim count", obj.Name, obj.UUID);
167 178
168 if (obj.IsAttachment) 179 if (obj.IsAttachment)
169 return; 180 return;
@@ -214,10 +225,14 @@ namespace OpenSim.Region.CoreModules.World.Land
214 // NOTE: Call under Taint Lock 225 // NOTE: Call under Taint Lock
215 private void RemoveObject(SceneObjectGroup obj) 226 private void RemoveObject(SceneObjectGroup obj)
216 { 227 {
228 m_log.DebugFormat("[PRIM COUNT MODULE]: Removing object {0} {1} from prim count", obj.Name, obj.UUID);
217 } 229 }
218 230
219 public IPrimCounts GetPrimCounts(UUID parcelID) 231 public IPrimCounts GetPrimCounts(UUID parcelID)
220 { 232 {
233 m_log.DebugFormat(
234 "[PRIM COUNT MODULE]: GetPrimCounts for parcel {0} in {1}", parcelID, m_Scene.RegionInfo.RegionName);
235
221 PrimCounts primCounts; 236 PrimCounts primCounts;
222 237
223 lock (m_PrimCounts) 238 lock (m_PrimCounts)
@@ -239,7 +254,7 @@ namespace OpenSim.Region.CoreModules.World.Land
239 /// <returns></returns> 254 /// <returns></returns>
240 public int GetOwnerCount(UUID parcelID) 255 public int GetOwnerCount(UUID parcelID)
241 { 256 {
242// m_log.DebugFormat("[PRIM COUNT MODULE]: GetOwnerCount for {0}", parcelID); 257 int count = 0;
243 258
244 lock (m_TaintLock) 259 lock (m_TaintLock)
245 { 260 {
@@ -248,9 +263,14 @@ namespace OpenSim.Region.CoreModules.World.Land
248 263
249 ParcelCounts counts; 264 ParcelCounts counts;
250 if (m_ParcelCounts.TryGetValue(parcelID, out counts)) 265 if (m_ParcelCounts.TryGetValue(parcelID, out counts))
251 return counts.Owner; 266 count = counts.Owner;
252 } 267 }
253 return 0; 268
269 m_log.DebugFormat(
270 "[PRIM COUNT MODULE]: GetOwnerCount for parcel {0} in {1} returning {2}",
271 parcelID, m_Scene.RegionInfo.RegionName, count);
272
273 return count;
254 } 274 }
255 275
256 /// <summary> 276 /// <summary>
@@ -260,6 +280,8 @@ namespace OpenSim.Region.CoreModules.World.Land
260 /// <returns></returns> 280 /// <returns></returns>
261 public int GetGroupCount(UUID parcelID) 281 public int GetGroupCount(UUID parcelID)
262 { 282 {
283 int count = 0;
284
263 lock (m_TaintLock) 285 lock (m_TaintLock)
264 { 286 {
265 if (m_Tainted) 287 if (m_Tainted)
@@ -267,9 +289,14 @@ namespace OpenSim.Region.CoreModules.World.Land
267 289
268 ParcelCounts counts; 290 ParcelCounts counts;
269 if (m_ParcelCounts.TryGetValue(parcelID, out counts)) 291 if (m_ParcelCounts.TryGetValue(parcelID, out counts))
270 return counts.Group; 292 count = counts.Group;
271 } 293 }
272 return 0; 294
295 m_log.DebugFormat(
296 "[PRIM COUNT MODULE]: GetGroupCount for parcel {0} in {1} returning {2}",
297 parcelID, m_Scene.RegionInfo.RegionName, count);
298
299 return count;
273 } 300 }
274 301
275 /// <summary> 302 /// <summary>
@@ -279,6 +306,8 @@ namespace OpenSim.Region.CoreModules.World.Land
279 /// <returns></returns> 306 /// <returns></returns>
280 public int GetOthersCount(UUID parcelID) 307 public int GetOthersCount(UUID parcelID)
281 { 308 {
309 int count = 0;
310
282 lock (m_TaintLock) 311 lock (m_TaintLock)
283 { 312 {
284 if (m_Tainted) 313 if (m_Tainted)
@@ -286,9 +315,14 @@ namespace OpenSim.Region.CoreModules.World.Land
286 315
287 ParcelCounts counts; 316 ParcelCounts counts;
288 if (m_ParcelCounts.TryGetValue(parcelID, out counts)) 317 if (m_ParcelCounts.TryGetValue(parcelID, out counts))
289 return counts.Others; 318 count = counts.Others;
290 } 319 }
291 return 0; 320
321 m_log.DebugFormat(
322 "[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}",
323 parcelID, m_Scene.RegionInfo.RegionName, count);
324
325 return count;
292 } 326 }
293 327
294 /// <summary> 328 /// <summary>
@@ -298,6 +332,8 @@ namespace OpenSim.Region.CoreModules.World.Land
298 /// <returns></returns> 332 /// <returns></returns>
299 public int GetSimulatorCount(UUID parcelID) 333 public int GetSimulatorCount(UUID parcelID)
300 { 334 {
335 int count = 0;
336
301 lock (m_TaintLock) 337 lock (m_TaintLock)
302 { 338 {
303 if (m_Tainted) 339 if (m_Tainted)
@@ -308,10 +344,15 @@ namespace OpenSim.Region.CoreModules.World.Land
308 { 344 {
309 int val; 345 int val;
310 if (m_SimwideCounts.TryGetValue(owner, out val)) 346 if (m_SimwideCounts.TryGetValue(owner, out val))
311 return val; 347 count = val;
312 } 348 }
313 } 349 }
314 return 0; 350
351 m_log.DebugFormat(
352 "[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}",
353 parcelID, m_Scene.RegionInfo.RegionName, count);
354
355 return count;
315 } 356 }
316 357
317 /// <summary> 358 /// <summary>
@@ -322,6 +363,8 @@ namespace OpenSim.Region.CoreModules.World.Land
322 /// <returns></returns> 363 /// <returns></returns>
323 public int GetUserCount(UUID parcelID, UUID userID) 364 public int GetUserCount(UUID parcelID, UUID userID)
324 { 365 {
366 int count = 0;
367
325 lock (m_TaintLock) 368 lock (m_TaintLock)
326 { 369 {
327 if (m_Tainted) 370 if (m_Tainted)
@@ -332,16 +375,21 @@ namespace OpenSim.Region.CoreModules.World.Land
332 { 375 {
333 int val; 376 int val;
334 if (counts.Users.TryGetValue(userID, out val)) 377 if (counts.Users.TryGetValue(userID, out val))
335 return val; 378 count = val;
336 } 379 }
337 } 380 }
338 return 0; 381
382 m_log.DebugFormat(
383 "[PRIM COUNT MODULE]: GetUserCount for user {0} in parcel {1} in region {2} returning {3}",
384 userID, parcelID, m_Scene.RegionInfo.RegionName, count);
385
386 return count;
339 } 387 }
340 388
341 // NOTE: This method MUST be called while holding the taint lock! 389 // NOTE: This method MUST be called while holding the taint lock!
342 private void Recount() 390 private void Recount()
343 { 391 {
344// m_log.DebugFormat("[PRIM COUNT MODULE]: Recounting prims on {0}", m_Scene.RegionInfo.RegionName); 392 m_log.DebugFormat("[PRIM COUNT MODULE]: Recounting prims on {0}", m_Scene.RegionInfo.RegionName);
345 393
346 m_OwnerMap.Clear(); 394 m_OwnerMap.Clear();
347 m_SimwideCounts.Clear(); 395 m_SimwideCounts.Clear();
@@ -367,6 +415,7 @@ namespace OpenSim.Region.CoreModules.World.Land
367 if (!m_OwnerMap.ContainsKey(k)) 415 if (!m_OwnerMap.ContainsKey(k))
368 m_PrimCounts.Remove(k); 416 m_PrimCounts.Remove(k);
369 } 417 }
418
370 m_Tainted = false; 419 m_Tainted = false;
371 } 420 }
372 } 421 }
diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
index c9d393f..80b2859 100644
--- a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
+++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
@@ -126,6 +126,28 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
126 Assert.That(pc.Users[m_userId], Is.EqualTo(1)); 126 Assert.That(pc.Users[m_userId], Is.EqualTo(1));
127 Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0)); 127 Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
128 Assert.That(pc.Simulator, Is.EqualTo(1)); 128 Assert.That(pc.Simulator, Is.EqualTo(1));
129 } 129 }
130
131 /// <summary>
132 /// Test the count is correct after is has been tainted.
133 /// </summary>
134 [Test]
135 public void TestTaint()
136 {
137 TestHelper.InMethod();
138 IPrimCounts pc = m_lo.PrimCounts;
139
140 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
141 m_scene.AddNewSceneObject(sog, false);
142
143 m_pcm.TaintPrimCount();
144
145 Assert.That(pc.Owner, Is.EqualTo(3));
146 Assert.That(pc.Group, Is.EqualTo(0));
147 Assert.That(pc.Others, Is.EqualTo(0));
148 Assert.That(pc.Users[m_userId], Is.EqualTo(3));
149 Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
150 Assert.That(pc.Simulator, Is.EqualTo(3));
151 }
130 } 152 }
131} \ No newline at end of file 153} \ No newline at end of file