From 504ae63669e5c57cd89e8213b853c27506012f79 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Mon, 21 Jan 2008 15:06:49 +0000 Subject: * Make object persistence more granular by separating prim and prim inventory persistence --- .../Environment/Interfaces/IRegionDataStore.cs | 20 ++++++++++++++++- .../Scenes/SceneObjectGroup.Inventory.cs | 23 +------------------ .../Region/Environment/Scenes/SceneObjectGroup.cs | 9 ++++++-- .../Scenes/SceneObjectPart.Inventory.cs | 26 +++++++++++++++++++++- .../OpenSim.DataStore.MSSQL/MSSQLDataStore.cs | 6 +++++ .../OpenSim.DataStore.NullStorage/NullDataStore.cs | 7 +++++- 6 files changed, 64 insertions(+), 27 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs index 78ad428..47768b7 100644 --- a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs +++ b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs @@ -44,8 +44,26 @@ namespace OpenSim.Region.Environment.Interfaces /// Temporary switch while this option is immature void Initialise(string filename, bool persistPrimInventories); + /// + /// Stores all object's details apart from inventory + /// + /// + /// void StoreObject(SceneObjectGroup obj, LLUUID regionUUID); + + /// + /// Entirely removes the object, including inventory + /// + /// + /// + /// void RemoveObject(LLUUID uuid, LLUUID regionUUID); + + /// + /// Store a prim's inventory + /// + /// + void StorePrimInventory(LLUUID primID, IDictionary items); List LoadObjects(LLUUID regionUUID); @@ -58,4 +76,4 @@ namespace OpenSim.Region.Environment.Interfaces void Shutdown(); } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs index 59ffded..1bddf25 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs @@ -179,13 +179,6 @@ namespace OpenSim.Region.Environment.Scenes taskItem.InvType = item.invType; part.AddInventoryItem(taskItem); - // It might seem somewhat crude to update the whole group for a single prim inventory change, - // but it's possible that other prim inventory changes will take place before the region - // persistence thread visits this object. In the future, changes can be signalled at a more - // granular level, or we could let the datastore worry about whether prims have really - // changed since they were last persisted. - HasGroupChanged = true; - return true; } else @@ -234,14 +227,7 @@ namespace OpenSim.Region.Environment.Scenes SceneObjectPart part = GetChildPart(item.ParentPartID); if (part != null) { - part.UpdateInventoryItem(item); - - // It might seem somewhat crude to update the whole group for a single prim inventory change, - // but it's possible that other prim inventory changes will take place before the region - // persistence thread visits this object. In the future, changes can be signalled at a more - // granular level, or we could let the datastore worry about whether prims have really - // changed since they were last persisted. - HasGroupChanged = true; + part.UpdateInventoryItem(item); return true; } @@ -263,13 +249,6 @@ namespace OpenSim.Region.Environment.Scenes { int type = part.RemoveInventoryItem(itemID); - // It might seem somewhat crude to update the whole group for a single prim inventory change, - // but it's possible that other prim inventory changes will take place before the region - // persistence thread visits this object. In the future, changes can be signalled at a more - // granular level, or we could let the datastore worry about whether prims have really - // changed since they were last persisted. - HasGroupChanged = true; - return type; } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index be24f66..12176af 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -1492,6 +1492,8 @@ namespace OpenSim.Region.Environment.Scenes datastore.StoreObject(this, m_scene.RegionInfo.RegionID); HasGroupChanged = false; } + + ForEachPart(delegate(SceneObjectPart part) { part.ProcessInventoryBackup(datastore); }); } #endregion @@ -1704,9 +1706,12 @@ namespace OpenSim.Region.Environment.Scenes public void ForEachPart(Action whatToDo) { - foreach (SceneObjectPart part in m_parts.Values) + lock (m_parts) { - whatToDo(part); + foreach (SceneObjectPart part in m_parts.Values) + { + whatToDo(part); + } } } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index 1a9e6c4..c0297cf 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs @@ -82,6 +82,11 @@ namespace OpenSim.Region.Environment.Scenes } /// + /// Tracks whether inventory has changed since the last persistent backup + /// + private bool HasInventoryChanged; + + /// /// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating /// new ones or setting existing UUIDs to the correct parent UUIDs /// @@ -207,6 +212,7 @@ namespace OpenSim.Region.Environment.Scenes } m_inventorySerial++; + HasInventoryChanged = true; } /// @@ -224,7 +230,7 @@ namespace OpenSim.Region.Environment.Scenes TriggerScriptChangedEvent(Changed.INVENTORY); } } - + m_inventorySerial++; } @@ -268,6 +274,8 @@ namespace OpenSim.Region.Environment.Scenes m_taskInventory[item.ItemID] = item; m_inventorySerial++; TriggerScriptChangedEvent(Changed.INVENTORY); + + HasInventoryChanged = true; return true; } @@ -300,6 +308,8 @@ namespace OpenSim.Region.Environment.Scenes m_inventorySerial++; TriggerScriptChangedEvent(Changed.INVENTORY); + HasInventoryChanged = true; + return type; } else @@ -380,6 +390,20 @@ namespace OpenSim.Region.Environment.Scenes xferManager.AddNewFile(m_inventoryFileName, fileData); } } + + /// + /// Process inventory backup + /// + /// + public void ProcessInventoryBackup(IRegionDataStore datastore) + { + if (HasInventoryChanged) + { + datastore.StorePrimInventory(UUID, TaskInventory); + + HasInventoryChanged = false; + } + } public class InventoryStringBuilder { diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MSSQL/MSSQLDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MSSQL/MSSQLDataStore.cs index 7884277..6aeb808 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MSSQL/MSSQLDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MSSQL/MSSQLDataStore.cs @@ -752,6 +752,12 @@ namespace OpenSim.DataStore.MSSQL fillShapeRow(shapeRow, prim); } } + + // see IRegionDatastore + public void StorePrimInventory(LLUUID primID, IDictionary items) + { + // No implementation yet + } /*********************************************************************** * diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs index 035c3ba..8039e51 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs @@ -49,6 +49,11 @@ namespace OpenSim.DataStore.NullStorage public void RemoveObject(LLUUID obj, LLUUID regionUUID) { } + + // see IRegionDatastore + public void StorePrimInventory(LLUUID primID, IDictionary items) + { + } public List LoadObjects(LLUUID regionUUID) { @@ -81,4 +86,4 @@ namespace OpenSim.DataStore.NullStorage { } } -} \ No newline at end of file +} -- cgit v1.1