diff options
author | Justin Clark-Casey (justincc) | 2010-12-02 01:55:49 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2010-12-02 02:01:01 +0000 |
commit | 5246d98b8df3cc613a199851c3ac33ec753f522a (patch) | |
tree | d4ce71333504fef05419ba27cbfbeabcaad0f4c1 /OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |
parent | minor: add some method doc (diff) | |
download | opensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.zip opensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.tar.gz opensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.tar.bz2 opensim-SC-5246d98b8df3cc613a199851c3ac33ec753f522a.tar.xz |
Stop LLUDPServer sending updates after object deletes by always queueing deletes
If an LL 1.23.5 client (and possibly earlier and later) receives an object update after a kill object packet, it leaves the deleted prim in the scene until client relog
This is possible in LLUDPServer if an object update packet is queued but a kill packet sent immediately.
Beyond invasive tracking of kill sending, most expedient solution is to always queue kills, so that they always arrive after updates.
In tests, this doesn't appear to affect performance.
There is probably still an issue present where an update packet might not be acked and then resent after the kill packet.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 7851c4d..f125822 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -3562,24 +3562,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3562 | EntityUpdate update; | 3562 | EntityUpdate update; |
3563 | while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) | 3563 | while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) |
3564 | { | 3564 | { |
3565 | // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client | ||
3566 | // will never receive an update after a prim kill. Even then, keeping the kill record may be a good | ||
3567 | // safety measure. | ||
3568 | // | ||
3569 | // Receiving updates after kills results in undeleteable prims that persist until relog and | ||
3570 | // currently occurs because prims can be deleted before all queued updates are sent. | ||
3571 | if (m_killRecord.Contains(update.Entity.LocalId)) | ||
3572 | { | ||
3573 | // m_log.WarnFormat( | ||
3574 | // "[CLIENT]: Preventing full update for prim with local id {0} after client for user {1} told it was deleted", | ||
3575 | // update.Entity.LocalId, Name); | ||
3576 | continue; | ||
3577 | } | ||
3578 | |||
3579 | if (update.Entity is SceneObjectPart) | 3565 | if (update.Entity is SceneObjectPart) |
3580 | { | 3566 | { |
3581 | SceneObjectPart part = (SceneObjectPart)update.Entity; | 3567 | SceneObjectPart part = (SceneObjectPart)update.Entity; |
3582 | 3568 | ||
3569 | // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client | ||
3570 | // will never receive an update after a prim kill. Even then, keeping the kill record may be a good | ||
3571 | // safety measure. | ||
3572 | // | ||
3573 | // If a Linden Lab 1.23.5 client (and possibly later and earlier) receives an object update | ||
3574 | // after a kill, it will keep displaying the deleted object until relog. OpenSim currently performs | ||
3575 | // updates and kills on different threads with different scheduling strategies, hence this protection. | ||
3576 | // | ||
3577 | // This doesn't appear to apply to child prims - a client will happily ignore these updates | ||
3578 | // after the root prim has been deleted. | ||
3579 | if (m_killRecord.Contains(part.LocalId)) | ||
3580 | { | ||
3581 | // m_log.WarnFormat( | ||
3582 | // "[CLIENT]: Preventing update for prim with local id {0} after client for user {1} told it was deleted", | ||
3583 | // part.LocalId, Name); | ||
3584 | continue; | ||
3585 | } | ||
3586 | |||
3583 | if (part.ParentGroup.IsAttachment && m_disableFacelights) | 3587 | if (part.ParentGroup.IsAttachment && m_disableFacelights) |
3584 | { | 3588 | { |
3585 | if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand && | 3589 | if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand && |