aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDiva Canto2016-06-12 12:23:52 -0700
committerDiva Canto2016-06-12 12:23:52 -0700
commit42a9afdc43cc63ddea75cb3baa89f2600f27aa99 (patch)
tree45546118c6faa42897d57c5750aa917429b1dff3
parentRestore SendAgentGroupDataUpdate() call in GroupsModule.cs. (diff)
downloadopensim-SC_OLD-42a9afdc43cc63ddea75cb3baa89f2600f27aa99.zip
opensim-SC_OLD-42a9afdc43cc63ddea75cb3baa89f2600f27aa99.tar.gz
opensim-SC_OLD-42a9afdc43cc63ddea75cb3baa89f2600f27aa99.tar.bz2
opensim-SC_OLD-42a9afdc43cc63ddea75cb3baa89f2600f27aa99.tar.xz
Mantis #7858: DeleteSceneObject done slightly differently. ProcessEntities now checks whether the objects have been deleted and, if so, sends an extra kill object packet, in order to compensate for potential race conditions encountered by the first one.
Note: I still cannot reproduce this problem, but I was able to emulate it by adding an artificial delay on ProcessEntities, which did, indeed, result in objects not being deleted. This fix fixed my emulated scenario.
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs33
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs3
3 files changed, 34 insertions, 9 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index d449e82..9cee590 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -357,7 +357,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
357 /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock 357 /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock
358 /// 358 ///
359 /// </value> 359 /// </value>
360// protected HashSet<uint> m_killRecord; 360 protected List<uint> m_killRecord;
361 361
362// protected HashSet<uint> m_attachmentsSent; 362// protected HashSet<uint> m_attachmentsSent;
363 363
@@ -509,7 +509,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
509 m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); 509 m_entityUpdates = new PriorityQueue(m_scene.Entities.Count);
510 m_entityProps = new PriorityQueue(m_scene.Entities.Count); 510 m_entityProps = new PriorityQueue(m_scene.Entities.Count);
511 m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); 511 m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>();
512// m_killRecord = new HashSet<uint>(); 512 m_killRecord = new List<uint>();
513// m_attachmentsSent = new HashSet<uint>(); 513// m_attachmentsSent = new HashSet<uint>();
514 514
515 m_assetService = m_scene.RequestModuleInterface<IAssetService>(); 515 m_assetService = m_scene.RequestModuleInterface<IAssetService>();
@@ -3992,7 +3992,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3992 foreach (EntityUpdate update in updates) 3992 foreach (EntityUpdate update in updates)
3993 ResendPrimUpdate(update); 3993 ResendPrimUpdate(update);
3994 } 3994 }
3995 3995
3996 private void ProcessEntityUpdates(int maxUpdates) 3996 private void ProcessEntityUpdates(int maxUpdates)
3997 { 3997 {
3998 OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); 3998 OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>();
@@ -4005,6 +4005,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4005 OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); 4005 OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
4006 OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); 4006 OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
4007 4007
4008
4008 // Check to see if this is a flush 4009 // Check to see if this is a flush
4009 if (maxUpdates <= 0) 4010 if (maxUpdates <= 0)
4010 { 4011 {
@@ -4033,9 +4034,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4033 { 4034 {
4034 SceneObjectPart part = (SceneObjectPart)update.Entity; 4035 SceneObjectPart part = (SceneObjectPart)update.Entity;
4035 4036
4036 if (part.ParentGroup.IsDeleted || part.ParentGroup.inTransit) 4037 if (part.ParentGroup.inTransit)
4037 continue; 4038 continue;
4038 4039
4040 if (part.ParentGroup.IsDeleted)
4041 {
4042 // Don't send updates for objects that have been marked deleted.
4043 // Instead send another kill object, because the first one may have gotten
4044 // into a race condition
4045 if (!m_killRecord.Contains(part.ParentGroup.LocalId))
4046 m_killRecord.Add(part.ParentGroup.LocalId);
4047 continue;
4048 }
4049
4039 if (part.ParentGroup.IsAttachment) 4050 if (part.ParentGroup.IsAttachment)
4040 { // Someone else's HUD, why are we getting these? 4051 { // Someone else's HUD, why are we getting these?
4041 if (part.ParentGroup.OwnerID != AgentId && part.ParentGroup.HasPrivateAttachmentPoint) 4052 if (part.ParentGroup.OwnerID != AgentId && part.ParentGroup.HasPrivateAttachmentPoint)
@@ -4233,7 +4244,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4233 4244
4234 for (int i = 0; i < blocks.Count; i++) 4245 for (int i = 0; i < blocks.Count; i++)
4235 packet.ObjectData[i] = blocks[i]; 4246 packet.ObjectData[i] = blocks[i];
4236 4247
4237 OutPacket(packet, ThrottleOutPacketType.Task, true); 4248 OutPacket(packet, ThrottleOutPacketType.Task, true);
4238 } 4249 }
4239 4250
@@ -4248,7 +4259,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4248 4259
4249 for (int i = 0; i < blocks.Count; i++) 4260 for (int i = 0; i < blocks.Count; i++)
4250 packet.ObjectData[i] = blocks[i]; 4261 packet.ObjectData[i] = blocks[i];
4251 4262
4252 OutPacket(packet, ThrottleOutPacketType.Task, true); 4263 OutPacket(packet, ThrottleOutPacketType.Task, true);
4253 } 4264 }
4254 4265
@@ -4270,6 +4281,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4270 } 4281 }
4271 4282
4272 #endregion Packet Sending 4283 #endregion Packet Sending
4284
4285 #region Handle deleted objects
4286 if (m_killRecord.Count > 0)
4287 {
4288 SendKillObject(m_killRecord);
4289 m_killRecord.Clear();
4290 }
4291 #endregion
4292
4293
4273 } 4294 }
4274 4295
4275 // hack.. dont use 4296 // hack.. dont use
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 04db123..09dc663 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1987,6 +1987,7 @@ namespace OpenSim.Region.Framework.Scenes
1987 { 1987 {
1988 // We need to keep track of this state in case this group is still queued for backup. 1988 // We need to keep track of this state in case this group is still queued for backup.
1989 IsDeleted = true; 1989 IsDeleted = true;
1990 HasGroupChanged = true;
1990 1991
1991 DetachFromBackup(); 1992 DetachFromBackup();
1992 1993
@@ -2010,7 +2011,13 @@ namespace OpenSim.Region.Framework.Scenes
2010 if (!IsAttachment 2011 if (!IsAttachment
2011 || AttachedAvatar == avatar.ControllingClient.AgentId 2012 || AttachedAvatar == avatar.ControllingClient.AgentId
2012 || !HasPrivateAttachmentPoint) 2013 || !HasPrivateAttachmentPoint)
2014 {
2015 // Send a kill object immediately
2013 avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId }); 2016 avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId });
2017 // Also, send a terse update; in case race conditions make the object pop again in the client,
2018 // this update will send another kill object
2019 m_rootPart.SendTerseUpdateToClient(avatar.ControllingClient);
2020 }
2014 } 2021 }
2015 } 2022 }
2016 }); 2023 });
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 7d95c8d..b4feb9a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -5390,9 +5390,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
5390 5390
5391 public void SendTerseUpdateToClient(IClientAPI remoteClient) 5391 public void SendTerseUpdateToClient(IClientAPI remoteClient)
5392 { 5392 {
5393 if (ParentGroup.IsDeleted)
5394 return;
5395
5396 if (ParentGroup.IsAttachment 5393 if (ParentGroup.IsAttachment
5397 && (ParentGroup.RootPart != this 5394 && (ParentGroup.RootPart != this
5398 || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint)) 5395 || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint))