diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 2163c12ba6..cede0502fd 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -1523,7 +1523,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
lock (m_entityUpdates.SyncRoot)
{
m_killRecord.Add(localID);
- OutPacket(kill, ThrottleOutPacketType.State);
+
+ // The throttle queue used here must match that being used for updates. Otherwise, there is a
+ // chance that a kill packet put on a separate queue will be sent to the client before an existing
+ // update packet on another queue. Receiving updates after kills results in unowned and undeletable
+ // scene objects in a viewer until that viewer is relogged in.
+ OutPacket(kill, ThrottleOutPacketType.Task);
}
}
}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index 6232c48105..ca5a7bdc4b 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -412,8 +412,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
/// Loops through all of the packet queues for this client and tries to send
- /// any outgoing packets, obeying the throttling bucket limits
+ /// an outgoing packet from each, obeying the throttling bucket limits
///
+ ///
+ /// Packet queues are inspected in ascending numerical order starting from 0. Therefore, queues with a lower
+ /// ThrottleOutPacketType number will see their packet get sent first (e.g. if both Land and Wind queues have
+ /// packets, then the packet at the front of the Land queue will be sent before the packet at the front of the
+ /// wind queue).
+ ///
/// This function is only called from a synchronous loop in the
/// UDPServer so we don't need to bother making this thread safe
/// True if any packets were sent, otherwise false
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 56e8c9be54..cb298fdad0 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -500,6 +500,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// FIXME: Implement?
}
+ ///
+ /// Actually send a packet to a client.
+ ///
+ ///
internal void SendPacketFinal(OutgoingPacket outgoingPacket)
{
UDPPacketBuffer buffer = outgoingPacket.Buffer;
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 7edb43eda2..2e6faa08a1 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -57,6 +57,15 @@ namespace OpenSim.Region.Framework.Interfaces
/// Link number for the part
void ResetInventoryIDs();
+ ///
+ /// Reset parent object UUID for all the items in the prim's inventory.
+ ///
+ ///
+ /// If this method is called and there are inventory items, then we regard the inventory as having changed.
+ ///
+ /// Link number for the part
+ void ResetObjectID();
+
///
/// Change every item in this inventory to a new owner.
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 024bdc97bf..95cd26f17e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -500,7 +500,7 @@ namespace OpenSim.Region.Framework.Scenes
// This is necessary so that TaskInventoryItem parent ids correctly reference the new uuid of this part
if (Inventory != null)
- Inventory.ResetInventoryIDs();
+ Inventory.ResetObjectID();
}
}
@@ -2763,6 +2763,7 @@ namespace OpenSim.Region.Framework.Scenes
UUID = UUID.Random();
LinkNum = linkNum;
LocalId = 0;
+ Inventory.ResetInventoryIDs();
}
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 0e3daf764a..210f5cd03e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -140,6 +140,33 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public void ResetObjectID()
+ {
+ lock (Items)
+ {
+ if (Items.Count == 0)
+ {
+ return;
+ }
+
+ HasInventoryChanged = true;
+ if (m_part.ParentGroup != null)
+ {
+ m_part.ParentGroup.HasGroupChanged = true;
+ }
+
+ IList items = new List(Items.Values);
+ Items.Clear();
+
+ foreach (TaskInventoryItem item in items)
+ {
+ item.ParentPartID = m_part.UUID;
+ item.ParentID = m_part.UUID;
+ Items.Add(item.ItemID, item);
+ }
+ }
+ }
+
///
/// Change every item in this inventory to a new owner.
///
diff --git a/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs b/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs
index b47ad5dcb1..fc44358b69 100644
--- a/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs
+++ b/OpenSim/Tests/Common/Mock/TestInventoryDataPlugin.cs
@@ -84,7 +84,7 @@ namespace OpenSim.Tests.Common.Mock
public List getInventoryInFolder(UUID folderID)
{
- InventoryFolderBase folder = m_folders[folderID];
+// InventoryFolderBase folder = m_folders[folderID];
// m_log.DebugFormat("[MOCK INV DB]: Getting items in folder {0} {1}", folder.Name, folder.ID);
@@ -116,7 +116,7 @@ namespace OpenSim.Tests.Common.Mock
public List getInventoryFolders(UUID parentID)
{
- InventoryFolderBase parentFolder = m_folders[parentID];
+// InventoryFolderBase parentFolder = m_folders[parentID];
// m_log.DebugFormat("[MOCK INV DB]: Getting folders in folder {0} {1}", parentFolder.Name, parentFolder.ID);
@@ -185,7 +185,7 @@ namespace OpenSim.Tests.Common.Mock
public void addInventoryItem(InventoryItemBase item)
{
- InventoryFolderBase folder = m_folders[item.Folder];
+// InventoryFolderBase folder = m_folders[item.Folder];
// m_log.DebugFormat(
// "[MOCK INV DB]: Adding inventory item {0} {1} in {2} {3}", item.Name, item.ID, folder.Name, folder.ID);