From 0bf2177dfb9d2c326123921b07c0111d985b5a88 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Tue, 24 Mar 2009 20:48:27 +0000 Subject: [PATCH] * Use memory more efficiently when loading oars * This change starts the script immediately after an object is loaded, rather than waiting till they are all loaded * This should be okay, but please report any new errors --- .../World/Archiver/ArchiveReadRequest.cs | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 03e4bce41d..5c9f755e3a 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -167,10 +167,24 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface(); - ICollection sceneObjects = new List(); + int sceneObjectsLoadedCount = 0; + foreach (string serialisedSceneObject in serialisedSceneObjects) { + m_log.DebugFormat("[ARCHIVER]: Loading xml with raw size {0}", serialisedSceneObject.Length); + + // Really large xml files (multi megabyte) appear to cause + // memory problems + // when loading the xml. But don't enable this check yet +/* + if (serialisedSceneObject.Length > 5000000) + { + m_log.Error("[ARCHIVER]: Ignoring xml since size > 5000000);"); + continue; + } +*/ + SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned @@ -222,26 +236,20 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (m_scene.AddRestoredSceneObject(sceneObject, true, false)) { - sceneObjects.Add(sceneObject); + sceneObjectsLoadedCount++; + sceneObject.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 0); } } - m_log.InfoFormat("[ARCHIVER]: Restored {0} scene objects to the scene", sceneObjects.Count); + m_log.InfoFormat("[ARCHIVER]: Restored {0} scene objects to the scene", sceneObjectsLoadedCount); - int ignoredObjects = serialisedSceneObjects.Count - sceneObjects.Count; + int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount; if (ignoredObjects > 0) m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); m_log.InfoFormat("[ARCHIVER]: Successfully loaded archive"); - m_log.Debug("[ARCHIVER]: Starting scripts"); - - foreach (SceneObjectGroup sceneObject in sceneObjects) - { - sceneObject.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 0); - } - m_scene.EventManager.TriggerOarFileLoaded(m_errorMessage); }