diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs index 05223725d9..40c7a6940c 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs @@ -71,6 +71,9 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver List serialisedSceneObjects = new List(); string filePath = "ERROR"; + + int successfulAssetRestores = 0; + int failedAssetRestores = 0; byte[] data; while ((data = archive.ReadEntry(out filePath)) != null) @@ -89,7 +92,10 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver // } else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) { - LoadAsset(filePath, data); + if (LoadAsset(filePath, data)) + successfulAssetRestores++; + else + failedAssetRestores++; } else if (filePath.StartsWith(ArchiveConstants.TERRAINS_PATH)) { @@ -100,9 +106,14 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver //m_log.Debug("[ARCHIVER]: Reached end of archive"); archive.Close(); + + m_log.InfoFormat("[ARCHIVER]: Restored {0} assets", successfulAssetRestores); + + if (failedAssetRestores > 0) + m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); // Reload serialized prims - m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects", serialisedSceneObjects.Count); + m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); IRegionSerialiser serialiser = m_scene.RequestModuleInterface(); ICollection sceneObjects = new List(); @@ -115,12 +126,12 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver sceneObjects.Add(sceneObject); } - m_log.InfoFormat("[ARCHIVER]: Restored {0} objects to the scene", sceneObjects.Count); + m_log.InfoFormat("[ARCHIVER]: Restored {0} scene objects to the scene", sceneObjects.Count); int ignoredObjects = serialisedSceneObjects.Count - sceneObjects.Count; if (ignoredObjects > 0) - m_log.WarnFormat("[ARCHIVER]: Ignored {0} objects that already existed in the scene", ignoredObjects); + m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); m_log.InfoFormat("[ARCHIVER]: Successfully loaded archive"); @@ -149,7 +160,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver { sbyte assetType = ArchiveConstants.EXTENSION_TO_ASSET_TYPE[extension]; - m_log.DebugFormat("[ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType); + //m_log.DebugFormat("[ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType); AssetBase asset = new AssetBase(new LLUUID(uuid), String.Empty); asset.Type = assetType; @@ -185,7 +196,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver terrainModule.LoadFromStream(terrainPath, ms); ms.Close(); - m_log.DebugFormat("[ARCHIVER]: Successfully loaded terrain {0}", terrainPath); + m_log.DebugFormat("[ARCHIVER]: Restored terrain {0}", terrainPath); return true; } diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs index a0a579cde8..8236b6ca58 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -215,7 +215,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver // XXX: Not a great way to iterate through face textures, but there's no // other method available to tell how many faces there actually are - int i = 0; + //int i = 0; foreach (LLObject.TextureEntryFace texture in textureEntry.FaceTextures) { if (texture != null) diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs index bd19a7e73b..6327d65a83 100644 --- a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs +++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs @@ -185,7 +185,7 @@ namespace OpenSim.Region.Environment.Scenes { SceneObjectGroup obj = new SceneObjectGroup(xmlData); - if (scene.AddRestoredSceneObject(obj, true)) + if (scene.AddRestoredSceneObject(obj, true, false)) return obj; else return null; diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index abd3387b50..7e8259f57d 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -196,10 +196,15 @@ namespace OpenSim.Region.Environment.Scenes /// If true, changes to the object will be reflected in its persisted data /// If false, the persisted data will not be changed even if the object in the scene is changed /// + /// + /// If true, we won't persist this object until it changes + /// If false, we'll persist this object immediately + /// /// /// true if the object was added, false if an object with the same uuid was already in the scene /// - protected internal bool AddRestoredSceneObject(SceneObjectGroup sceneObject, bool attachToBackup) + protected internal bool AddRestoredSceneObject( + SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) { sceneObject.RegionHandle = m_regInfo.RegionHandle; sceneObject.SetScene(m_parentScene); @@ -211,6 +216,12 @@ namespace OpenSim.Region.Environment.Scenes sceneObject.UpdateParentIDs(); + if (!alreadyPersisted) + { + sceneObject.ForceInventoryPersistence(); + sceneObject.HasGroupChanged = true; + } + return AddSceneObject(sceneObject, attachToBackup); } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 15645560e5..fb931f4db2 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1485,7 +1485,7 @@ namespace OpenSim.Region.Environment.Scenes List PrimsFromDB = m_storageManager.DataStore.LoadObjects(regionID); foreach (SceneObjectGroup group in PrimsFromDB) { - AddRestoredSceneObject(group, true); + AddRestoredSceneObject(group, true, true); SceneObjectPart rootPart = group.GetChildPart(group.UUID); rootPart.ObjectFlags &= ~(uint)LLObject.ObjectFlags.Scripted; rootPart.TrimPermissions(); @@ -1665,9 +1665,21 @@ namespace OpenSim.Region.Environment.Scenes /// Add an object into the scene that has come from storage /// /// - public bool AddRestoredSceneObject(SceneObjectGroup sceneObject, bool attachToBackup) + /// + /// If true, changes to the object will be reflected in its persisted data + /// If false, the persisted data will not be changed even if the object in the scene is changed + /// + /// + /// If true, we won't persist this object until it changes + /// If false, we'll persist this object immediately + /// + /// + /// true if the object was added, false if an object with the same uuid was already in the scene + /// + public bool AddRestoredSceneObject( + SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) { - return m_innerScene.AddRestoredSceneObject(sceneObject, attachToBackup); + return m_innerScene.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted); } /// diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs index 799cb41090..8feb8522c3 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs @@ -38,6 +38,20 @@ namespace OpenSim.Region.Environment.Scenes { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + /// + /// Force all task inventories of prims in the scene object to persist + /// + public void ForceInventoryPersistence() + { + lock (m_parts) + { + foreach (SceneObjectPart part in m_parts.Values) + { + part.ForceInventoryPersistence(); + } + } + } + /// /// Start the scripts contained in all the prims in this group. /// @@ -53,6 +67,9 @@ namespace OpenSim.Region.Environment.Scenes } } + /// + /// Stop the scripts contained in all the prims in this group + /// public void RemoveScriptInstances() { lock (m_parts) diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 1b3d9427c0..86e0caa969 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -1396,7 +1396,7 @@ namespace OpenSim.Region.Environment.Scenes } /// - /// + /// Make a copy of the given part. /// /// /// diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index 005d872a4a..d4073921be 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs @@ -58,7 +58,15 @@ namespace OpenSim.Region.Environment.Scenes /// /// Tracks whether inventory has changed since the last persistent backup /// - private bool HasInventoryChanged; + protected bool HasInventoryChanged; + + /// + /// Force the task inventory of this prim to persist at the next update sweep + /// + public void ForceInventoryPersistence() + { + HasInventoryChanged = true; + } /// /// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating @@ -72,9 +80,7 @@ namespace OpenSim.Region.Environment.Scenes lock (TaskInventory) { if (0 == TaskInventory.Count) - { return; - } HasInventoryChanged = true; ParentGroup.HasGroupChanged = true; @@ -597,7 +603,7 @@ namespace OpenSim.Region.Environment.Scenes public void ProcessInventoryBackup(IRegionDataStore datastore) { if (HasInventoryChanged) - { + { lock (TaskInventory) { datastore.StorePrimInventory(UUID, TaskInventory.Values);