reduce unnecessary saves of prim inventories

This commit is contained in:
UbitUmarov
2025-09-23 22:54:30 +01:00
parent 67e7dbc2e2
commit 02249bb0af
3 changed files with 33 additions and 28 deletions

View File

@@ -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();

View File

@@ -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);

View File

@@ -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<UUID, TaskInventoryItem>();
m_scripts ??= new Dictionary<UUID, TaskInventoryItem>();
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
/// <param name="datastore"></param>
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<TaskInventoryItem> 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