diff options
author | Justin Clark-Casey (justincc) | 2010-08-26 16:06:34 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2010-08-26 16:06:34 +0100 |
commit | d99c60164dca32fb3b21d343e9066cae45a852d2 (patch) | |
tree | 72ec208743c43314291bff4a67273d0987317455 /OpenSim/Region/ClientStack | |
parent | Use SOP.ParentGroup in Prioritizer instead of Scene.GetGroupByPrim() (diff) | |
download | opensim-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.
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 20 |
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; |