From 02249bb0af4d9c1721db2ed632b3163326054169 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 23 Sep 2025 22:54:30 +0100 Subject: [PATCH] reduce unnecessary saves of prim inventories --- OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++-- .../Framework/Scenes/SceneObjectGroup.cs | 6 +-- .../Scenes/SceneObjectPartInventory.cs | 47 ++++++++++--------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index bd63fd19e4..d5c7c3cba3 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1876,7 +1876,7 @@ namespace OpenSim.Region.Framework.Scenes // sleep if we can if (nowMS > 0) - { + { Thread.Sleep((int)(nowMS + 0.5)); nowMS = Util.GetTimeStampMS(); @@ -1884,14 +1884,14 @@ namespace OpenSim.Region.Framework.Scenes sleepError = sleepMS - frameMS; sleepError = Math.Clamp(sleepError, 0.0f, 20f); frameMS = (float)(nowMS - framestart); - } + } else - { + { nowMS = Util.GetTimeStampMS(); frameMS = (float)(nowMS - framestart); sleepMS = 0.0f; sleepError = 0.0f; - } + } // script time is not scene frame time, but is displayed per frame float scriptTimeMS = GetAndResetScriptExecutionTime(); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index b19008fd9d..2c65e7398a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -283,8 +283,6 @@ namespace OpenSim.Region.Framework.Scenes get { return m_groupContainsForeignPrims; } } - public bool HasGroupChangedDueToDelink { get; set; } - private bool isTimeToPersist() { if (IsSelected || IsDeleted || IsAttachment) @@ -3317,6 +3315,7 @@ namespace OpenSim.Region.Framework.Scenes linkPart.LinkNum = linkNum++; linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false); + linkPart.Inventory.ForceInventoryPersistence(); // Get a list of the SOP's in the source group in order of their linknum's. SceneObjectPart[] ogParts = objectGroup.Parts; @@ -3343,6 +3342,7 @@ namespace OpenSim.Region.Framework.Scenes part.PhysActor.link(m_rootPart.PhysActor); } } + part.Inventory.ForceInventoryPersistence(); part.ClearUndoState(); } } @@ -3516,7 +3516,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_rootPart.PhysActor is not null) m_rootPart.PhysActor.Building = false; - objectGroup.HasGroupChangedDueToDelink = true; + linkPart.Inventory.ForceInventoryPersistence(); if (sendEvents) linkPart.TriggerScriptChangedEvent(Changed.LINK); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index a2baae9d72..906886b300 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -201,6 +201,7 @@ namespace OpenSim.Region.Framework.Scenes } } m_inventorySerial++; + HasInventoryChanged = true; m_items.LockItemsForWrite(false); } @@ -224,6 +225,7 @@ namespace OpenSim.Region.Framework.Scenes item.ParentID = partID; } m_inventorySerial++; + HasInventoryChanged = true; m_items.LockItemsForWrite(false); } @@ -1350,8 +1352,7 @@ namespace OpenSim.Region.Framework.Scenes m_items[item.ItemID] = item; if(item.InvType == (int)InventoryType.LSL) { - if(m_scripts == null) - m_scripts = new Dictionary(); + m_scripts ??= new Dictionary(); m_scripts[item.ItemID] = item; } @@ -1412,13 +1413,13 @@ namespace OpenSim.Region.Framework.Scenes { m_part.RemFlag(PrimFlags.Scripted); } - m_inventorySerial++; - m_items.LockItemsForWrite(false); m_part.ParentGroup.InvalidateDeepEffectivePerms(); - - + m_inventorySerial++; HasInventoryChanged = true; + + m_items.LockItemsForWrite(false); + m_part.ParentGroup.HasGroupChanged = true; m_part.ScheduleFullUpdate(); @@ -1603,23 +1604,27 @@ namespace OpenSim.Region.Framework.Scenes /// public void ProcessInventoryBackup(ISimulationDataService datastore) { - // Removed this because linking will cause an immediate delete of the new - // child prim from the database and the subsequent storing of the prim sees - // the inventory of it as unchanged and doesn't store it at all. The overhead - // of storing prim inventory needlessly is much less than the aggravation - // of prim inventory loss. - //if (HasInventoryChanged) - // { - m_items.LockItemsForRead(true); - ICollection itemsvalues = m_items.Values; + try + { + m_items.LockItemsForWrite(true); + if (!HasInventoryChanged) + return; HasInventoryChanged = false; + } + finally + { + m_items.LockItemsForWrite(false); + } + + try + { + m_items.LockItemsForRead(true); + datastore.StorePrimInventory(m_part.UUID, m_items.Values); + } + finally + { m_items.LockItemsForRead(false); - try - { - datastore.StorePrimInventory(m_part.UUID, itemsvalues); - } - catch {} - // } + } } public class InventoryStringBuilder