aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-08-26 16:06:34 +0100
committerJustin Clark-Casey (justincc)2010-08-26 16:06:34 +0100
commitd99c60164dca32fb3b21d343e9066cae45a852d2 (patch)
tree72ec208743c43314291bff4a67273d0987317455
parentUse SOP.ParentGroup in Prioritizer instead of Scene.GetGroupByPrim() (diff)
downloadopensim-SC_OLD-d99c60164dca32fb3b21d343e9066cae45a852d2.zip
opensim-SC_OLD-d99c60164dca32fb3b21d343e9066cae45a852d2.tar.gz
opensim-SC_OLD-d99c60164dca32fb3b21d343e9066cae45a852d2.tar.bz2
opensim-SC_OLD-d99c60164dca32fb3b21d343e9066cae45a852d2.tar.xz
Reinstate kill record check that prevents an entity update being sent to a client after it has been told that the entity has been deleted.
On Linden Lab clients and some derivatives, receiving an entity update after an entity deletion notice results in an undeleteable prim that disappears upon client relog. This check was dropped in 0.7 for unknown reasons but renewed testing demonstrates that queued updates can still be present after a scene object has been deleted.
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs20
1 files changed, 19 insertions, 1 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 320a2fa..677bd14 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -327,7 +327,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
327 /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an 327 /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an
328 /// ownerless phantom. 328 /// ownerless phantom.
329 /// 329 ///
330 /// All manipulation of this set has to occur under a m_primFullUpdate.SyncRoot lock 330 /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock
331 /// 331 ///
332 /// </value> 332 /// </value>
333 protected HashSet<uint> m_killRecord; 333 protected HashSet<uint> m_killRecord;
@@ -382,18 +382,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
382 public string ActiveGroupName { get { return m_activeGroupName; } } 382 public string ActiveGroupName { get { return m_activeGroupName; } }
383 public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } } 383 public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } }
384 public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); } 384 public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); }
385
385 /// <summary> 386 /// <summary>
386 /// First name of the agent/avatar represented by the client 387 /// First name of the agent/avatar represented by the client
387 /// </summary> 388 /// </summary>
388 public string FirstName { get { return m_firstName; } } 389 public string FirstName { get { return m_firstName; } }
390
389 /// <summary> 391 /// <summary>
390 /// Last name of the agent/avatar represented by the client 392 /// Last name of the agent/avatar represented by the client
391 /// </summary> 393 /// </summary>
392 public string LastName { get { return m_lastName; } } 394 public string LastName { get { return m_lastName; } }
395
393 /// <summary> 396 /// <summary>
394 /// Full name of the client (first name and last name) 397 /// Full name of the client (first name and last name)
395 /// </summary> 398 /// </summary>
396 public string Name { get { return FirstName + " " + LastName; } } 399 public string Name { get { return FirstName + " " + LastName; } }
400
397 public uint CircuitCode { get { return m_circuitCode; } } 401 public uint CircuitCode { get { return m_circuitCode; } }
398 public int MoneyBalance { get { return m_moneyBalance; } } 402 public int MoneyBalance { get { return m_moneyBalance; } }
399 public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } 403 public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } }
@@ -3528,6 +3532,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3528 EntityUpdate update; 3532 EntityUpdate update;
3529 while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) 3533 while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update))
3530 { 3534 {
3535 // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client
3536 // will never receive an update after a prim kill. Even then, keeping the kill record may be a good
3537 // safety measure.
3538 //
3539 // Receiving updates after kills results in undeleteable prims that persist until relog and
3540 // currently occurs because prims can be deleted before all queued updates are sent.
3541 if (m_killRecord.Contains(update.Entity.LocalId))
3542 {
3543// m_log.WarnFormat(
3544// "[CLIENT]: Preventing full update for prim with local id {0} after client for user {1} told it was deleted",
3545// update.Entity.LocalId, Name);
3546 continue;
3547 }
3548
3531 if (update.Entity is SceneObjectPart) 3549 if (update.Entity is SceneObjectPart)
3532 { 3550 {
3533 SceneObjectPart part = (SceneObjectPart)update.Entity; 3551 SceneObjectPart part = (SceneObjectPart)update.Entity;