From 038d1bf742ba4f95ca8a83b27f6fefb755485524 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 17:44:37 +0000 Subject: [PATCH 01/38] Add a regression test to compile and start a script. Remove Path.GetDirectoryName when getting assembly loading path in Compiler.CompileFromDotNetText(). The Path.GetDirectoryName call in Compiler.CompileFromDotNetText is unnecessary since AppDomain.CurrentDomain.BaseDirectory is always a directory. Later path concatenation is already done by Path.Combine() which handles any trailing slash. Removing Path.GetDirectoryName() will not affect the runtime but allows NUnit to work since it doesn't add a trailing slash to AppDomain.CurrentDomain.BaseDirectory. --- .../Scenes/SceneObjectPartInventory.cs | 12 +-- .../ScriptEngine/Shared/AssemblyResolver.cs | 4 +- .../Shared/CodeTools/CSCodeGenerator.cs | 6 ++ .../ScriptEngine/Shared/CodeTools/Compiler.cs | 10 +- .../ScriptEngine/XEngine/Tests/XEngineTest.cs | 96 +++++++++++++++---- .../Region/ScriptEngine/XEngine/XEngine.cs | 23 ++++- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 23 ++++- 7 files changed, 137 insertions(+), 37 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 0c36dcd686..f2d19156f1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -267,10 +267,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) { - // m_log.InfoFormat( - // "[PRIM INVENTORY]: " + - // "Starting script {0}, {1} in prim {2}, {3}", - // item.Name, item.ItemID, Name, UUID); +// m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}", +// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) return; @@ -299,8 +297,7 @@ namespace OpenSim.Region.Framework.Scenes if (null == asset) { m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", + "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", item.Name, item.ItemID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); } @@ -400,8 +397,7 @@ namespace OpenSim.Region.Framework.Scenes CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); else m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", + "[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", itemId, m_part.Name, m_part.UUID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); } diff --git a/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs b/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs index 130e197841..e35f79fd71 100644 --- a/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs +++ b/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs @@ -44,7 +44,7 @@ namespace OpenSim.Region.ScriptEngine.Shared string dirName = myDomain.FriendlyName; string ScriptEnginesPath = myDomain.SetupInformation.PrivateBinPath; - string[] pathList = new string[] {"bin", ScriptEnginesPath, + string[] pathList = new string[] {"", "bin", ScriptEnginesPath, Path.Combine(ScriptEnginesPath, dirName)}; string assemblyName = args.Name; @@ -56,6 +56,8 @@ namespace OpenSim.Region.ScriptEngine.Shared string path = Path.Combine(Directory.GetCurrentDirectory(), Path.Combine(s, assemblyName))+".dll"; +// Console.WriteLine("Trying to resolve {0}", path); + if (File.Exists(path)) return Assembly.LoadFrom(path); } diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs index b1fb6c2810..8b88588391 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs @@ -28,12 +28,16 @@ using System; using System.IO; using System.Collections.Generic; +using System.Reflection; +using log4net; using Tools; namespace OpenSim.Region.ScriptEngine.Shared.CodeTools { public class CSCodeGenerator : ICodeConverter { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private SYMBOL m_astRoot = null; private Dictionary, KeyValuePair> m_positionMap; private int m_indentWidth = 4; // for indentation @@ -87,6 +91,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// String containing the generated C# code. public string Convert(string script) { +// m_log.DebugFormat("[CS CODE GENERATOR]: Converting to C#\n{0}", script); + m_warnings.Clear(); ResetCounters(); Parser p = new LSLSyntax(new yyLSLSyntax(), new ErrorHandler(true)); diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index 734d4d5beb..c10143b9a1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs @@ -291,6 +291,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools public void PerformScriptCompile(string Script, string asset, UUID ownerUUID, out string assembly, out Dictionary, KeyValuePair> linemap) { +// m_log.DebugFormat("[Compiler]: Compiling script\n{0}", Script); + linemap = null; m_warnings.Clear(); @@ -357,6 +359,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools if (Script.StartsWith("//yp", true, CultureInfo.InvariantCulture)) language = enumCompileType.yp; +// m_log.DebugFormat("[Compiler]: Compile language is {0}", language); + if (!AllowedCompilers.ContainsKey(language.ToString())) { // Not allowed to compile to this language! @@ -417,7 +421,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools } assembly = CompileFromDotNetText(compileScript, language, asset, assembly); - return; } public string[] GetWarnings() @@ -491,6 +494,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Filename to .dll assembly internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset, string assembly) { +// m_log.DebugFormat("[Compiler]: Compiling to assembly\n{0}", Script); + string ext = "." + lang.ToString(); // Output assembly name @@ -531,8 +536,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools parameters.IncludeDebugInformation = true; - string rootPath = - Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); + string rootPath = AppDomain.CurrentDomain.BaseDirectory; parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.dll")); diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs index b635d5c604..7d7bd82778 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs @@ -27,44 +27,100 @@ using System; using System.Collections.Generic; +using System.Threading; using Nini.Config; using NUnit.Framework; -using OpenSim.Tests.Common.Mock; -using OpenSim.Region.Framework.Scenes; using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Scripting.WorldComm; +using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; namespace OpenSim.Region.ScriptEngine.XEngine.Tests { /// - /// Scene presence tests + /// XEngine tests. /// - /// Commented out XEngineTests that don't do anything - /* [TestFixture] public class XEngineTest { - public Scene scene; - - public static Random random; - public TestClient testclient; - //TestCommunicationsManager cm; + private TestScene m_scene; + private XEngine m_xEngine; + private AutoResetEvent m_chatEvent = new AutoResetEvent(false); + private OSChatMessage m_osChatMessageReceived; [TestFixtureSetUp] public void Init() { - TestCommunicationsManager cm = new TestCommunicationsManager(); - scene = SceneSetupHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, cm); - random = new Random(); + //AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin"); +// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); + m_xEngine = new XEngine(); + + // Necessary to stop serialization complaining + WorldCommModule wcModule = new WorldCommModule(); + + IniConfigSource configSource = new IniConfigSource(); + + IConfig startupConfig = configSource.AddConfig("Startup"); + startupConfig.Set("DefaultScriptEngine", "XEngine"); + + IConfig xEngineConfig = configSource.AddConfig("XEngine"); + xEngineConfig.Set("Enabled", "true"); + + // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call + // to AssemblyResolver.OnAssemblyResolve fails. + xEngineConfig.Set("AppDomainLoading", "false"); + + m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); + SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); + m_scene.StartScripts(); } - + + /// + /// Test compilation and starting of a script. + /// + /// + /// This is a less than ideal regression test since it involves an asynchronous operation (in this case, + /// compilation of the script). + /// [Test] - public void T001_XStart() + public void TestCompileAndStartScript() { - INonSharedRegionModule xengine = new XEngine(); - SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), xengine); - xengine.RegionLoaded(scene); + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + UUID userId = TestHelpers.ParseTail(0x1); +// UUID objectId = TestHelpers.ParseTail(0x2); +// UUID itemId = TestHelpers.ParseTail(0x3); + string itemName = "TestStartScript() Item"; + + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "TestStartScriptPart_", 0x100); + m_scene.AddNewSceneObject(so, true); + + InventoryItemBase itemTemplate = new InventoryItemBase(); +// itemTemplate.ID = itemId; + itemTemplate.Name = itemName; + itemTemplate.Folder = so.UUID; + itemTemplate.InvType = (int)InventoryType.LSL; + + m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; + + m_scene.RezNewScript(userId, itemTemplate); + + m_chatEvent.WaitOne(60000); + + Assert.That(m_osChatMessageReceived, Is.Not.Null, "No chat message received in TestStartScript()"); + Assert.That(m_osChatMessageReceived.Message, Is.EqualTo("Script running")); + } + + private void OnChatFromWorld(object sender, OSChatMessage oscm) + { +// Console.WriteLine("Got chat [{0}]", oscm.Message); + + m_osChatMessageReceived = oscm; + m_chatEvent.Set(); } } - */ -} +} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index f11987eede..c68f03ff87 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -680,6 +680,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) { +// m_log.DebugFormat( +// "[XEngine]: OnRezScript event triggered for script {0}, startParam {1}, postOnRez {2}, engine {3}, stateSource {4}, script\n{5}", +// itemID, startParam, postOnRez, engine, stateSource, script); + if (script.StartsWith("//MRM:")) return; @@ -761,6 +765,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_CompileDict[itemID] = 0; } +// m_log.DebugFormat("[XEngine]: Added script {0} to compile queue", itemID); + if (m_CurrentCompile == null) { // NOTE: Although we use a lockless queue, the lock here @@ -822,6 +828,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine bool postOnRez = (bool)p[4]; StateSource stateSource = (StateSource)p[5]; +// m_log.DebugFormat("[XEngine]: DoOnRezScript called for script {0}", itemID); + lock (m_CompileDict) { if (!m_CompileDict.ContainsKey(itemID)) @@ -870,7 +878,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine { try { - lock (m_AddingAssemblies) + lock (m_AddingAssemblies) { m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assembly, out linemap); if (!m_AddingAssemblies.ContainsKey(assembly)) { @@ -922,6 +930,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine } catch (Exception e) { +// m_log.ErrorFormat("[XEngine]: Exception when rezzing script {0}{1}", e.Message, e.StackTrace); + // try // { if (!m_ScriptErrors.ContainsKey(itemID)) @@ -1132,7 +1142,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine handlerObjectRemoved(part.UUID); } - ScriptRemoved handlerScriptRemoved = OnScriptRemoved; if (handlerScriptRemoved != null) handlerScriptRemoved(itemID); @@ -1381,6 +1390,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine string path = Path.Combine(Directory.GetCurrentDirectory(), Path.Combine(s, assemblyName))+".dll"; +// Console.WriteLine("[XEngine]: Trying to resolve {0}", path); + if (File.Exists(path)) return Assembly.LoadFrom(path); } @@ -1863,16 +1874,24 @@ namespace OpenSim.Region.ScriptEngine.XEngine public void SuspendScript(UUID itemID) { +// m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); + IScriptInstance instance = GetInstance(itemID); if (instance != null) instance.Suspend(); +// else +// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); } public void ResumeScript(UUID itemID) { +// m_log.DebugFormat("[XEngine]: Received request to resume script with ID {0}", itemID); + IScriptInstance instance = GetInstance(itemID); if (instance != null) instance.Resume(); +// else +// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID); } } } \ No newline at end of file diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index a25eb66751..aa904aad9c 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -88,9 +88,27 @@ namespace OpenSim.Tests.Common /// ID of the region /// X co-ordinate of the region /// Y co-ordinate of the region - /// This should be the same if simulating two scenes within a standalone + /// /// - public static TestScene SetupScene(string name, UUID id, uint x, uint y, CoreAssetCache cache) + public static TestScene SetupScene( + string name, UUID id, uint x, uint y, CoreAssetCache cache) + { + return SetupScene(name, id, x, y, cache, new IniConfigSource()); + } + + /// + /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions + /// or a different, to get a brand new scene with new shared region modules. + /// + /// Name of the region + /// ID of the region + /// X co-ordinate of the region + /// Y co-ordinate of the region + /// + /// + /// + public static TestScene SetupScene( + string name, UUID id, uint x, uint y, CoreAssetCache cache, IConfigSource configSource) { Console.WriteLine("Setting up test scene {0}", name); @@ -106,7 +124,6 @@ namespace OpenSim.Tests.Common ISimulationDataService simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin("OpenSim.Tests.Common.dll", null); IEstateDataService estateDataService = null; - IConfigSource configSource = new IniConfigSource(); TestScene testScene = new TestScene( regInfo, acm, scs, simDataService, estateDataService, null, false, configSource, null); From c22970448f00cdd88c1e81fc4f1a095f7d3d42e6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 19:42:32 +0000 Subject: [PATCH 02/38] Add TestCompileAndStart100Scripts() torture test. --- OpenSim/Tests/Torture/ObjectTortureTests.cs | 2 +- OpenSim/Tests/Torture/ScriptTortureTests.cs | 157 ++++++++++++++++++++ prebuild.xml | 2 + 3 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 OpenSim/Tests/Torture/ScriptTortureTests.cs diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs index b9764d767d..444b7ecf35 100644 --- a/OpenSim/Tests/Torture/ObjectTortureTests.cs +++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs @@ -118,7 +118,7 @@ namespace OpenSim.Tests.Torture TestScene scene = SceneHelpers.SetupScene(); - Process process = Process.GetCurrentProcess(); +// Process process = Process.GetCurrentProcess(); // long startProcessMemory = process.PrivateMemorySize64; long startGcMemory = GC.GetTotalMemory(true); DateTime start = DateTime.Now; diff --git a/OpenSim/Tests/Torture/ScriptTortureTests.cs b/OpenSim/Tests/Torture/ScriptTortureTests.cs new file mode 100644 index 0000000000..c0239ba5b6 --- /dev/null +++ b/OpenSim/Tests/Torture/ScriptTortureTests.cs @@ -0,0 +1,157 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.Threading; +using log4net; +using Nini.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Scripting.WorldComm; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.ScriptEngine.XEngine; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Tests.Torture +{ + /// + /// Script torture tests + /// + /// + /// Don't rely on the numbers given by these tests - they will vary a lot depending on what is already cached, + /// how much memory is free, etc. In some cases, later larger tests will apparently take less time than smaller + /// earlier tests. + /// + [TestFixture] + public class ScriptTortureTests + { + private TestScene m_scene; + private XEngine m_xEngine; + private AutoResetEvent m_chatEvent = new AutoResetEvent(false); + + private int m_expectedChatMessages; + private List m_osChatMessagesReceived = new List(); + + [SetUp] + public void Init() + { + //AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin"); +// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); + m_xEngine = new XEngine(); + + // Necessary to stop serialization complaining + WorldCommModule wcModule = new WorldCommModule(); + + IniConfigSource configSource = new IniConfigSource(); + + IConfig startupConfig = configSource.AddConfig("Startup"); + startupConfig.Set("DefaultScriptEngine", "XEngine"); + + IConfig xEngineConfig = configSource.AddConfig("XEngine"); + xEngineConfig.Set("Enabled", "true"); + + // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call + // to AssemblyResolver.OnAssemblyResolve fails. + xEngineConfig.Set("AppDomainLoading", "false"); + + m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); + SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); + + m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; + m_scene.StartScripts(); + } + + [Test] + public void TestCompileAndStart100Scripts() + { + TestHelpers.InMethod(); + log4net.Config.XmlConfigurator.Configure(); + + TestCompileAndStartScripts(100); + } + + private void TestCompileAndStartScripts(int scriptsToCreate) + { + UUID userId = TestHelpers.ParseTail(0x1); + + m_expectedChatMessages = scriptsToCreate; + int startingObjectIdTail = 0x100; + + for (int idTail = startingObjectIdTail;idTail < startingObjectIdTail + scriptsToCreate; idTail++) + { + AddObjectAndScript(idTail, userId); + } + + m_chatEvent.WaitOne(40000 + scriptsToCreate * 1000); + + Assert.That(m_osChatMessagesReceived.Count, Is.EqualTo(m_expectedChatMessages)); + + foreach (OSChatMessage msg in m_osChatMessagesReceived) + Assert.That( + msg.Message, + Is.EqualTo("Script running"), + string.Format( + "Message from {0} was {1} rather than {2}", msg.SenderUUID, msg.Message, "Script running")); + } + + private void AddObjectAndScript(int objectIdTail, UUID userId) + { +// UUID itemId = TestHelpers.ParseTail(0x3); + string itemName = string.Format("AddObjectAndScript() Item for object {0}", objectIdTail); + + SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "AddObjectAndScriptPart_", objectIdTail); + m_scene.AddNewSceneObject(so, true); + + InventoryItemBase itemTemplate = new InventoryItemBase(); +// itemTemplate.ID = itemId; + itemTemplate.Name = itemName; + itemTemplate.Folder = so.UUID; + itemTemplate.InvType = (int)InventoryType.LSL; + + m_scene.RezNewScript(userId, itemTemplate); + } + + private void OnChatFromWorld(object sender, OSChatMessage oscm) + { +// Console.WriteLine("Got chat [{0}]", oscm.Message); + + lock (m_osChatMessagesReceived) + { + m_osChatMessagesReceived.Add(oscm); + + if (m_osChatMessagesReceived.Count == m_expectedChatMessages) + m_chatEvent.Set(); + } + } + } +} \ No newline at end of file diff --git a/prebuild.xml b/prebuild.xml index 94d86d1292..23a5a3b40c 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -3286,7 +3286,9 @@ + + From 7583768b9e40e1033cc417047226d8ab80b36294 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 20:26:26 +0000 Subject: [PATCH 03/38] Remove debug logging if physics actor is null in SOP.ApplyPhysics() This is not valid in the case of BasicPhysics which can return a null PhysicsActor (though I think it should really return a do-nothing PhysicsActor). --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0e899ca168..4c339d9c8b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1501,7 +1501,7 @@ namespace OpenSim.Region.Framework.Scenes PhysActor = null; } - // Basic Physics returns null.. joy joy joy. + // Basic Physics can also return null as well as an exception catch. if (PhysActor != null) { PhysActor.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info @@ -1509,10 +1509,6 @@ namespace OpenSim.Region.Framework.Scenes DoPhysicsPropertyUpdate(RigidBody, true); PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0); } - else - { - m_log.DebugFormat("[SOP]: physics actor is null for {0} with parent {1}", UUID, this.ParentGroup.UUID); - } } } } From 773994723a9240b128f5054bd48e4e09b9045e63 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 20:35:04 +0000 Subject: [PATCH 04/38] Add warning about only uncommenting EstateConnectionString if you know what you're doing to GridCommon.ini.example (was already in StandaloneCommon.ini.example) --- bin/config-include/GridCommon.ini.example | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example index 4195bcee50..712481d299 100644 --- a/bin/config-include/GridCommon.ini.example +++ b/bin/config-include/GridCommon.ini.example @@ -14,6 +14,8 @@ ;StorageProvider = "OpenSim.Data.MySQL.dll" ;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;" ; Uncomment this line if you are using MySQL and want to use a different database for estates + ; The usual application for this is to allow estates to be spread out across multiple simulators by share the same database. + ; Most people won't need to do this so only uncomment if you know what you're doing. ;EstateConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;" ; MSSQL From bd928218dd0845bb0aef46749e8a393d0a9e4fbc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 21:00:47 +0000 Subject: [PATCH 05/38] Add TestAddTaskInventoryItem() --- .../Scenes/Tests/TaskInventoryTests.cs | 26 ++++++++++++++++++- .../Common/Helpers/TaskInventoryHelpers.cs | 12 ++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index 1abef8d846..e4b607daaf 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -52,6 +52,30 @@ namespace OpenSim.Region.Framework.Tests [TestFixture] public class TaskInventoryTests { + [Test] + public void TestAddTaskInventoryItem() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + Scene scene = SceneHelpers.SetupScene(); + UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); + SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); + SceneObjectPart sop1 = sog1.RootPart; + + // Create an object embedded inside the first + UUID taskSceneObjectItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); + TaskInventoryItem taskSceneObjectItem + = TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID); + + TaskInventoryItem addedItem = sop1.Inventory.GetInventoryItem(taskSceneObjectItemId); + Assert.That(addedItem.ItemID, Is.EqualTo(taskSceneObjectItemId)); + Assert.That(addedItem.OwnerID, Is.EqualTo(user1.PrincipalID)); + Assert.That(addedItem.ParentID, Is.EqualTo(sop1.UUID)); + Assert.That(addedItem.InvType, Is.EqualTo((int)InventoryType.Object)); + Assert.That(addedItem.Type, Is.EqualTo((int)AssetType.Object)); + } + [Test] public void TestRezObjectFromInventoryItem() { @@ -66,7 +90,7 @@ namespace OpenSim.Region.Framework.Tests // Create an object embedded inside the first UUID taskSceneObjectItemId = UUID.Parse("00000000-0000-0000-0000-100000000000"); TaskInventoryItem taskSceneObjectItem - = TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId); + = TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID); scene.AddSceneObject(sog1); diff --git a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs index a8f0d59849..7058d1e568 100644 --- a/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/TaskInventoryHelpers.cs @@ -72,15 +72,21 @@ namespace OpenSim.Tests.Common /// /// /// - public static TaskInventoryItem AddSceneObject(Scene scene, SceneObjectPart sop, string itemName, UUID id) + /// + public static TaskInventoryItem AddSceneObject( + Scene scene, SceneObjectPart sop, string itemName, UUID id, UUID userId) { SceneObjectGroup taskSceneObject = SceneHelpers.CreateSceneObject(1, UUID.Zero); AssetBase taskSceneObjectAsset = AssetHelpers.CreateAsset(0x10, taskSceneObject); scene.AssetService.Store(taskSceneObjectAsset); TaskInventoryItem taskSceneObjectItem = new TaskInventoryItem - { Name = itemName, AssetID = taskSceneObjectAsset.FullID, ItemID = id, - Type = (int)AssetType.Object, InvType = (int)InventoryType.Object }; + { Name = itemName, + AssetID = taskSceneObjectAsset.FullID, + ItemID = id, + OwnerID = userId, + Type = (int)AssetType.Object, + InvType = (int)InventoryType.Object }; sop.Inventory.AddInventoryItem(taskSceneObjectItem, true); return taskSceneObjectItem; From 1f402fdf5e8ef53a07f98c4447946805791d26bc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 21:40:28 +0000 Subject: [PATCH 06/38] Add url to logging if SynchronousRestFormsRequester.MakRequest() throws an exception in service connectors --- .../Avatar/AvatarServiceConnector.cs | 40 +++++------ .../Friends/FriendsServiceConnector.cs | 22 +++--- .../Connectors/Friends/FriendsSimConnector.cs | 9 ++- .../Connectors/Grid/GridServiceConnector.cs | 72 ++++++++++--------- .../GridUser/GridUserServiceConnector.cs | 15 ++-- .../Hypergrid/HGFriendsServiceConnector.cs | 15 ++-- .../MapImage/MapImageServiceConnector.cs | 5 +- .../Presence/PresenceServiceConnector.cs | 30 ++++---- .../UserAccountServiceConnector.cs | 15 ++-- 9 files changed, 120 insertions(+), 103 deletions(-) diff --git a/OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs b/OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs index 8fdb4d0b66..ddfca57c81 100644 --- a/OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs +++ b/OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs @@ -110,12 +110,11 @@ namespace OpenSim.Services.Connectors string reply = string.Empty; string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); try { - reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/avatar", - reqString); + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply == null || (reply != null && reply == string.Empty)) { m_log.DebugFormat("[AVATAR CONNECTOR]: GetAgent received null or empty reply"); @@ -124,7 +123,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server: {0}", e.Message); + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -159,12 +158,11 @@ namespace OpenSim.Services.Connectors string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; //m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); try { - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/avatar", - reqString); + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -177,15 +175,18 @@ namespace OpenSim.Services.Connectors return false; } else + { m_log.DebugFormat("[AVATAR CONNECTOR]: SetAvatar reply data does not contain result field"); - + } } else + { m_log.DebugFormat("[AVATAR CONNECTOR]: SetAvatar received empty reply"); + } } catch (Exception e) { - m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting avatar server: {0}", e.Message); + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; @@ -202,12 +203,11 @@ namespace OpenSim.Services.Connectors sendData["UserID"] = userID.ToString(); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); try { - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/avatar", - reqString); + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -228,7 +228,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting avatar server: {0}", e.Message); + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; @@ -246,12 +246,11 @@ namespace OpenSim.Services.Connectors sendData["Values"] = new List(values); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); try { - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/avatar", - reqString); + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -272,7 +271,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting avatar server: {0}", e.Message); + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; @@ -290,12 +289,11 @@ namespace OpenSim.Services.Connectors sendData["Names"] = new List(names); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); try { - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/avatar", - reqString); + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -316,7 +314,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting avatar server: {0}", e.Message); + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; diff --git a/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs b/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs index 41361ab6e4..44138c9fd1 100644 --- a/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs +++ b/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs @@ -108,12 +108,11 @@ namespace OpenSim.Services.Connectors.Friends protected FriendInfo[] GetFriends(Dictionary sendData, string PrincipalID) { string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/friends"; try { - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/friends", - reqString); + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -143,7 +142,6 @@ namespace OpenSim.Services.Connectors.Friends // Success return finfos.ToArray(); } - else m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: GetFriends {0} received null response", PrincipalID); @@ -152,7 +150,7 @@ namespace OpenSim.Services.Connectors.Friends } catch (Exception e) { - m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server: {0}", e.Message); + m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); } return new FriendInfo[0]; @@ -167,15 +165,14 @@ namespace OpenSim.Services.Connectors.Friends sendData["METHOD"] = "storefriend"; string reply = string.Empty; + string uri = m_ServerURI + "/friends"; try { - reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/friends", - ServerUtils.BuildQueryString(sendData)); + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server: {0}", e.Message); + m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return false; } @@ -223,15 +220,14 @@ namespace OpenSim.Services.Connectors.Friends public bool Delete(Dictionary sendData, string PrincipalID, string Friend) { string reply = string.Empty; + string uri = m_ServerURI = "/friends"; try { - reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/friends", - ServerUtils.BuildQueryString(sendData)); + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server: {0}", e.Message); + m_log.DebugFormat("[FRIENDS SERVICE CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return false; } diff --git a/OpenSim/Services/Connectors/Friends/FriendsSimConnector.cs b/OpenSim/Services/Connectors/Friends/FriendsSimConnector.cs index d0a20fc989..eea9853463 100644 --- a/OpenSim/Services/Connectors/Friends/FriendsSimConnector.cs +++ b/OpenSim/Services/Connectors/Friends/FriendsSimConnector.cs @@ -139,12 +139,11 @@ namespace OpenSim.Services.Connectors.Friends return false; m_log.DebugFormat("[FRIENDS SIM CONNECTOR]: region: {0}", region.ExternalHostName + ":" + region.HttpPort); + string uri = "http://" + region.ExternalHostName + ":" + region.HttpPort + "/friends"; + try { - string url = "http://" + region.ExternalHostName + ":" + region.HttpPort; - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - url + "/friends", - reqString); + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -165,7 +164,7 @@ namespace OpenSim.Services.Connectors.Friends } catch (Exception e) { - m_log.DebugFormat("[FRIENDS SIM CONNECTOR]: Exception when contacting remote sim: {0}", e.ToString()); + m_log.DebugFormat("[FRIENDS SIM CONNECTOR]: Exception when contacting remote sim at {0}: {1}", uri, e.Message); } return false; diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs index e57f28b44e..1599a56b1b 100644 --- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs +++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs @@ -98,12 +98,11 @@ namespace OpenSim.Services.Connectors sendData["METHOD"] = "register"; string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/grid"; // m_log.DebugFormat("[GRID CONNECTOR]: queryString = {0}", reqString); try { - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", - reqString); + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); if (reply != string.Empty) { Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -133,7 +132,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); } return "Error communicating with grid service"; @@ -147,11 +146,12 @@ namespace OpenSim.Services.Connectors sendData["METHOD"] = "deregister"; + string uri = m_ServerURI + "/grid"; + try { - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", - ServerUtils.BuildQueryString(sendData)); + string reply + = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); if (reply != string.Empty) { @@ -165,7 +165,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); } return false; @@ -184,15 +184,15 @@ namespace OpenSim.Services.Connectors string reqString = ServerUtils.BuildQueryString(sendData); string reply = string.Empty; + string uri = m_ServerURI + "/grid"; + try { - reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", - reqString); + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return rinfos; } @@ -228,15 +228,14 @@ namespace OpenSim.Services.Connectors sendData["METHOD"] = "get_region_by_uuid"; string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { - reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", - ServerUtils.BuildQueryString(sendData)); + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return null; } @@ -274,15 +273,16 @@ namespace OpenSim.Services.Connectors sendData["METHOD"] = "get_region_by_position"; string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return null; } @@ -318,15 +318,16 @@ namespace OpenSim.Services.Connectors sendData["METHOD"] = "get_region_by_name"; string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return null; } @@ -361,15 +362,16 @@ namespace OpenSim.Services.Connectors sendData["METHOD"] = "get_regions_by_name"; List rinfos = new List(); string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return rinfos; } @@ -413,17 +415,19 @@ namespace OpenSim.Services.Connectors List rinfos = new List(); string reply = string.Empty; + string uri = m_ServerURI + "/grid"; + try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return rinfos; } @@ -463,17 +467,18 @@ namespace OpenSim.Services.Connectors List rinfos = new List(); string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return rinfos; } @@ -515,17 +520,18 @@ namespace OpenSim.Services.Connectors List rinfos = new List(); string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return rinfos; } @@ -565,17 +571,18 @@ namespace OpenSim.Services.Connectors List rinfos = new List(); string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return rinfos; } @@ -615,15 +622,16 @@ namespace OpenSim.Services.Connectors sendData["METHOD"] = "get_region_flags"; string reply = string.Empty; + string uri = m_ServerURI + "/grid"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/grid", + uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); return -1; } diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs index aa98b5df49..20d7eaf301 100644 --- a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs +++ b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs @@ -156,11 +156,12 @@ namespace OpenSim.Services.Connectors sendData["LookAt"] = lookAt.ToString(); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/griduser"; // m_log.DebugFormat("[GRID USER CONNECTOR]: queryString = {0}", reqString); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/griduser", + uri, reqString); if (reply != string.Empty) { @@ -182,7 +183,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[GRID USER CONNECTOR]: Exception when contacting grid user server: {0}", e.Message); + m_log.DebugFormat("[GRID USER CONNECTOR]: Exception when contacting grid user server at {0}: {1}", uri, e.Message); } return false; @@ -191,11 +192,12 @@ namespace OpenSim.Services.Connectors protected GridUserInfo Get(Dictionary sendData) { string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/griduser"; // m_log.DebugFormat("[GRID USER CONNECTOR]: queryString = {0}", reqString); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/griduser", + uri, reqString); if (reply != string.Empty) { @@ -216,7 +218,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[GRID USER CONNECTOR]: Exception when contacting grid user server: {0}", e.Message); + m_log.DebugFormat("[GRID USER CONNECTOR]: Exception when contacting grid user server at {0}: {1}", uri, e.Message); } return null; @@ -235,11 +237,12 @@ namespace OpenSim.Services.Connectors string reply = string.Empty; string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/griduser"; //m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString); try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/griduser", + uri, reqString); if (reply == null || (reply != null && reply == string.Empty)) { @@ -249,7 +252,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[GRID USER CONNECTOR]: Exception when contacting grid user server: {0}", e.Message); + m_log.DebugFormat("[GRID USER CONNECTOR]: Exception when contacting grid user server at {0}: {1}", uri, e.Message); } List rinfos = new List(); diff --git a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs index d699f596a2..af4b0daf9b 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs @@ -79,11 +79,12 @@ namespace OpenSim.Services.Connectors.Hypergrid sendData["SESSIONID"] = m_SessionID.ToString(); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/hgfriends"; try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/hgfriends", + uri, reqString); if (reply != string.Empty) { @@ -103,7 +104,7 @@ namespace OpenSim.Services.Connectors.Hypergrid } catch (Exception e) { - m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); + m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); } return 0; @@ -123,15 +124,16 @@ namespace OpenSim.Services.Connectors.Hypergrid sendData["SESSIONID"] = m_SessionID.ToString(); string reply = string.Empty; + string uri = m_ServerURI + "/hgfriends"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/hgfriends", + uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); + m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return false; } @@ -168,15 +170,16 @@ namespace OpenSim.Services.Connectors.Hypergrid sendData["SECRET"] = secret; string reply = string.Empty; + string uri = m_ServerURI + "/hgfriends"; try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/hgfriends", + uri, ServerUtils.BuildQueryString(sendData)); } catch (Exception e) { - m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server: {0}", e.Message); + m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message); return false; } diff --git a/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs b/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs index e46714ec53..30bfb70aa9 100644 --- a/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs +++ b/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs @@ -97,11 +97,12 @@ namespace OpenSim.Services.Connectors sendData["DATA"] = Convert.ToBase64String(jpgData); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/map"; try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/map", + uri, reqString); if (reply != string.Empty) { @@ -135,7 +136,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[MAP IMAGE CONNECTOR]: Exception when contacting grid server: {0}", e.Message); + m_log.DebugFormat("[MAP IMAGE CONNECTOR]: Exception when contacting map server at {0}: {1}", uri, e.Message); } finally { diff --git a/OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs b/OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs index 7238afc613..f7d8c5379c 100644 --- a/OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs @@ -98,11 +98,12 @@ namespace OpenSim.Services.Connectors sendData["SecureSessionID"] = secureSessionID.ToString(); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/presence"; // m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/presence", + uri, reqString); if (reply != string.Empty) { @@ -124,7 +125,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server: {0}", e.Message); + m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; @@ -142,11 +143,12 @@ namespace OpenSim.Services.Connectors sendData["SessionID"] = sessionID.ToString(); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/presence"; // m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/presence", + uri, reqString); if (reply != string.Empty) { @@ -168,7 +170,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server: {0}", e.Message); + m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; @@ -185,11 +187,12 @@ namespace OpenSim.Services.Connectors sendData["RegionID"] = regionID.ToString(); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/presence"; // m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/presence", + uri, reqString); if (reply != string.Empty) { @@ -211,7 +214,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server: {0}", e.Message); + m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; @@ -229,11 +232,12 @@ namespace OpenSim.Services.Connectors sendData["RegionID"] = regionID.ToString(); string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/presence"; // m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/presence", + uri, reqString); if (reply != string.Empty) { @@ -255,7 +259,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server: {0}", e.Message); + m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } return false; @@ -273,11 +277,12 @@ namespace OpenSim.Services.Connectors string reply = string.Empty; string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/presence"; // m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString); try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/presence", + uri, reqString); if (reply == null || (reply != null && reply == string.Empty)) { @@ -287,7 +292,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server: {0}", e.Message); + m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -316,11 +321,12 @@ namespace OpenSim.Services.Connectors string reply = string.Empty; string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/presence"; //m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString); try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/presence", + uri, reqString); if (reply == null || (reply != null && reply == string.Empty)) { @@ -330,7 +336,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server: {0}", e.Message); + m_log.DebugFormat("[PRESENCE CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); } List rinfos = new List(); diff --git a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs b/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs index f6835b9f2f..609dafefd9 100644 --- a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs @@ -138,11 +138,12 @@ namespace OpenSim.Services.Connectors string reply = string.Empty; string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/accounts"; // m_log.DebugFormat("[ACCOUNTS CONNECTOR]: queryString = {0}", reqString); try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/accounts", + uri, reqString); if (reply == null || (reply != null && reply == string.Empty)) { @@ -152,7 +153,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[ACCOUNT CONNECTOR]: Exception when contacting accounts server: {0}", e.Message); + m_log.DebugFormat("[ACCOUNT CONNECTOR]: Exception when contacting user accounts server at {0}: {1}", uri, e.Message); } List accounts = new List(); @@ -206,11 +207,12 @@ namespace OpenSim.Services.Connectors { string reply = string.Empty; string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/accounts"; // m_log.DebugFormat("[ACCOUNTS CONNECTOR]: queryString = {0}", reqString); try { reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/accounts", + uri, reqString); if (reply == null || (reply != null && reply == string.Empty)) { @@ -220,7 +222,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[ACCOUNT CONNECTOR]: Exception when contacting user account server: {0}", e.Message); + m_log.DebugFormat("[ACCOUNT CONNECTOR]: Exception when contacting user accounts server at {0}: {1}", uri, e.Message); } Dictionary replyData = ServerUtils.ParseXmlResponse(reply); @@ -241,11 +243,12 @@ namespace OpenSim.Services.Connectors private bool SendAndGetBoolReply(Dictionary sendData) { string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/accounts"; // m_log.DebugFormat("[ACCOUNTS CONNECTOR]: queryString = {0}", reqString); try { string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/accounts", + uri, reqString); if (reply != string.Empty) { @@ -267,7 +270,7 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.DebugFormat("[ACCOUNTS CONNECTOR]: Exception when contacting user account server: {0}", e.Message); + m_log.DebugFormat("[ACCOUNT CONNECTOR]: Exception when contacting user accounts server at {0}: {1}", uri, e.Message); } return false; From c87751a822db328145963782f0f10adb23e32d39 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 23:03:53 +0000 Subject: [PATCH 07/38] Add start GC memory and end GC memory to object stress test printouts. This illustrates that references to Scene, SOG, etc. are not currently being released when a stress test ends (or at regression test end in general). This means even the current stress tests take much more memory than they need, a problem that will have to be addressed. --- .../Region/Framework/Scenes/SceneObjectGroup.cs | 3 ++- OpenSim/Tests/Common/Mock/TestScene.cs | 5 +++++ OpenSim/Tests/Torture/ObjectTortureTests.cs | 16 +++++++++++++--- OpenSim/Tests/Torture/ScriptTortureTests.cs | 2 ++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 89393426b4..b724135df5 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -567,7 +567,8 @@ namespace OpenSim.Region.Framework.Scenes // ~SceneObjectGroup() // { -// m_log.DebugFormat("[SCENE OBJECT GROUP]: Destructor called for {0}, local id {1}", Name, LocalId); +// //m_log.DebugFormat("[SCENE OBJECT GROUP]: Destructor called for {0}, local id {1}", Name, LocalId); +// Console.WriteLine("Destructor called for {0}, local id {1}", Name, LocalId); // } #region Constructors diff --git a/OpenSim/Tests/Common/Mock/TestScene.cs b/OpenSim/Tests/Common/Mock/TestScene.cs index 07bcdce382..328cd2b4e5 100644 --- a/OpenSim/Tests/Common/Mock/TestScene.cs +++ b/OpenSim/Tests/Common/Mock/TestScene.cs @@ -47,6 +47,11 @@ namespace OpenSim.Tests.Common.Mock dumpAssetsToFile, config, simulatorVersion) { } + + ~TestScene() + { + Console.WriteLine("TestScene destructor called for {0}", RegionInfo.RegionName); + } /// /// Temporarily override session authentication for tests (namely teleport). diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs index 444b7ecf35..74b336eeb9 100644 --- a/OpenSim/Tests/Torture/ObjectTortureTests.cs +++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs @@ -131,7 +131,7 @@ namespace OpenSim.Tests.Torture TimeSpan elapsed = DateTime.Now - start; // long processMemoryAlloc = process.PrivateMemorySize64 - startProcessMemory; - long processGcAlloc = GC.GetTotalMemory(false) - startGcMemory; + long endGcMemory = GC.GetTotalMemory(false); for (int i = 1; i <= objectsToAdd; i++) { @@ -141,9 +141,19 @@ namespace OpenSim.Tests.Torture string.Format("Object {0} could not be retrieved", i)); } + // This does not work to fire the SceneObjectGroup destructors - something else is hanging on to them. +// scene.DeleteAllSceneObjects(); + Console.WriteLine( - "Took {0}ms, {1}MB to create {2} objects each containing {3} prim(s)", - Math.Round(elapsed.TotalMilliseconds), processGcAlloc / 1024 / 1024, objectsToAdd, primsInEachObject); + "Took {0}ms, {1}MB ({2} - {3}) to create {4} objects each containing {5} prim(s)", + Math.Round(elapsed.TotalMilliseconds), + (endGcMemory - startGcMemory) / 1024 / 1024, + endGcMemory / 1024 / 1024, + startGcMemory / 1024 / 1024, + objectsToAdd, + primsInEachObject); + + scene = null; } } } \ No newline at end of file diff --git a/OpenSim/Tests/Torture/ScriptTortureTests.cs b/OpenSim/Tests/Torture/ScriptTortureTests.cs index c0239ba5b6..d94bbde680 100644 --- a/OpenSim/Tests/Torture/ScriptTortureTests.cs +++ b/OpenSim/Tests/Torture/ScriptTortureTests.cs @@ -107,6 +107,8 @@ namespace OpenSim.Tests.Torture m_expectedChatMessages = scriptsToCreate; int startingObjectIdTail = 0x100; + GC.Collect(); + for (int idTail = startingObjectIdTail;idTail < startingObjectIdTail + scriptsToCreate; idTail++) { AddObjectAndScript(idTail, userId); From a4367e75d39b3c3ba8aa0481c8bcb11991f7bb54 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 23:15:23 +0000 Subject: [PATCH 08/38] Set UseMeshiesPhysicsMesh = true in [Mesh] by default This means that uploaded meshes will get a physics (collision) mesh if uploaded with that option via a viewer. --- bin/OpenSimDefaults.ini | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 01cf7915f1..62fe9d4188 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -637,13 +637,12 @@ [Mesh] ; enable / disable Collada mesh support ; default is true - ; AllowMeshUpload = true + AllowMeshUpload = true ; if you use Meshmerizer and want collisions for meshies, setting this to true ; will cause OpenSim to attempt to decode meshies assets, extract the physics - ; mesh, and use it for collisions. This is currently experimental code and enabling - ; it may cause unexpected physics problems. - ;UseMeshiesPhysicsMesh = false + ; mesh, and use it for collisions. + UseMeshiesPhysicsMesh = true [ODEPhysicsSettings] From bef2a368f4d901fa231802845aa71b6134c888f4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Feb 2012 23:38:53 +0000 Subject: [PATCH 09/38] Make WebStats logging report consistently as WEB STATS MODULE instead of VC, VS and WEBSTATS --- OpenSim/Region/UserStatistics/WebStatsModule.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index 24a94180db..f627e37d8f 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -301,7 +301,7 @@ namespace OpenSim.Region.UserStatistics public void OnRegisterCaps(UUID agentID, Caps caps) { - m_log.DebugFormat("[VC]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); + m_log.DebugFormat("[WEB STATS MODULE]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); string capsPath = "/CAPS/VS/" + UUID.Random(); caps.RegisterHandler("ViewerStats", new RestStreamHandler("POST", capsPath, @@ -462,7 +462,7 @@ namespace OpenSim.Region.UserStatistics if (!m_sessions.ContainsKey(agentID)) { - m_log.Warn("[VS]: no session for stat disclosure"); + m_log.Warn("[WEB STATS MODULE]: no session for stat disclosure"); return new UserSessionID(); } uid = m_sessions[agentID]; @@ -667,14 +667,13 @@ namespace OpenSim.Region.UserStatistics { updatecmd.ExecuteNonQuery(); } - catch - (SqliteExecutionException) + catch (SqliteExecutionException) { - m_log.Warn("[WEBSTATS]: failed to write stats to storage Execution Exception"); + m_log.Warn("[WEB STATS MODULE]: failed to write stats to storage Execution Exception"); } catch (SqliteSyntaxException) { - m_log.Warn("[WEBSTATS]: failed to write stats to storage SQL Syntax Exception"); + m_log.Warn("[WEB STATS MODULE]: failed to write stats to storage SQL Syntax Exception"); } } From d5c08c44bf1f0a875ae3563b66c759d7a24155d8 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Tue, 7 Feb 2012 16:40:09 -0800 Subject: [PATCH 10/38] Add missing reference to prebuild.xml for torture tests --- prebuild.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/prebuild.xml b/prebuild.xml index 23a5a3b40c..1bf4972722 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -3288,6 +3288,7 @@ + From dfa19e23f03643762a10677203c088161a99557e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 8 Feb 2012 21:58:59 +0000 Subject: [PATCH 11/38] Stop a scene object from attempting to link with itself (which results in an exception and constant complaints in v3 viewers). Aims to address http://opensimulator.org/mantis/view.php?id=5878 --- .../Framework/Scenes/Scene.Inventory.cs | 21 +++++++++++++++-- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 16 +++++++++---- .../Framework/Scenes/SceneObjectGroup.cs | 4 ++++ .../Scenes/Tests/SceneObjectLinkingTests.cs | 23 ++++++++++++++++--- 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 6d7559e167..af01624200 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2170,7 +2170,24 @@ namespace OpenSim.Region.Framework.Scenes m_sceneGraph.DelinkObjects(parts); } + /// + /// Link the scene objects containing the indicated parts to a root object. + /// + /// + /// A root prim id of the object which will be the root prim of the resulting linkset. + /// A list of child prims for the objects that should be linked in. public void LinkObjects(IClientAPI client, uint parentPrimId, List childPrimIds) + { + LinkObjects(client.AgentId, parentPrimId, childPrimIds); + } + + /// + /// Link the scene objects containing the indicated parts to a root object. + /// + /// The ID of the user linking. + /// A root prim id of the object which will be the root prim of the resulting linkset. + /// A list of child prims for the objects that should be linked in. + public void LinkObjects(UUID agentId, uint parentPrimId, List childPrimIds) { List owners = new List(); @@ -2183,7 +2200,7 @@ namespace OpenSim.Region.Framework.Scenes return; } - if (!Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID)) + if (!Permissions.CanLinkObject(agentId, root.ParentGroup.RootPart.UUID)) { m_log.DebugFormat("[LINK]: Refusing link. No permissions on root prim"); return; @@ -2199,7 +2216,7 @@ namespace OpenSim.Region.Framework.Scenes if (!owners.Contains(part.OwnerID)) owners.Add(part.OwnerID); - if (Permissions.CanLinkObject(client.AgentId, part.ParentGroup.RootPart.UUID)) + if (Permissions.CanLinkObject(agentId, part.ParentGroup.RootPart.UUID)) children.Add(part); } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 7d801b52c1..693a79e5df 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -1662,6 +1662,10 @@ namespace OpenSim.Region.Framework.Scenes { SceneObjectGroup child = children[i].ParentGroup; + // Don't try and add a group to itself - this will only cause severe problems later on. + if (child == parentGroup) + continue; + // Make sure no child prim is set for sale // So that, on delink, no prims are unwittingly // left for sale and sold off @@ -1684,11 +1688,13 @@ namespace OpenSim.Region.Framework.Scenes // We need to explicitly resend the newly link prim's object properties since no other actions // occur on link to invoke this elsewhere (such as object selection) - parentGroup.RootPart.CreateSelected = true; - parentGroup.TriggerScriptChangedEvent(Changed.LINK); - parentGroup.HasGroupChanged = true; - parentGroup.ScheduleGroupForFullUpdate(); - + if (childGroups.Count > 0) + { + parentGroup.RootPart.CreateSelected = true; + parentGroup.TriggerScriptChangedEvent(Changed.LINK); + parentGroup.HasGroupChanged = true; + parentGroup.ScheduleGroupForFullUpdate(); + } } finally { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index b724135df5..5b838f8377 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1961,6 +1961,10 @@ namespace OpenSim.Region.Framework.Scenes // "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}", // objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID); + // Linking to ourselves is not a valid operation. + if (objectGroup == this) + return; + SceneObjectPart linkPart = objectGroup.m_rootPart; Vector3 oldGroupPosition = linkPart.GroupPosition; diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index a2332bb4ec..be5b4a8986 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs @@ -39,14 +39,31 @@ using log4net; namespace OpenSim.Region.Framework.Scenes.Tests { - /// - /// Linking tests - /// [TestFixture] public class SceneObjectLinkingTests { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + /// + /// Links to self should be ignored. + /// + [Test] + public void TestLinkToSelf() + { + TestHelpers.InMethod(); + + UUID ownerId = TestHelpers.ParseTail(0x1); + int nParts = 3; + + TestScene scene = SceneHelpers.SetupScene(); + SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(nParts, ownerId, "TestLinkToSelf_", 0x10); + scene.AddSceneObject(sog1); + scene.LinkObjects(ownerId, sog1.LocalId, new List() { sog1.Parts[1].LocalId }); +// sog1.LinkToGroup(sog1); + + Assert.That(sog1.Parts.Length, Is.EqualTo(nParts)); + } + [Test] public void TestLinkDelink2SceneObjects() { From dbe32a1f6d148d16c462b3b7d5a6c507743a5f9a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 9 Feb 2012 00:10:45 +0000 Subject: [PATCH 12/38] minor: put in commented out logging statements for future reuse --- OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 3 +++ .../Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 6a48b89d69..87014314ce 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -292,13 +292,16 @@ namespace OpenSim.Region.OptionalModules.World.NPC NPCAvatar av; if (m_avatars.TryGetValue(agentID, out av)) { +// m_log.DebugFormat("[NPC MODULE]: Found {0} {1} to remove", agentID, av.Name); scene.RemoveClient(agentID, false); m_avatars.Remove(agentID); +// m_log.DebugFormat("[NPC MODULE]: Removed {0} {1}", agentID, av.Name); return true; } } +// m_log.DebugFormat("[NPC MODULE]: Could not find {0} to remove", agentID); return false; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 9b93135fd4..bc1902b992 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -537,6 +537,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public bool Stop(int timeout) { +// m_log.DebugFormat( +// "[SCRIPT INSTANCE]: Stopping script {0} {1} with timeout {2}", ScriptName, ItemID, timeout); + IScriptWorkItem result; lock (m_EventQueue) @@ -769,7 +772,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } catch (Exception e) { - // m_log.DebugFormat("[SCRIPT] Exception: {0}", e.Message); +// m_log.DebugFormat( +// "[SCRIPT] Exception in script {0} {1}: {2}{3}", +// ScriptName, ItemID, e.Message, e.StackTrace); + m_InEvent = false; m_CurrentEvent = String.Empty; From 16c46360486cddb3968d12857e0f84c7cb9ede55 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 9 Feb 2012 00:38:09 +0000 Subject: [PATCH 13/38] Add NPC torture tests for 100, 1000 and 2000 create and delete NPC calls. --- OpenSim/Tests/Torture/NPCTortureTests.cs | 185 +++++++++++++++++++++++ prebuild.xml | 3 + 2 files changed, 188 insertions(+) create mode 100644 OpenSim/Tests/Torture/NPCTortureTests.cs diff --git a/OpenSim/Tests/Torture/NPCTortureTests.cs b/OpenSim/Tests/Torture/NPCTortureTests.cs new file mode 100644 index 0000000000..8078d9dfab --- /dev/null +++ b/OpenSim/Tests/Torture/NPCTortureTests.cs @@ -0,0 +1,185 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using log4net; +using Nini.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Region.CoreModules.Avatar.Attachments; +using OpenSim.Region.CoreModules.Avatar.AvatarFactory; +using OpenSim.Region.CoreModules.Framework.InventoryAccess; +using OpenSim.Region.CoreModules.Framework.UserManagement; +using OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.OptionalModules.World.NPC; +using OpenSim.Services.AvatarService; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Tests.Torture +{ + /// + /// NPC torture tests + /// + /// + /// Don't rely on the numbers given by these tests - they will vary a lot depending on what is already cached, + /// how much memory is free, etc. In some cases, later larger tests will apparently take less time than smaller + /// earlier tests. + /// + [TestFixture] + public class NPCTortureTests + { + private TestScene scene; + private AvatarFactoryModule afm; + private UserManagementModule umm; + private AttachmentsModule am; + + [TestFixtureSetUp] + public void FixtureInit() + { + // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread. + Util.FireAndForgetMethod = FireAndForgetMethod.None; + } + + [TestFixtureTearDown] + public void TearDown() + { + // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple + // threads. Possibly, later tests should be rewritten not to worry about such things. + Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; + } + + [SetUp] + public void Init() + { + IConfigSource config = new IniConfigSource(); + config.AddConfig("NPC"); + config.Configs["NPC"].Set("Enabled", "true"); + config.AddConfig("Modules"); + config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); + + afm = new AvatarFactoryModule(); + umm = new UserManagementModule(); + am = new AttachmentsModule(); + + scene = SceneHelpers.SetupScene(); + SceneHelpers.SetupSceneModules(scene, config, afm, umm, am, new BasicInventoryAccessModule(), new NPCModule()); + } + + [Test] + public void TestAddRemove100NPCs() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + TestAddRemoveNPCs(100); + } + + [Test] + public void TestAddRemove1000NPCs() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + TestAddRemoveNPCs(1000); + } + + [Test] + public void TestAddRemove2000NPCs() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + TestAddRemoveNPCs(2000); + } + + private void TestAddRemoveNPCs(int numberOfNpcs) + { + ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); +// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId); + + // 8 is the index of the first baked texture in AvatarAppearance + UUID originalFace8TextureId = TestHelpers.ParseTail(0x10); + Primitive.TextureEntry originalTe = new Primitive.TextureEntry(UUID.Zero); + Primitive.TextureEntryFace originalTef = originalTe.CreateFace(8); + originalTef.TextureID = originalFace8TextureId; + + // We also need to add the texture to the asset service, otherwise the AvatarFactoryModule will tell + // ScenePresence.SendInitialData() to reset our entire appearance. + scene.AssetService.Store(AssetHelpers.CreateNotecardAsset(originalFace8TextureId)); + + afm.SetAppearance(sp, originalTe, null); + + INPCModule npcModule = scene.RequestModuleInterface(); + + List npcs = new List(); + + long startGcMemory = GC.GetTotalMemory(true); + Stopwatch sw = new Stopwatch(); + sw.Start(); + + for (int i = 0; i < numberOfNpcs; i++) + { + npcs.Add( + npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, scene, sp.Appearance)); + } + + for (int i = 0; i < numberOfNpcs; i++) + { + Assert.That(npcs[i], Is.Not.Null); + + ScenePresence npc = scene.GetScenePresence(npcs[i]); + Assert.That(npc, Is.Not.Null); + } + + for (int i = 0; i < numberOfNpcs; i++) + { + Assert.That(npcModule.DeleteNPC(npcs[i], scene), Is.True); + ScenePresence npc = scene.GetScenePresence(npcs[i]); + Assert.That(npc, Is.Null); + } + + sw.Stop(); + + long endGcMemory = GC.GetTotalMemory(true); + + Console.WriteLine("Took {0} ms", sw.ElapsedMilliseconds); + Console.WriteLine( + "End {0} MB, Start {1} MB, Diff {2} MB", + endGcMemory / 1024 / 1024, + startGcMemory / 1024 / 1024, + (endGcMemory - startGcMemory) / 1024 / 1024); + } + } +} \ No newline at end of file diff --git a/prebuild.xml b/prebuild.xml index 1bf4972722..c64f1cc79b 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -3284,12 +3284,15 @@ + + + From 9c84a8162f700fc2eb35018389c12fcfedc02587 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 9 Feb 2012 01:17:59 +0000 Subject: [PATCH 14/38] If NPCModule.CreateNPC() fails to create the required ScenePresence (which should in theory never happen), don't add the NPC to the npc list but return UUID.Zero instead. --- OpenSim/Region/Framework/Interfaces/INPCModule.cs | 2 +- .../Region/OptionalModules/World/NPC/NPCModule.cs | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index 2731291ea0..dc3ff89303 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// The avatar appearance to use for the new NPC. - /// The UUID of the ScenePresence created. + /// The UUID of the ScenePresence created. UUID.Zero if there was a failure. UUID CreateNPC( string firstname, string lastname, diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 87014314ce..dc6eefcb16 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -148,22 +148,21 @@ namespace OpenSim.Region.OptionalModules.World.NPC ScenePresence sp; if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) { - m_log.DebugFormat( - "[NPC MODULE]: Successfully retrieved scene presence for NPC {0} {1}", sp.Name, sp.UUID); +// m_log.DebugFormat( +// "[NPC MODULE]: Successfully retrieved scene presence for NPC {0} {1}", sp.Name, sp.UUID); sp.CompleteMovement(npcAvatar, false); + m_avatars.Add(npcAvatar.AgentId, npcAvatar); + m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId); + + return npcAvatar.AgentId; } else { m_log.WarnFormat("[NPC MODULE]: Could not find scene presence for NPC {0} {1}", sp.Name, sp.UUID); + return UUID.Zero; } - - m_avatars.Add(npcAvatar.AgentId, npcAvatar); } - - m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId); - - return npcAvatar.AgentId; } public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget) From e8cc1bd3296a5085814ef27f2c74eb709efa9acd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 9 Feb 2012 20:12:29 +0000 Subject: [PATCH 15/38] Fix another Torture test build break on Windows. --- prebuild.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/prebuild.xml b/prebuild.xml index c64f1cc79b..54f42f44f2 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -3292,6 +3292,7 @@ + From ddca5347c31aa9547395ec918b5b5dcd2e498be7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 10 Feb 2012 02:13:15 +0000 Subject: [PATCH 16/38] When an asset is uploaded (e.g. a mesh) set individual copy/move/transfer permissions, not PermissionMask.All Setting PermissionMask.All will cause next permissions to replace current permissions when the object is rezzed, since bit 4 will be set. This is not correct behaviour for a freshly uploaded mesh. Freshly rezzed in-world prims also do not have bit 4 set (don't yet know exactly what this is). Should resolve http://opensimulator.org/mantis/view.php?id=5651 --- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 9 +++++++-- ...ewFileAgentInventoryVariablePriceModule.cs | 10 ++++++---- .../ObjectCaps/UploadObjectAssetModule.cs | 2 +- .../InventoryAccess/InventoryAccessModule.cs | 19 +++++++++++++++---- .../Framework/Scenes/Scene.Inventory.cs | 9 +++++++++ .../Scenes/SceneObjectGroup.Inventory.cs | 2 ++ 6 files changed, 40 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index cf0c28b8a8..be699db97f 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -422,7 +422,7 @@ namespace OpenSim.Region.ClientStack.Linden string assetType) { m_log.DebugFormat( - "Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}", + "[BUNCH OF CAPS]: Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}", assetID, inventoryItem, inventoryType, assetType); sbyte assType = 0; @@ -625,7 +625,12 @@ namespace OpenSim.Region.ClientStack.Linden item.AssetType = assType; item.InvType = inType; item.Folder = parentFolder; - item.CurrentPermissions = (uint)PermissionMask.All; + + // If we set PermissionMask.All then when we rez the item the next permissions will replace the current + // (owner) permissions. This becomes a problem if next permissions are changed. + item.CurrentPermissions + = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); + item.BasePermissions = (uint)PermissionMask.All; item.EveryOnePermissions = 0; item.NextPermissions = (uint)PermissionMask.All; diff --git a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs index aed03b39c1..1117f2a8a6 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs @@ -50,8 +50,7 @@ namespace OpenSim.Region.ClientStack.Linden [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] public class NewFileAgentInventoryVariablePriceModule : INonSharedRegionModule { -// private static readonly ILog m_log = -// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Scene m_scene; // private IAssetService m_assetService; @@ -210,6 +209,9 @@ namespace OpenSim.Region.ClientStack.Linden UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, string assetType,UUID AgentID) { +// m_log.DebugFormat( +// "[NEW FILE AGENT INVENTORY VARIABLE PRICE MODULE]: Upload complete for {0}", inventoryItem); + sbyte assType = 0; sbyte inType = 0; @@ -259,13 +261,13 @@ namespace OpenSim.Region.ClientStack.Linden item.AssetType = assType; item.InvType = inType; item.Folder = parentFolder; - item.CurrentPermissions = (uint)PermissionMask.All; + item.CurrentPermissions + = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); item.BasePermissions = (uint)PermissionMask.All; item.EveryOnePermissions = 0; item.NextPermissions = (uint)PermissionMask.All; item.CreationDate = Util.UnixTimeSinceEpoch(); m_scene.AddInventoryItem(item); - } } } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs index e4bacd4df2..7a3d97e5d3 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs @@ -339,7 +339,7 @@ namespace OpenSim.Region.ClientStack.Linden m_scene.AddSceneObject(grp); grp.AbsolutePosition = obj.Position; } - + allparts[i] = grp; } diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 54b422b37a..8b5b1a749f 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -789,6 +789,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess { group = objlist[i]; +// m_log.DebugFormat( +// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", +// group.Name, group.LocalId, group.UUID, +// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, +// remoteClient.Name); + // Vector3 storedPosition = group.AbsolutePosition; if (group.UUID == UUID.Zero) { @@ -854,9 +860,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess rootPart.ScheduleFullUpdate(); } -// m_log.DebugFormat( -// "[InventoryAccessModule]: Rezzed {0} {1} {2} for {3}", -// group.Name, group.LocalId, group.UUID, remoteClient.Name); +// m_log.DebugFormat( +// "[InventoryAccessModule]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", +// group.Name, group.LocalId, group.UUID, +// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, +// remoteClient.Name); } if (item != null) @@ -937,7 +945,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess } rootPart.FromFolderID = item.Folder; - + +// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", +// rootPart.OwnerID, item.Owner, item.CurrentPermissions); + if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0) { diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index af01624200..5a5307c471 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -347,6 +347,12 @@ namespace OpenSim.Region.Framework.Scenes { item.Name = itemUpd.Name; item.Description = itemUpd.Description; + +// m_log.DebugFormat( +// "[USER INVENTORY]: itemUpd {0} {1} {2} {3}, item {4} {5} {6} {7}", +// itemUpd.NextPermissions, itemUpd.GroupPermissions, itemUpd.EveryOnePermissions, item.Flags, +// item.NextPermissions, item.GroupPermissions, item.EveryOnePermissions, item.CurrentPermissions); + if (item.NextPermissions != (itemUpd.NextPermissions & item.BasePermissions)) item.Flags |= (uint)InventoryItemFlags.ObjectOverwriteNextOwner; item.NextPermissions = itemUpd.NextPermissions & item.BasePermissions; @@ -355,6 +361,9 @@ namespace OpenSim.Region.Framework.Scenes item.EveryOnePermissions = itemUpd.EveryOnePermissions & item.BasePermissions; if (item.GroupPermissions != (itemUpd.GroupPermissions & item.BasePermissions)) item.Flags |= (uint)InventoryItemFlags.ObjectOverwriteGroup; + +// m_log.DebugFormat("[USER INVENTORY]: item.Flags {0}", item.Flags); + item.GroupPermissions = itemUpd.GroupPermissions & item.BasePermissions; item.GroupID = itemUpd.GroupID; item.GroupOwned = itemUpd.GroupOwned; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index f173c95ed0..a73d9b69f9 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs @@ -265,6 +265,8 @@ namespace OpenSim.Region.Framework.Scenes public void ApplyNextOwnerPermissions() { +// m_log.DebugFormat("[PRIM INVENTORY]: Applying next owner permissions to {0} {1}", Name, UUID); + SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) parts[i].ApplyNextOwnerPermissions(); From 7273e05995671175d5175558ed72dd1cb331cacb Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Wed, 8 Feb 2012 21:45:00 +0100 Subject: [PATCH 17/38] Fix: Unable to remove AV from friend list (sqldb-bug) http://opensimulator.org/mantis/view.php?id=3731 --- OpenSim/Data/SQLite/SQLiteFriendsData.cs | 2 +- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/OpenSim/Data/SQLite/SQLiteFriendsData.cs b/OpenSim/Data/SQLite/SQLiteFriendsData.cs index b14c3482bb..5f68977c1f 100644 --- a/OpenSim/Data/SQLite/SQLiteFriendsData.cs +++ b/OpenSim/Data/SQLite/SQLiteFriendsData.cs @@ -75,7 +75,7 @@ namespace OpenSim.Data.SQLite cmd.Parameters.AddWithValue(":PrincipalID", principalID.ToString()); cmd.Parameters.AddWithValue(":Friend", friend); - ExecuteNonQuery(cmd, cmd.Connection); + ExecuteNonQuery(cmd, m_Connection); return true; } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 8273c6f7dd..ff96f4dcf0 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -5107,7 +5107,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP AddLocalPacketHandler(PacketType.ImprovedInstantMessage, HandlerImprovedInstantMessage, false); AddLocalPacketHandler(PacketType.AcceptFriendship, HandlerAcceptFriendship); AddLocalPacketHandler(PacketType.DeclineFriendship, HandlerDeclineFriendship); - AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFrendship); + AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFriendship); AddLocalPacketHandler(PacketType.RezObject, HandlerRezObject); AddLocalPacketHandler(PacketType.DeRezObject, HandlerDeRezObject); AddLocalPacketHandler(PacketType.ModifyLand, HandlerModifyLand); @@ -5827,7 +5827,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP return true; } - private bool HandlerTerminateFrendship(IClientAPI sender, Packet Pack) + private bool HandlerTerminateFriendship(IClientAPI sender, Packet Pack) { TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket)Pack; @@ -5842,13 +5842,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP UUID listOwnerAgentID = tfriendpack.AgentData.AgentID; UUID exFriendID = tfriendpack.ExBlock.OtherID; - - FriendshipTermination handlerTerminateFriendship = OnTerminateFriendship; - if (handlerTerminateFriendship != null) + FriendshipTermination TerminateFriendshipHandler = OnTerminateFriendship; + if (TerminateFriendshipHandler != null) { - handlerTerminateFriendship(this, listOwnerAgentID, exFriendID); + TerminateFriendshipHandler(this, listOwnerAgentID, exFriendID); + return true; } - return true; + return false; } private bool HandleFindAgent(IClientAPI client, Packet Packet) From 44d84bc2779165e75224975e83ca4539a00e9d24 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 10 Feb 2012 19:58:34 +0000 Subject: [PATCH 18/38] Fix bug where somebody taking a copy of an object they didn't own that was rezzed before the region was restarted would wrongly place the copy in the object owner's inventory. Addresses http://opensimulator.org/mantis/view.php?id=5825 --- .../InventoryAccess/InventoryAccessModule.cs | 12 ++++++++++-- .../Framework/Scenes/AsyncSceneObjectGroupDeleter.cs | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 8b5b1a749f..63ba3d39b8 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -546,12 +546,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess return null; userID = remoteClient.AgentId; + +// m_log.DebugFormat( +// "[INVENTORY ACCESS MODULE]: Target of {0} in CreateItemForObject() is {1} {2}", +// action, remoteClient.Name, userID); } else { // All returns / deletes go to the object owner // userID = so.RootPart.OwnerID; + +// m_log.DebugFormat( +// "[INVENTORY ACCESS MODULE]: Target of {0} in CreateItemForObject() is object owner {1}", +// action, userID); } if (userID == UUID.Zero) // Can't proceed @@ -637,11 +645,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess } // Override and put into where it came from, if it came - // from anywhere in inventory + // from anywhere in inventory and the owner is taking it back. // if (action == DeRezAction.Take || action == DeRezAction.TakeCopy) { - if (so.RootPart.FromFolderID != UUID.Zero) + if (so.RootPart.FromFolderID != UUID.Zero && userID == remoteClient.AgentId) { InventoryFolderBase f = new InventoryFolderBase(so.RootPart.FromFolderID, userID); folder = m_Scene.InventoryService.GetFolder(f); diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs index 5dfd3e027b..f678d07805 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs @@ -148,7 +148,8 @@ namespace OpenSim.Region.Framework.Scenes x = m_inventoryDeletes.Dequeue(); m_log.DebugFormat( - "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.", left, x.action, x.objectGroups.Count); + "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.", + left, x.action, x.objectGroups.Count); try { From a7dc7e636e3de9028668a6c570c6a713d4cd729b Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Fri, 10 Feb 2012 21:18:43 +0100 Subject: [PATCH 19/38] Fix: Covenant view fails after updates or cache-clean see mantis http://opensimulator.org/mantis/view.php?id=2879 Signed-off-by: BlueWall --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ff96f4dcf0..d98ff68d39 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -7625,6 +7625,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } } + else + if (transfer.TransferInfo.SourceType == (int)SourceType.SimEstate) + { + //TransferRequestPacket does not include covenant uuid? + //get scene covenant uuid + taskID = m_scene.RegionInfo.RegionSettings.Covenant; + } MakeAssetRequest(transfer, taskID); @@ -11985,6 +11992,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP { requestID = new UUID(transferRequest.TransferInfo.Params, 80); } + else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimEstate) + { + requestID = taskID; + } + // m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID); From b3d152f3ba5cb07c005b0163c752f2c0f97c0034 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 10 Feb 2012 21:26:05 +0000 Subject: [PATCH 20/38] Fix an npc delete race condition with LSL sensors where an initial presence check could succeed but then the npc removed before the subequent npc check. The resulting null would cause an exception. We now check for null before looking at SenseAsAgent. Hopefully fixes http://opensimulator.org/mantis/view.php?id=5872 --- .../Implementation/Plugins/SensorRepeat.cs | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 3e0e452ce0..850f50b13d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs @@ -445,17 +445,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins Vector3 toRegionPos; double dis; - Action senseEntity = new Action(delegate(ScenePresence presence) + Action senseEntity = new Action(presence => { - if ((ts.type & NPC) == 0 - && presence.PresenceType == PresenceType.Npc - && !npcModule.GetNPC(presence.UUID, presence.Scene).SenseAsAgent) - return; + if ((ts.type & NPC) == 0 && presence.PresenceType == PresenceType.Npc) + { + INPC npcData = npcModule.GetNPC(presence.UUID, presence.Scene); + if (npcData == null || !npcData.SenseAsAgent) + return; + } - if ((ts.type & AGENT) == 0 - && (presence.PresenceType == PresenceType.User - || npcModule.GetNPC(presence.UUID, presence.Scene).SenseAsAgent)) - return; + if ((ts.type & AGENT) == 0) + { + if (presence.PresenceType == PresenceType.User) + { + return; + } + else + { + INPC npcData = npcModule.GetNPC(presence.UUID, presence.Scene); + if (npcData != null && npcData.SenseAsAgent) + return; + } + } if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) return; From d80422eba7a4c75f6947ab9186d652b0a31b845e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 10 Feb 2012 23:39:32 +0000 Subject: [PATCH 21/38] Add line numbers to Util.PrintCallStack() --- OpenSim/Framework/Util.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index ed92b2d2f4..4b0b13c3f4 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -1664,13 +1664,14 @@ namespace OpenSim.Framework /// public static void PrintCallStack() { - StackTrace stackTrace = new StackTrace(); // get call stack + StackTrace stackTrace = new StackTrace(true); // get call stack StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) // write call stack method names foreach (StackFrame stackFrame in stackFrames) { - m_log.Debug(stackFrame.GetMethod().DeclaringType + "." + stackFrame.GetMethod().Name); // write method name + MethodBase mb = stackFrame.GetMethod(); + m_log.DebugFormat("{0}.{1}:{2}", mb.DeclaringType, mb.Name, stackFrame.GetFileLineNumber()); // write method name } } From 71e484516a0323187077c734d5b30d2839ebab99 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 10 Feb 2012 23:41:14 +0000 Subject: [PATCH 22/38] minor: Remove warning from RegionInfo due to repeated config.GetString() call where the first was unused. --- OpenSim/Framework/RegionInfo.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index 661b457146..5ba3863529 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -625,7 +625,6 @@ namespace OpenSim.Framework foreach (String s in allKeys) { - string val = config.GetString(s); SetOtherSetting(s, config.GetString(s)); } } From 5023cc86f095d7d3f25213ff63c4e1fcaf6c4e92 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 10 Feb 2012 23:52:06 +0000 Subject: [PATCH 23/38] Change parser to leave embedded quotes alone if the pattern is recognized as an OptionSet long option --- OpenSim/Framework/Console/CommandConsole.cs | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index a0d3541b32..0d6288b5a3 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using System.Threading; using log4net; using OpenSim.Framework; @@ -531,6 +532,11 @@ namespace OpenSim.Framework.Console public class Parser { + // If an unquoted portion ends with an element matching this regex + // and the next element contains a space, then we have stripped + // embedded quotes that should not have been stripped + private static Regex optionRegex = new Regex("^--[a-zA-Z0-9-]+=$"); + public static string[] Parse(string text) { List result = new List(); @@ -544,10 +550,38 @@ namespace OpenSim.Framework.Console if (index % 2 == 0) { string[] words = unquoted[index].Split(new char[] {' '}); + + bool option = false; foreach (string w in words) { if (w != String.Empty) + { + if (optionRegex.Match(w) == Match.Empty) + option = false; + else + option = true; result.Add(w); + } + } + // The last item matched the regex, put the quotes back + if (option) + { + // If the line ended with it, don't do anything + if (index < (unquoted.Length - 1)) + { + // Get and remove the option name + string optionText = result[result.Count - 1]; + result.RemoveAt(result.Count - 1); + + // Add the quoted value back + optionText += "\"" + unquoted[index + 1] + "\""; + + // Push the result into our return array + result.Add(optionText); + + // Skip the already used value + index++; + } } } else From e7fd7322095d518ccd7b446cf5c0683ef8009793 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 11 Feb 2012 00:10:59 +0000 Subject: [PATCH 24/38] Make ScenePresence.MovementFlag a private only settable value to reduce complexity of code analysis --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5c56150003..77f7b32fe3 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -291,13 +291,10 @@ namespace OpenSim.Region.Framework.Scenes /// public PhysicsActor PhysicsActor { get; private set; } - private byte m_movementflag; - - public byte MovementFlag - { - set { m_movementflag = value; } - get { return m_movementflag; } - } + /// + /// Record user movement inputs. + /// + public byte MovementFlag { get; private set; } private bool m_updateflag; From f49897a4195df5fbd00e2c16461bcebb36ce8f72 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 11 Feb 2012 02:26:53 +0000 Subject: [PATCH 25/38] Clamp ODE character velocity. Make ODE falling character 54m/s by default. If velocity reaches 256 in any vector then bad things happen with ODE, so we now clamp this value. In addition, a falling avatar is clamped by default at 54 m/s, which is the same as a falling skydiver. This also appears to be the value used on the linden lab grid. This should resolve http://opensimulator.org/mantis/view.php?id=5882 --- .../Region/Physics/OdePlugin/ODECharacter.cs | 43 ++++++++++++++++++- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 11 +++++ bin/OpenSimDefaults.ini | 5 +++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 7c1c046522..6d1f41da05 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -156,6 +156,22 @@ namespace OpenSim.Region.Physics.OdePlugin internal UUID m_uuid { get; private set; } internal bool bad = false; + /// + /// ODE Avatar. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// Only used right now to return information to LSL. Not actually used to set mass in ODE! + /// + /// + /// public OdeCharacter( String avName, OdeScene parent_scene, Vector3 pos, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, @@ -786,6 +802,10 @@ namespace OpenSim.Region.Physics.OdePlugin Vector3 vec = Vector3.Zero; d.Vector3 vel = d.BodyGetLinearVel(Body); +// m_log.DebugFormat( +// "[ODE CHARACTER]: Current velocity in Move() is <{0},{1},{2}>, target {3} for {4}", +// vel.X, vel.Y, vel.Z, _target_velocity, Name); + float movementdivisor = 1f; if (!m_alwaysRun) @@ -884,18 +904,20 @@ namespace OpenSim.Region.Physics.OdePlugin if (flying) { + // This also acts as anti-gravity so that we hover when flying rather than fall. vec.Z = (_target_velocity.Z - vel.Z) * (PID_D); } } if (flying) { + // Anti-gravity so that we hover when flying rather than fall. vec.Z += ((-1 * _parent_scene.gravityz) * m_mass); //Added for auto fly height. Kitto Flora //d.Vector3 pos = d.BodyGetPosition(Body); float target_altitude = _parent_scene.GetTerrainHeightAtXY(_position.X, _position.Y) + MinimumGroundFlightOffset; - + if (_position.Z < target_altitude) { vec.Z += (target_altitude - _position.Z) * PID_P * 5.0f; @@ -921,6 +943,25 @@ namespace OpenSim.Region.Physics.OdePlugin return; } + + d.Vector3 newVel = d.BodyGetLinearVel(Body); + if (newVel.X >= 256 || newVel.X <= 256 || newVel.Y >= 256 || newVel.Y <= 256 || newVel.Z >= 256 || newVel.Z <= 256) + { +// m_log.DebugFormat( +// "[ODE CHARACTER]: Limiting falling velocity from {0} to {1} for {2}", newVel.Z, -9.8, Name); + + newVel.X = Util.Clamp(newVel.X, -255f, 255f); + newVel.Y = Util.Clamp(newVel.Y, -255f, 255f); + + if (!flying) + newVel.Z + = Util.Clamp( + newVel.Z, -_parent_scene.AvatarTerminalVelocity, _parent_scene.AvatarTerminalVelocity); + else + newVel.Z = Util.Clamp(newVel.Z, -255f, 255f); + + d.BodySetLinearVel(Body, newVel.X, newVel.Y, newVel.Z); + } } /// diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 4530c09464..7d1401c7b8 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -144,6 +144,8 @@ namespace OpenSim.Region.Physics.OdePlugin public float gravityy = 0f; public float gravityz = -9.8f; + public float AvatarTerminalVelocity { get; set; } + private float contactsurfacelayer = 0.001f; private int worldHashspaceLow = -4; @@ -459,6 +461,15 @@ namespace OpenSim.Region.Physics.OdePlugin gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); + float avatarTerminalVelocity = physicsconfig.GetFloat("avatar_terminal_velocity", 9f); + AvatarTerminalVelocity = Util.Clamp(avatarTerminalVelocity, 0, 255f); + if (AvatarTerminalVelocity != avatarTerminalVelocity) + { + m_log.WarnFormat( + "[ODE SCENE]: avatar_terminal_velocity of {0} is invalid. Clamping to {1}", + avatarTerminalVelocity, AvatarTerminalVelocity); + } + worldHashspaceLow = physicsconfig.GetInt("world_hashspace_size_low", -4); worldHashspaceHigh = physicsconfig.GetInt("world_hashspace_size_high", 128); diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 62fe9d4188..3fd3d31b6e 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -655,6 +655,11 @@ world_gravityy = 0 world_gravityz = -9.8 + ; Terminal velocity of a falling avatar + ; This is the same http://en.wikipedia.org/wiki/Terminal_velocity#Examples + ; Max value is 255, min value is 0 + avatar_terminal_velocity = 54 + ; World Step size. (warning these are dangerous. Changing these will probably cause your scene to explode dramatically) ; reference: fps = (0.089/ODE_STEPSIZE) * 1000; world_stepsize = 0.0178 From b92b9228ef5c7833dac019aba12babb5df954d35 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 11 Feb 2012 02:29:07 +0000 Subject: [PATCH 26/38] correct the default avatar_terminal_velocity value that I accidentally left in whilst testing --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 7d1401c7b8..598530c50f 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -461,7 +461,7 @@ namespace OpenSim.Region.Physics.OdePlugin gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); - float avatarTerminalVelocity = physicsconfig.GetFloat("avatar_terminal_velocity", 9f); + float avatarTerminalVelocity = physicsconfig.GetFloat("avatar_terminal_velocity", 54f); AvatarTerminalVelocity = Util.Clamp(avatarTerminalVelocity, 0, 255f); if (AvatarTerminalVelocity != avatarTerminalVelocity) { From 189c67db957cadfe1bb5bd8aad0c86dec1ff295b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 13 Feb 2012 20:43:26 +0000 Subject: [PATCH 27/38] On object deserialization, go back to logging errors at DEBUG level rather than ERROR. Restore extra log message if shape processing fails. Logging level was DEBUG before 312e145 (Fri Feb 3 2012). 312e145 also accidentally removed the 'general error' log message if any shape deserialization failed. This commit restores it, though this has no functional impact. --- .../External/ExternalRepresentationUtils.cs | 19 +++++++++++++------ .../Serialization/SceneObjectSerializer.cs | 14 +++++++++----- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs index a392af66aa..c56f21367f 100644 --- a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs +++ b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs @@ -49,15 +49,16 @@ namespace OpenSim.Framework.Serialization.External /// /// /param> /// - public static void ExecuteReadProcessors( + /// true on successful, false if there were any processing failures + public static bool ExecuteReadProcessors( NodeType nodeToFill, Dictionary> processors, XmlTextReader xtr) { - ExecuteReadProcessors( + return ExecuteReadProcessors( nodeToFill, processors, xtr, (o, name, e) - => m_log.ErrorFormat( + => m_log.DebugFormat( "[ExternalRepresentationUtils]: Exception while parsing element {0}, continuing. Exception {1}{2}", name, e.Message, e.StackTrace)); } @@ -71,12 +72,15 @@ namespace OpenSim.Framework.Serialization.External /// /// Action to take if there is a parsing problem. This will usually just be to log the exception /// - public static void ExecuteReadProcessors( + /// true on successful, false if there were any processing failures + public static bool ExecuteReadProcessors( NodeType nodeToFill, Dictionary> processors, XmlTextReader xtr, Action parseExceptionAction) { + bool errors = false; + string nodeName = string.Empty; while (xtr.NodeType != XmlNodeType.EndElement) { @@ -95,6 +99,7 @@ namespace OpenSim.Framework.Serialization.External } catch (Exception e) { + errors = true; parseExceptionAction(nodeToFill, nodeName, e); if (xtr.NodeType == XmlNodeType.EndElement) @@ -107,6 +112,8 @@ namespace OpenSim.Framework.Serialization.External xtr.ReadOuterXml(); // ignore } } + + return errors; } /// @@ -140,6 +147,7 @@ namespace OpenSim.Framework.Serialization.External UUID.TryParse(node.InnerText, out uuid); creator = userService.GetUserAccount(scopeID, uuid); } + if (node.Name == "CreatorData" && node.InnerText != null && node.InnerText != string.Empty) hasCreatorData = true; @@ -163,7 +171,6 @@ namespace OpenSim.Framework.Serialization.External doc.Save(wr); return wr.ToString(); } - } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index ab02f92c83..0a32214661 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -1470,7 +1470,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization m_SOPXmlProcessors, reader, (o, nodeName, e) - => m_log.ErrorFormat( + => m_log.DebugFormat( "[SceneObjectSerializer]: Exception while parsing {0} in object {1} {2}: {3}{4}", ((SceneObjectPart)o).Name, ((SceneObjectPart)o).UUID, nodeName, e.Message, e.StackTrace)); @@ -1535,14 +1535,18 @@ namespace OpenSim.Region.Framework.Scenes.Serialization reader.ReadStartElement(name, String.Empty); // Shape - ExternalRepresentationUtils.ExecuteReadProcessors( + errors = ExternalRepresentationUtils.ExecuteReadProcessors( shape, m_ShapeXmlProcessors, reader, (o, nodeName, e) - => m_log.ErrorFormat( - "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}", - nodeName, e.Message, e.StackTrace)); + => + { + m_log.DebugFormat( + "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}", + nodeName, e.Message, e.StackTrace); + } + ); reader.ReadEndElement(); // Shape From 04a195266bd68f8c62129246a98aefb3201c90f1 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Mon, 13 Feb 2012 13:21:42 -0800 Subject: [PATCH 28/38] short circuit the expensive parts of the permission checking code if the current user is the owner of an object. none of the later checks can reverse the outcome. --- .../CoreModules/World/Permissions/PermissionsModule.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index cdecd2f471..f3c6a30e64 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -707,7 +707,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions // Object owners should be able to edit their own content if (currentUser == objectOwner) { - permission = true; + // there is no way that later code can change this back to false + // so just return true immediately and short circuit the more + // expensive group checks + return true; + + //permission = true; } else if (group.IsAttachment) { From 48b962c401057cc46bbf4d4768a21d940b306b60 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 14 Feb 2012 00:00:49 +0000 Subject: [PATCH 29/38] Update [XEngine] AppDomainLoading advice in OpenSim.ini.example --- bin/OpenSim.ini.example | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index d45f72bce4..2e620ff0fe 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -573,10 +573,15 @@ ; DeleteScriptsOnStartup = true ;; Set this to true (the default) to load each script into a separate - ;; AppDomain. Setting this to false will load all script assemblies into the - ;; current AppDomain, which will reduce the per-script overhead at the - ;; expense of reduced security and the inability to garbage collect the - ;; script assemblies + ;; AppDomain. + ;; + ;; Setting this to false will load all script assemblies into the + ;; current AppDomain, which will significantly improve script loading times. + ;; It will also reduce initial per-script memory overhead. + ;; + ;; However, setting this to false will also prevent script DLLs from being unloaded from memory if the script is deleted. + ;; This may cause an OutOfMemory problem over time when avatars with scripted attachments move in and out of the region. + ;; Some Windows users have also reported script loading problems when AppDomainLoading = false ; AppDomainLoading = true ;# {DefaultCompileLanguage} {Enabled:true} {Default script language?} {lsl vb cs} lsl From 04986bbb159754cb835ef6f698b2cc9c37f02b4b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 14 Feb 2012 01:50:51 +0000 Subject: [PATCH 30/38] Add some more data to the new user connection logging for debug purposes. --- OpenSim/Region/Framework/Scenes/Scene.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3347822fc4..4c8e2d2e6a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3272,9 +3272,9 @@ namespace OpenSim.Region.Framework.Scenes // Don't disable this log message - it's too helpful m_log.DebugFormat( - "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6}, position {7})", - RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, - agent.AgentID, agent.circuitcode, teleportFlags, agent.startpos); + "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags {8}, position {9})", + RegionInfo.RegionName, (agent.child ? "child" : "root"),agent.firstname, agent.lastname, + agent.AgentID, agent.circuitcode, agent.IPAddress, agent.Viewer, teleportFlags, agent.startpos); if (LoginsDisabled) { From 0b17a66e683f7ffca3877c1601c4179684b62144 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 14 Feb 2012 02:02:11 +0000 Subject: [PATCH 31/38] Add GridStore migration for MSSQL. This is done blind since I don't use MSSQL. If this doesn't work, then one will have to wait for it to be updated for the 0.7.3 opensim release. --- OpenSim/Data/MSSQL/Resources/GridStore.migrations | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenSim/Data/MSSQL/Resources/GridStore.migrations b/OpenSim/Data/MSSQL/Resources/GridStore.migrations index c6342fcdfd..a2e6e03551 100644 --- a/OpenSim/Data/MSSQL/Resources/GridStore.migrations +++ b/OpenSim/Data/MSSQL/Resources/GridStore.migrations @@ -235,4 +235,12 @@ CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions regionName ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +COMMIT + +:VERSION 9 + +BEGIN TRANSACTION + +ALTER TABLE regions ADD COLUMN parcelMapTexture VarChar(36) null + COMMIT \ No newline at end of file From 04544b4510f5405ad9abe30f2d107f5bcd8594d5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 14 Feb 2012 02:03:23 +0000 Subject: [PATCH 32/38] Revert "Add GridStore migration for MSSQL." This reverts commit 0b17a66e683f7ffca3877c1601c4179684b62144. --- OpenSim/Data/MSSQL/Resources/GridStore.migrations | 8 -------- 1 file changed, 8 deletions(-) diff --git a/OpenSim/Data/MSSQL/Resources/GridStore.migrations b/OpenSim/Data/MSSQL/Resources/GridStore.migrations index a2e6e03551..c6342fcdfd 100644 --- a/OpenSim/Data/MSSQL/Resources/GridStore.migrations +++ b/OpenSim/Data/MSSQL/Resources/GridStore.migrations @@ -235,12 +235,4 @@ CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions regionName ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -COMMIT - -:VERSION 9 - -BEGIN TRANSACTION - -ALTER TABLE regions ADD COLUMN parcelMapTexture VarChar(36) null - COMMIT \ No newline at end of file From db90dea9bdb176179675a07d95efb3e5e5f017cb Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Mon, 13 Feb 2012 21:58:33 +0100 Subject: [PATCH 33/38] Fix: MSSQLDB Grid - unable to register region http://opensimulator.org/mantis/view.php?id=5886 --- OpenSim/Data/MSSQL/Resources/GridStore.migrations | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OpenSim/Data/MSSQL/Resources/GridStore.migrations b/OpenSim/Data/MSSQL/Resources/GridStore.migrations index c6342fcdfd..de0cea7ab1 100644 --- a/OpenSim/Data/MSSQL/Resources/GridStore.migrations +++ b/OpenSim/Data/MSSQL/Resources/GridStore.migrations @@ -235,4 +235,11 @@ CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions regionName ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -COMMIT \ No newline at end of file +COMMIT + +:VERSION 9 + +BEGIN TRANSACTION +ALTER TABLE regions ADD parcelMapTexture uniqueidentifier NULL; + +COMMIT From 33e66107be53e7f4e154251b2f881499ab596ca1 Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Mon, 13 Feb 2012 00:58:28 +0100 Subject: [PATCH 34/38] Fix: Lightshare Module(Windlight)-Region settings are not applicable for database sqlite mantis: http://opensimulator.org/mantis/view.php?id=5888 --- .../SQLite/Resources/RegionStore.migrations | 70 ++ OpenSim/Data/SQLite/SQLiteSimulationData.cs | 925 ++++++++++++------ bin/OpenSim.ini.example | 1 - bin/OpenSimDefaults.ini | 1 - 4 files changed, 691 insertions(+), 306 deletions(-) diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations index 31195af06c..0f40cdc04d 100644 --- a/OpenSim/Data/SQLite/Resources/RegionStore.migrations +++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations @@ -472,3 +472,73 @@ COMMIT; BEGIN; ALTER TABLE regionsettings ADD COLUMN covenant_datetime INTEGER NOT NULL default 0; COMMIT; + +:VERSION 23 +BEGIN; +CREATE TABLE regionwindlight ( + region_id VARCHAR(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000' PRIMARY KEY, + water_color_r FLOAT NOT NULL DEFAULT '4.000000', + water_color_g FLOAT NOT NULL DEFAULT '38.000000', + water_color_b FLOAT NOT NULL DEFAULT '64.000000', + water_color_i FLOAT NOT NULL DEFAULT '1.000000', + water_fog_density_exponent FLOAT NOT NULL DEFAULT '4.0', + underwater_fog_modifier FLOAT NOT NULL DEFAULT '0.25', + reflection_wavelet_scale_1 FLOAT NOT NULL DEFAULT '2.0', + reflection_wavelet_scale_2 FLOAT NOT NULL DEFAULT '2.0', + reflection_wavelet_scale_3 FLOAT NOT NULL DEFAULT '2.0', + fresnel_scale FLOAT NOT NULL DEFAULT '0.40', + fresnel_offset FLOAT NOT NULL DEFAULT '0.50', + refract_scale_above FLOAT NOT NULL DEFAULT '0.03', + refract_scale_below FLOAT NOT NULL DEFAULT '0.20', + blur_multiplier FLOAT NOT NULL DEFAULT '0.040', + big_wave_direction_x FLOAT NOT NULL DEFAULT '1.05', + big_wave_direction_y FLOAT NOT NULL DEFAULT '-0.42', + little_wave_direction_x FLOAT NOT NULL DEFAULT '1.11', + little_wave_direction_y FLOAT NOT NULL DEFAULT '-1.16', + normal_map_texture VARCHAR(36) NOT NULL DEFAULT '822ded49-9a6c-f61c-cb89-6df54f42cdf4', + horizon_r FLOAT NOT NULL DEFAULT '0.25', + horizon_g FLOAT NOT NULL DEFAULT '0.25', + horizon_b FLOAT NOT NULL DEFAULT '0.32', + horizon_i FLOAT NOT NULL DEFAULT '0.32', + haze_horizon FLOAT NOT NULL DEFAULT '0.19', + blue_density_r FLOAT NOT NULL DEFAULT '0.12', + blue_density_g FLOAT NOT NULL DEFAULT '0.22', + blue_density_b FLOAT NOT NULL DEFAULT '0.38', + blue_density_i FLOAT NOT NULL DEFAULT '0.38', + haze_density FLOAT NOT NULL DEFAULT '0.70', + density_multiplier FLOAT NOT NULL DEFAULT '0.18', + distance_multiplier FLOAT NOT NULL DEFAULT '0.8', + max_altitude INTEGER NOT NULL DEFAULT '1605', + sun_moon_color_r FLOAT NOT NULL DEFAULT '0.24', + sun_moon_color_g FLOAT NOT NULL DEFAULT '0.26', + sun_moon_color_b FLOAT NOT NULL DEFAULT '0.30', + sun_moon_color_i FLOAT NOT NULL DEFAULT '0.30', + sun_moon_position FLOAT NOT NULL DEFAULT '0.317', + ambient_r FLOAT NOT NULL DEFAULT '0.35', + ambient_g FLOAT NOT NULL DEFAULT '0.35', + ambient_b FLOAT NOT NULL DEFAULT '0.35', + ambient_i FLOAT NOT NULL DEFAULT '0.35', + east_angle FLOAT NOT NULL DEFAULT '0.00', + sun_glow_focus FLOAT NOT NULL DEFAULT '0.10', + sun_glow_size FLOAT NOT NULL DEFAULT '1.75', + scene_gamma FLOAT NOT NULL DEFAULT '1.00', + star_brightness FLOAT NOT NULL DEFAULT '0.00', + cloud_color_r FLOAT NOT NULL DEFAULT '0.41', + cloud_color_g FLOAT NOT NULL DEFAULT '0.41', + cloud_color_b FLOAT NOT NULL DEFAULT '0.41', + cloud_color_i FLOAT NOT NULL DEFAULT '0.41', + cloud_x FLOAT NOT NULL DEFAULT '1.00', + cloud_y FLOAT NOT NULL DEFAULT '0.53', + cloud_density FLOAT NOT NULL DEFAULT '1.00', + cloud_coverage FLOAT NOT NULL DEFAULT '0.27', + cloud_scale FLOAT NOT NULL DEFAULT '0.42', + cloud_detail_x FLOAT NOT NULL DEFAULT '1.00', + cloud_detail_y FLOAT NOT NULL DEFAULT '0.53', + cloud_detail_density FLOAT NOT NULL DEFAULT '0.12', + cloud_scroll_x FLOAT NOT NULL DEFAULT '0.20', + cloud_scroll_x_lock INTEGER NOT NULL DEFAULT '0', + cloud_scroll_y FLOAT NOT NULL DEFAULT '0.01', + cloud_scroll_y_lock INTEGER NOT NULL DEFAULT '0', + draw_classic_clouds INTEGER NOT NULL DEFAULT '1'); + +COMMIT; \ No newline at end of file diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index a313c4f51b..ce1b7b4887 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -35,7 +35,7 @@ using log4net; #if CSharpSqlite using Community.CsharpSqlite.Sqlite; #else - using Mono.Data.Sqlite; +using Mono.Data.Sqlite; #endif using OpenMetaverse; using OpenMetaverse.StructuredData; @@ -60,6 +60,7 @@ namespace OpenSim.Data.SQLite private const string landAccessListSelect = "select distinct * from landaccesslist"; private const string regionbanListSelect = "select * from regionban"; private const string regionSettingsSelect = "select * from regionsettings"; + private const string regionWindlightSelect = "select * from regionwindlight"; private DataSet ds; private SqliteDataAdapter primDa; @@ -69,9 +70,9 @@ namespace OpenSim.Data.SQLite private SqliteDataAdapter landDa; private SqliteDataAdapter landAccessListDa; private SqliteDataAdapter regionSettingsDa; + private SqliteDataAdapter regionWindlightDa; private SqliteConnection m_conn; - private String m_connectionString; protected virtual Assembly Assembly @@ -136,6 +137,9 @@ namespace OpenSim.Data.SQLite SqliteCommand regionSettingsSelectCmd = new SqliteCommand(regionSettingsSelect, m_conn); regionSettingsDa = new SqliteDataAdapter(regionSettingsSelectCmd); + + SqliteCommand regionWindlightSelectCmd = new SqliteCommand(regionWindlightSelect, m_conn); + regionWindlightDa = new SqliteDataAdapter(regionWindlightSelectCmd); // This actually does the roll forward assembly stuff Migration m = new Migration(m_conn, Assembly, "RegionStore"); m.Update(); @@ -163,6 +167,9 @@ namespace OpenSim.Data.SQLite ds.Tables.Add(createRegionSettingsTable()); setupRegionSettingsCommands(regionSettingsDa, m_conn); + ds.Tables.Add(createRegionWindlightTable()); + setupRegionWindlightCommands(regionWindlightDa, m_conn); + // WORKAROUND: This is a work around for sqlite on // windows, which gets really unhappy with blob columns // that have no sample data in them. At some point we @@ -171,63 +178,72 @@ namespace OpenSim.Data.SQLite { primDa.Fill(ds.Tables["prims"]); } - catch (Exception) + catch (Exception e) { - m_log.Info("[SQLITE REGION DB]: Caught fill error on prims table"); + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on prims table :{0}", e.Message); } try { shapeDa.Fill(ds.Tables["primshapes"]); } - catch (Exception) + catch (Exception e) { - m_log.Info("[SQLITE REGION DB]: Caught fill error on primshapes table"); + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on primshapes table :{0}", e.Message); } try { itemsDa.Fill(ds.Tables["primitems"]); } - catch (Exception) + catch (Exception e) { - m_log.Info("[SQLITE REGION DB]: Caught fill error on primitems table"); + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on primitems table :{0}", e.Message); } try { terrainDa.Fill(ds.Tables["terrain"]); } - catch (Exception) + catch (Exception e) { - m_log.Info("[SQLITE REGION DB]: Caught fill error on terrain table"); + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on terrain table :{0}", e.Message); } try { landDa.Fill(ds.Tables["land"]); } - catch (Exception) + catch (Exception e) { - m_log.Info("[SQLITE REGION DB]: Caught fill error on land table"); + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on land table :{0}", e.Message); } try { landAccessListDa.Fill(ds.Tables["landaccesslist"]); } - catch (Exception) + catch (Exception e) { - m_log.Info("[SQLITE REGION DB]: Caught fill error on landaccesslist table"); + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on landaccesslist table :{0}", e.Message); } try { regionSettingsDa.Fill(ds.Tables["regionsettings"]); } - catch (Exception) + catch (Exception e) { - m_log.Info("[SQLITE REGION DB]: Caught fill error on regionsettings table"); + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on regionsettings table :{0}", e.Message); + } + + try + { + regionWindlightDa.Fill(ds.Tables["regionwindlight"]); + } + catch (Exception e) + { + m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on regionwindlight table :{0}", e.Message); } // We have to create a data set mapping for every table, otherwise the IDataAdaptor.Update() will not populate rows with values! @@ -240,14 +256,14 @@ namespace OpenSim.Data.SQLite CreateDataSetMapping(landDa, "land"); CreateDataSetMapping(landAccessListDa, "landaccesslist"); CreateDataSetMapping(regionSettingsDa, "regionsettings"); + CreateDataSetMapping(regionWindlightDa, "regionwindlight"); } } catch (Exception e) { - m_log.Error(e); - Environment.Exit(23); + m_log.ErrorFormat("[SQLITE REGION DB]: ", e); + Environment.Exit(23); } - return; } @@ -298,6 +314,11 @@ namespace OpenSim.Data.SQLite regionSettingsDa.Dispose(); regionSettingsDa = null; } + if (regionWindlightDa != null) + { + regionWindlightDa.Dispose(); + regionWindlightDa = null; + } } public void StoreRegionSettings(RegionSettings rs) @@ -321,19 +342,76 @@ namespace OpenSim.Data.SQLite Commit(); } } + + /// + /// Load windlight settings from region storage + /// + /// RegionID public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID) { - //This connector doesn't support the windlight module yet - //Return default LL windlight settings - return new RegionLightShareData(); + RegionLightShareData wl = null; + + lock (ds) + { + DataTable windlightTable = ds.Tables["regionwindlight"]; + DataRow windlightRow = windlightTable.Rows.Find(regionUUID.ToString()); + if (windlightRow == null) + { + wl = new RegionLightShareData(); + wl.regionID = regionUUID; + StoreRegionWindlightSettings(wl); + return wl; + } + wl = buildRegionWindlight(windlightRow); + return wl; + } } + + /// + /// Remove windlight settings from region storage + /// + /// RegionID public void RemoveRegionWindlightSettings(UUID regionID) { + lock (ds) + { + DataTable windlightTable = ds.Tables["regionwindlight"]; + DataRow windlightRow = windlightTable.Rows.Find(regionID.ToString()); + + if (windlightRow != null) + { + windlightRow.Delete(); + } + } + Commit(); } + + /// + /// Adds an windlight into region storage + /// + /// RegionLightShareData public void StoreRegionWindlightSettings(RegionLightShareData wl) { - //This connector doesn't support the windlight module yet + lock (ds) + { + DataTable windlightTable = ds.Tables["regionwindlight"]; + DataRow windlightRow = windlightTable.Rows.Find(wl.regionID.ToString()); + + if (windlightRow == null) + { + windlightRow = windlightTable.NewRow(); + fillRegionWindlightRow(windlightRow, wl); + windlightTable.Rows.Add(windlightRow); + } + else + { + fillRegionWindlightRow(windlightRow, wl); + } + + Commit(); + } } + public RegionSettings LoadRegionSettings(UUID regionUUID) { lock (ds) @@ -387,7 +465,7 @@ namespace OpenSim.Data.SQLite } Commit(); - // m_log.Info("[Dump of prims]: " + ds.GetXml()); +// m_log.Info("[Dump of prims]: " + ds.GetXml()); } /// @@ -397,7 +475,7 @@ namespace OpenSim.Data.SQLite /// the region UUID public void RemoveObject(UUID obj, UUID regionUUID) { - // m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID); +// m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID); DataTable prims = ds.Tables["prims"]; DataTable shapes = ds.Tables["primshapes"]; @@ -409,7 +487,7 @@ namespace OpenSim.Data.SQLite foreach (DataRow row in primRows) { // Remove shape rows - UUID uuid = new UUID((string) row["UUID"]); + UUID uuid = new UUID((string)row["UUID"]); DataRow shapeRow = shapes.Rows.Find(uuid.ToString()); if (shapeRow != null) { @@ -464,7 +542,7 @@ namespace OpenSim.Data.SQLite { DataRow[] primsForRegion = prims.Select(byRegion); // m_log.Info("[SQLITE REGION DB]: Loaded " + primsForRegion.Length + " prims for region: " + regionUUID); - + // First, create all groups foreach (DataRow primRow in primsForRegion) { @@ -472,9 +550,9 @@ namespace OpenSim.Data.SQLite { SceneObjectPart prim = null; - string uuid = (string) primRow["UUID"]; - string objID = (string) primRow["SceneGroupID"]; - + string uuid = (string)primRow["UUID"]; + string objID = (string)primRow["SceneGroupID"]; + if (uuid == objID) //is new SceneObjectGroup ? { prim = buildPrim(primRow); @@ -489,7 +567,7 @@ namespace OpenSim.Data.SQLite "[SQLITE REGION DB]: No shape found for prim in storage, so setting default box shape"); prim.Shape = PrimitiveBaseShape.Default; } - + SceneObjectGroup group = new SceneObjectGroup(prim); createdObjects.Add(group.UUID, group); retvals.Add(group); @@ -506,7 +584,7 @@ namespace OpenSim.Data.SQLite } } } - + // Now fill the groups with part data foreach (DataRow primRow in primsForRegion) { @@ -514,8 +592,8 @@ namespace OpenSim.Data.SQLite { SceneObjectPart prim = null; - string uuid = (string) primRow["UUID"]; - string objID = (string) primRow["SceneGroupID"]; + string uuid = (string)primRow["UUID"]; + string objID = (string)primRow["SceneGroupID"]; if (uuid != objID) //is new SceneObjectGroup ? { prim = buildPrim(primRow); @@ -562,8 +640,7 @@ namespace OpenSim.Data.SQLite DataRow[] dbItemRows = dbItems.Select(sql); IList inventory = new List(); -// m_log.DebugFormat( -// "[SQLITE REGION DB]: Found {0} items for {1} {2}", dbItemRows.Length, prim.Name, prim.UUID); +// m_log.DebugFormat("[SQLITE REGION DB]: Found {0} items for {1} {2}", dbItemRows.Length, prim.Name, prim.UUID); foreach (DataRow row in dbItemRows) { @@ -742,7 +819,7 @@ namespace OpenSim.Data.SQLite // cmd.Parameters.Add(new SqliteParameter(":LandUUID", parcel.LandData.GlobalID.ToString())); // cmd.ExecuteNonQuery(); -// } + // } // This is the slower.. but more appropriate thing to do @@ -805,7 +882,7 @@ namespace OpenSim.Data.SQLite /// public void Commit() { - //m_log.Debug("[SQLITE]: Starting commit"); +// m_log.Debug("[SQLITE]: Starting commit"); lock (ds) { primDa.Update(ds, "prims"); @@ -819,6 +896,7 @@ namespace OpenSim.Data.SQLite try { regionSettingsDa.Update(ds, "regionsettings"); + regionWindlightDa.Update(ds, "regionwindlight"); } catch (SqliteException SqlEx) { @@ -875,9 +953,9 @@ namespace OpenSim.Data.SQLite { DataTable terrain = new DataTable("terrain"); - createCol(terrain, "RegionUUID", typeof (String)); - createCol(terrain, "Revision", typeof (Int32)); - createCol(terrain, "Heightfield", typeof (Byte[])); + createCol(terrain, "RegionUUID", typeof(String)); + createCol(terrain, "Revision", typeof(Int32)); + createCol(terrain, "Heightfield", typeof(Byte[])); return terrain; } @@ -890,62 +968,62 @@ namespace OpenSim.Data.SQLite { DataTable prims = new DataTable("prims"); - createCol(prims, "UUID", typeof (String)); - createCol(prims, "RegionUUID", typeof (String)); - createCol(prims, "CreationDate", typeof (Int32)); - createCol(prims, "Name", typeof (String)); - createCol(prims, "SceneGroupID", typeof (String)); + createCol(prims, "UUID", typeof(String)); + createCol(prims, "RegionUUID", typeof(String)); + createCol(prims, "CreationDate", typeof(Int32)); + createCol(prims, "Name", typeof(String)); + createCol(prims, "SceneGroupID", typeof(String)); // various text fields - createCol(prims, "Text", typeof (String)); - createCol(prims, "ColorR", typeof (Int32)); - createCol(prims, "ColorG", typeof (Int32)); - createCol(prims, "ColorB", typeof (Int32)); - createCol(prims, "ColorA", typeof (Int32)); - createCol(prims, "Description", typeof (String)); - createCol(prims, "SitName", typeof (String)); - createCol(prims, "TouchName", typeof (String)); + createCol(prims, "Text", typeof(String)); + createCol(prims, "ColorR", typeof(Int32)); + createCol(prims, "ColorG", typeof(Int32)); + createCol(prims, "ColorB", typeof(Int32)); + createCol(prims, "ColorA", typeof(Int32)); + createCol(prims, "Description", typeof(String)); + createCol(prims, "SitName", typeof(String)); + createCol(prims, "TouchName", typeof(String)); // permissions - createCol(prims, "ObjectFlags", typeof (Int32)); - createCol(prims, "CreatorID", typeof (String)); - createCol(prims, "OwnerID", typeof (String)); - createCol(prims, "GroupID", typeof (String)); - createCol(prims, "LastOwnerID", typeof (String)); - createCol(prims, "OwnerMask", typeof (Int32)); - createCol(prims, "NextOwnerMask", typeof (Int32)); - createCol(prims, "GroupMask", typeof (Int32)); - createCol(prims, "EveryoneMask", typeof (Int32)); - createCol(prims, "BaseMask", typeof (Int32)); + createCol(prims, "ObjectFlags", typeof(Int32)); + createCol(prims, "CreatorID", typeof(String)); + createCol(prims, "OwnerID", typeof(String)); + createCol(prims, "GroupID", typeof(String)); + createCol(prims, "LastOwnerID", typeof(String)); + createCol(prims, "OwnerMask", typeof(Int32)); + createCol(prims, "NextOwnerMask", typeof(Int32)); + createCol(prims, "GroupMask", typeof(Int32)); + createCol(prims, "EveryoneMask", typeof(Int32)); + createCol(prims, "BaseMask", typeof(Int32)); // vectors - createCol(prims, "PositionX", typeof (Double)); - createCol(prims, "PositionY", typeof (Double)); - createCol(prims, "PositionZ", typeof (Double)); - createCol(prims, "GroupPositionX", typeof (Double)); - createCol(prims, "GroupPositionY", typeof (Double)); - createCol(prims, "GroupPositionZ", typeof (Double)); - createCol(prims, "VelocityX", typeof (Double)); - createCol(prims, "VelocityY", typeof (Double)); - createCol(prims, "VelocityZ", typeof (Double)); - createCol(prims, "AngularVelocityX", typeof (Double)); - createCol(prims, "AngularVelocityY", typeof (Double)); - createCol(prims, "AngularVelocityZ", typeof (Double)); - createCol(prims, "AccelerationX", typeof (Double)); - createCol(prims, "AccelerationY", typeof (Double)); - createCol(prims, "AccelerationZ", typeof (Double)); + createCol(prims, "PositionX", typeof(Double)); + createCol(prims, "PositionY", typeof(Double)); + createCol(prims, "PositionZ", typeof(Double)); + createCol(prims, "GroupPositionX", typeof(Double)); + createCol(prims, "GroupPositionY", typeof(Double)); + createCol(prims, "GroupPositionZ", typeof(Double)); + createCol(prims, "VelocityX", typeof(Double)); + createCol(prims, "VelocityY", typeof(Double)); + createCol(prims, "VelocityZ", typeof(Double)); + createCol(prims, "AngularVelocityX", typeof(Double)); + createCol(prims, "AngularVelocityY", typeof(Double)); + createCol(prims, "AngularVelocityZ", typeof(Double)); + createCol(prims, "AccelerationX", typeof(Double)); + createCol(prims, "AccelerationY", typeof(Double)); + createCol(prims, "AccelerationZ", typeof(Double)); // quaternions - createCol(prims, "RotationX", typeof (Double)); - createCol(prims, "RotationY", typeof (Double)); - createCol(prims, "RotationZ", typeof (Double)); - createCol(prims, "RotationW", typeof (Double)); + createCol(prims, "RotationX", typeof(Double)); + createCol(prims, "RotationY", typeof(Double)); + createCol(prims, "RotationZ", typeof(Double)); + createCol(prims, "RotationW", typeof(Double)); // sit target - createCol(prims, "SitTargetOffsetX", typeof (Double)); - createCol(prims, "SitTargetOffsetY", typeof (Double)); - createCol(prims, "SitTargetOffsetZ", typeof (Double)); + createCol(prims, "SitTargetOffsetX", typeof(Double)); + createCol(prims, "SitTargetOffsetY", typeof(Double)); + createCol(prims, "SitTargetOffsetZ", typeof(Double)); - createCol(prims, "SitTargetOrientW", typeof (Double)); - createCol(prims, "SitTargetOrientX", typeof (Double)); - createCol(prims, "SitTargetOrientY", typeof (Double)); - createCol(prims, "SitTargetOrientZ", typeof (Double)); + createCol(prims, "SitTargetOrientW", typeof(Double)); + createCol(prims, "SitTargetOrientX", typeof(Double)); + createCol(prims, "SitTargetOrientY", typeof(Double)); + createCol(prims, "SitTargetOrientZ", typeof(Double)); createCol(prims, "PayPrice", typeof(Int32)); createCol(prims, "PayButton1", typeof(Int32)); @@ -981,7 +1059,7 @@ namespace OpenSim.Data.SQLite createCol(prims, "SaleType", typeof(Int16)); // click action - createCol(prims, "ClickAction", typeof (Byte)); + createCol(prims, "ClickAction", typeof(Byte)); createCol(prims, "Material", typeof(Byte)); @@ -993,7 +1071,7 @@ namespace OpenSim.Data.SQLite createCol(prims, "MediaURL", typeof(String)); // Add in contraints - prims.PrimaryKey = new DataColumn[] {prims.Columns["UUID"]}; + prims.PrimaryKey = new DataColumn[] { prims.Columns["UUID"] }; return prims; } @@ -1005,42 +1083,42 @@ namespace OpenSim.Data.SQLite private static DataTable createShapeTable() { DataTable shapes = new DataTable("primshapes"); - createCol(shapes, "UUID", typeof (String)); + createCol(shapes, "UUID", typeof(String)); // shape is an enum - createCol(shapes, "Shape", typeof (Int32)); + createCol(shapes, "Shape", typeof(Int32)); // vectors - createCol(shapes, "ScaleX", typeof (Double)); - createCol(shapes, "ScaleY", typeof (Double)); - createCol(shapes, "ScaleZ", typeof (Double)); + createCol(shapes, "ScaleX", typeof(Double)); + createCol(shapes, "ScaleY", typeof(Double)); + createCol(shapes, "ScaleZ", typeof(Double)); // paths - createCol(shapes, "PCode", typeof (Int32)); - createCol(shapes, "PathBegin", typeof (Int32)); - createCol(shapes, "PathEnd", typeof (Int32)); - createCol(shapes, "PathScaleX", typeof (Int32)); - createCol(shapes, "PathScaleY", typeof (Int32)); - createCol(shapes, "PathShearX", typeof (Int32)); - createCol(shapes, "PathShearY", typeof (Int32)); - createCol(shapes, "PathSkew", typeof (Int32)); - createCol(shapes, "PathCurve", typeof (Int32)); - createCol(shapes, "PathRadiusOffset", typeof (Int32)); - createCol(shapes, "PathRevolutions", typeof (Int32)); - createCol(shapes, "PathTaperX", typeof (Int32)); - createCol(shapes, "PathTaperY", typeof (Int32)); - createCol(shapes, "PathTwist", typeof (Int32)); - createCol(shapes, "PathTwistBegin", typeof (Int32)); + createCol(shapes, "PCode", typeof(Int32)); + createCol(shapes, "PathBegin", typeof(Int32)); + createCol(shapes, "PathEnd", typeof(Int32)); + createCol(shapes, "PathScaleX", typeof(Int32)); + createCol(shapes, "PathScaleY", typeof(Int32)); + createCol(shapes, "PathShearX", typeof(Int32)); + createCol(shapes, "PathShearY", typeof(Int32)); + createCol(shapes, "PathSkew", typeof(Int32)); + createCol(shapes, "PathCurve", typeof(Int32)); + createCol(shapes, "PathRadiusOffset", typeof(Int32)); + createCol(shapes, "PathRevolutions", typeof(Int32)); + createCol(shapes, "PathTaperX", typeof(Int32)); + createCol(shapes, "PathTaperY", typeof(Int32)); + createCol(shapes, "PathTwist", typeof(Int32)); + createCol(shapes, "PathTwistBegin", typeof(Int32)); // profile - createCol(shapes, "ProfileBegin", typeof (Int32)); - createCol(shapes, "ProfileEnd", typeof (Int32)); - createCol(shapes, "ProfileCurve", typeof (Int32)); - createCol(shapes, "ProfileHollow", typeof (Int32)); + createCol(shapes, "ProfileBegin", typeof(Int32)); + createCol(shapes, "ProfileEnd", typeof(Int32)); + createCol(shapes, "ProfileCurve", typeof(Int32)); + createCol(shapes, "ProfileHollow", typeof(Int32)); createCol(shapes, "State", typeof(Int32)); // text TODO: this isn't right, but I'm not sure the right // way to specify this as a blob atm - createCol(shapes, "Texture", typeof (Byte[])); - createCol(shapes, "ExtraParams", typeof (Byte[])); + createCol(shapes, "Texture", typeof(Byte[])); + createCol(shapes, "ExtraParams", typeof(Byte[])); createCol(shapes, "Media", typeof(String)); - shapes.PrimaryKey = new DataColumn[] {shapes.Columns["UUID"]}; + shapes.PrimaryKey = new DataColumn[] { shapes.Columns["UUID"] }; return shapes; } @@ -1053,29 +1131,29 @@ namespace OpenSim.Data.SQLite { DataTable items = new DataTable("primitems"); - createCol(items, "itemID", typeof (String)); - createCol(items, "primID", typeof (String)); - createCol(items, "assetID", typeof (String)); - createCol(items, "parentFolderID", typeof (String)); + createCol(items, "itemID", typeof(String)); + createCol(items, "primID", typeof(String)); + createCol(items, "assetID", typeof(String)); + createCol(items, "parentFolderID", typeof(String)); - createCol(items, "invType", typeof (Int32)); - createCol(items, "assetType", typeof (Int32)); + createCol(items, "invType", typeof(Int32)); + createCol(items, "assetType", typeof(Int32)); - createCol(items, "name", typeof (String)); - createCol(items, "description", typeof (String)); + createCol(items, "name", typeof(String)); + createCol(items, "description", typeof(String)); - createCol(items, "creationDate", typeof (Int64)); - createCol(items, "creatorID", typeof (String)); - createCol(items, "ownerID", typeof (String)); - createCol(items, "lastOwnerID", typeof (String)); - createCol(items, "groupID", typeof (String)); + createCol(items, "creationDate", typeof(Int64)); + createCol(items, "creatorID", typeof(String)); + createCol(items, "ownerID", typeof(String)); + createCol(items, "lastOwnerID", typeof(String)); + createCol(items, "groupID", typeof(String)); - createCol(items, "nextPermissions", typeof (UInt32)); - createCol(items, "currentPermissions", typeof (UInt32)); - createCol(items, "basePermissions", typeof (UInt32)); - createCol(items, "everyonePermissions", typeof (UInt32)); - createCol(items, "groupPermissions", typeof (UInt32)); - createCol(items, "flags", typeof (UInt32)); + createCol(items, "nextPermissions", typeof(UInt32)); + createCol(items, "currentPermissions", typeof(UInt32)); + createCol(items, "basePermissions", typeof(UInt32)); + createCol(items, "everyonePermissions", typeof(UInt32)); + createCol(items, "groupPermissions", typeof(UInt32)); + createCol(items, "flags", typeof(UInt32)); items.PrimaryKey = new DataColumn[] { items.Columns["itemID"] }; @@ -1089,44 +1167,44 @@ namespace OpenSim.Data.SQLite private static DataTable createLandTable() { DataTable land = new DataTable("land"); - createCol(land, "UUID", typeof (String)); - createCol(land, "RegionUUID", typeof (String)); - createCol(land, "LocalLandID", typeof (UInt32)); + createCol(land, "UUID", typeof(String)); + createCol(land, "RegionUUID", typeof(String)); + createCol(land, "LocalLandID", typeof(UInt32)); // Bitmap is a byte[512] - createCol(land, "Bitmap", typeof (Byte[])); + createCol(land, "Bitmap", typeof(Byte[])); - createCol(land, "Name", typeof (String)); - createCol(land, "Desc", typeof (String)); - createCol(land, "OwnerUUID", typeof (String)); - createCol(land, "IsGroupOwned", typeof (Boolean)); - createCol(land, "Area", typeof (Int32)); - createCol(land, "AuctionID", typeof (Int32)); //Unemplemented - createCol(land, "Category", typeof (Int32)); //Enum OpenMetaverse.Parcel.ParcelCategory - createCol(land, "ClaimDate", typeof (Int32)); - createCol(land, "ClaimPrice", typeof (Int32)); - createCol(land, "GroupUUID", typeof (string)); - createCol(land, "SalePrice", typeof (Int32)); - createCol(land, "LandStatus", typeof (Int32)); //Enum. OpenMetaverse.Parcel.ParcelStatus - createCol(land, "LandFlags", typeof (UInt32)); - createCol(land, "LandingType", typeof (Byte)); - createCol(land, "MediaAutoScale", typeof (Byte)); - createCol(land, "MediaTextureUUID", typeof (String)); - createCol(land, "MediaURL", typeof (String)); - createCol(land, "MusicURL", typeof (String)); - createCol(land, "PassHours", typeof (Double)); - createCol(land, "PassPrice", typeof (UInt32)); - createCol(land, "SnapshotUUID", typeof (String)); - createCol(land, "UserLocationX", typeof (Double)); - createCol(land, "UserLocationY", typeof (Double)); - createCol(land, "UserLocationZ", typeof (Double)); - createCol(land, "UserLookAtX", typeof (Double)); - createCol(land, "UserLookAtY", typeof (Double)); - createCol(land, "UserLookAtZ", typeof (Double)); + createCol(land, "Name", typeof(String)); + createCol(land, "Desc", typeof(String)); + createCol(land, "OwnerUUID", typeof(String)); + createCol(land, "IsGroupOwned", typeof(Boolean)); + createCol(land, "Area", typeof(Int32)); + createCol(land, "AuctionID", typeof(Int32)); //Unemplemented + createCol(land, "Category", typeof(Int32)); //Enum OpenMetaverse.Parcel.ParcelCategory + createCol(land, "ClaimDate", typeof(Int32)); + createCol(land, "ClaimPrice", typeof(Int32)); + createCol(land, "GroupUUID", typeof(string)); + createCol(land, "SalePrice", typeof(Int32)); + createCol(land, "LandStatus", typeof(Int32)); //Enum. OpenMetaverse.Parcel.ParcelStatus + createCol(land, "LandFlags", typeof(UInt32)); + createCol(land, "LandingType", typeof(Byte)); + createCol(land, "MediaAutoScale", typeof(Byte)); + createCol(land, "MediaTextureUUID", typeof(String)); + createCol(land, "MediaURL", typeof(String)); + createCol(land, "MusicURL", typeof(String)); + createCol(land, "PassHours", typeof(Double)); + createCol(land, "PassPrice", typeof(UInt32)); + createCol(land, "SnapshotUUID", typeof(String)); + createCol(land, "UserLocationX", typeof(Double)); + createCol(land, "UserLocationY", typeof(Double)); + createCol(land, "UserLocationZ", typeof(Double)); + createCol(land, "UserLookAtX", typeof(Double)); + createCol(land, "UserLookAtY", typeof(Double)); + createCol(land, "UserLookAtZ", typeof(Double)); createCol(land, "AuthbuyerID", typeof(String)); createCol(land, "OtherCleanTime", typeof(Int32)); - land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]}; + land.PrimaryKey = new DataColumn[] { land.Columns["UUID"] }; return land; } @@ -1138,9 +1216,9 @@ namespace OpenSim.Data.SQLite private static DataTable createLandAccessListTable() { DataTable landaccess = new DataTable("landaccesslist"); - createCol(landaccess, "LandUUID", typeof (String)); - createCol(landaccess, "AccessUUID", typeof (String)); - createCol(landaccess, "Flags", typeof (UInt32)); + createCol(landaccess, "LandUUID", typeof(String)); + createCol(landaccess, "AccessUUID", typeof(String)); + createCol(landaccess, "Flags", typeof(UInt32)); return landaccess; } @@ -1149,41 +1227,41 @@ namespace OpenSim.Data.SQLite { DataTable regionsettings = new DataTable("regionsettings"); createCol(regionsettings, "regionUUID", typeof(String)); - createCol(regionsettings, "block_terraform", typeof (Int32)); - createCol(regionsettings, "block_fly", typeof (Int32)); - createCol(regionsettings, "allow_damage", typeof (Int32)); - createCol(regionsettings, "restrict_pushing", typeof (Int32)); - createCol(regionsettings, "allow_land_resell", typeof (Int32)); - createCol(regionsettings, "allow_land_join_divide", typeof (Int32)); - createCol(regionsettings, "block_show_in_search", typeof (Int32)); - createCol(regionsettings, "agent_limit", typeof (Int32)); - createCol(regionsettings, "object_bonus", typeof (Double)); - createCol(regionsettings, "maturity", typeof (Int32)); - createCol(regionsettings, "disable_scripts", typeof (Int32)); - createCol(regionsettings, "disable_collisions", typeof (Int32)); - createCol(regionsettings, "disable_physics", typeof (Int32)); + createCol(regionsettings, "block_terraform", typeof(Int32)); + createCol(regionsettings, "block_fly", typeof(Int32)); + createCol(regionsettings, "allow_damage", typeof(Int32)); + createCol(regionsettings, "restrict_pushing", typeof(Int32)); + createCol(regionsettings, "allow_land_resell", typeof(Int32)); + createCol(regionsettings, "allow_land_join_divide", typeof(Int32)); + createCol(regionsettings, "block_show_in_search", typeof(Int32)); + createCol(regionsettings, "agent_limit", typeof(Int32)); + createCol(regionsettings, "object_bonus", typeof(Double)); + createCol(regionsettings, "maturity", typeof(Int32)); + createCol(regionsettings, "disable_scripts", typeof(Int32)); + createCol(regionsettings, "disable_collisions", typeof(Int32)); + createCol(regionsettings, "disable_physics", typeof(Int32)); createCol(regionsettings, "terrain_texture_1", typeof(String)); createCol(regionsettings, "terrain_texture_2", typeof(String)); createCol(regionsettings, "terrain_texture_3", typeof(String)); createCol(regionsettings, "terrain_texture_4", typeof(String)); - createCol(regionsettings, "elevation_1_nw", typeof (Double)); - createCol(regionsettings, "elevation_2_nw", typeof (Double)); - createCol(regionsettings, "elevation_1_ne", typeof (Double)); - createCol(regionsettings, "elevation_2_ne", typeof (Double)); - createCol(regionsettings, "elevation_1_se", typeof (Double)); - createCol(regionsettings, "elevation_2_se", typeof (Double)); - createCol(regionsettings, "elevation_1_sw", typeof (Double)); - createCol(regionsettings, "elevation_2_sw", typeof (Double)); - createCol(regionsettings, "water_height", typeof (Double)); - createCol(regionsettings, "terrain_raise_limit", typeof (Double)); - createCol(regionsettings, "terrain_lower_limit", typeof (Double)); - createCol(regionsettings, "use_estate_sun", typeof (Int32)); - createCol(regionsettings, "sandbox", typeof (Int32)); - createCol(regionsettings, "sunvectorx",typeof (Double)); - createCol(regionsettings, "sunvectory",typeof (Double)); - createCol(regionsettings, "sunvectorz",typeof (Double)); - createCol(regionsettings, "fixed_sun", typeof (Int32)); - createCol(regionsettings, "sun_position", typeof (Double)); + createCol(regionsettings, "elevation_1_nw", typeof(Double)); + createCol(regionsettings, "elevation_2_nw", typeof(Double)); + createCol(regionsettings, "elevation_1_ne", typeof(Double)); + createCol(regionsettings, "elevation_2_ne", typeof(Double)); + createCol(regionsettings, "elevation_1_se", typeof(Double)); + createCol(regionsettings, "elevation_2_se", typeof(Double)); + createCol(regionsettings, "elevation_1_sw", typeof(Double)); + createCol(regionsettings, "elevation_2_sw", typeof(Double)); + createCol(regionsettings, "water_height", typeof(Double)); + createCol(regionsettings, "terrain_raise_limit", typeof(Double)); + createCol(regionsettings, "terrain_lower_limit", typeof(Double)); + createCol(regionsettings, "use_estate_sun", typeof(Int32)); + createCol(regionsettings, "sandbox", typeof(Int32)); + createCol(regionsettings, "sunvectorx", typeof(Double)); + createCol(regionsettings, "sunvectory", typeof(Double)); + createCol(regionsettings, "sunvectorz", typeof(Double)); + createCol(regionsettings, "fixed_sun", typeof(Int32)); + createCol(regionsettings, "sun_position", typeof(Double)); createCol(regionsettings, "covenant", typeof(String)); createCol(regionsettings, "covenant_datetime", typeof(Int32)); createCol(regionsettings, "map_tile_ID", typeof(String)); @@ -1191,6 +1269,82 @@ namespace OpenSim.Data.SQLite return regionsettings; } + /// + /// create "regionwindlight" table + /// + /// RegionWindlight DataTable + private static DataTable createRegionWindlightTable() + { + DataTable regionwindlight = new DataTable("regionwindlight"); + createCol(regionwindlight, "region_id", typeof(String)); + createCol(regionwindlight, "water_color_r", typeof(Double)); + createCol(regionwindlight, "water_color_g", typeof(Double)); + createCol(regionwindlight, "water_color_b", typeof(Double)); + createCol(regionwindlight, "water_color_i", typeof(Double)); + createCol(regionwindlight, "water_fog_density_exponent", typeof(Double)); + createCol(regionwindlight, "underwater_fog_modifier", typeof(Double)); + createCol(regionwindlight, "reflection_wavelet_scale_1", typeof(Double)); + createCol(regionwindlight, "reflection_wavelet_scale_2", typeof(Double)); + createCol(regionwindlight, "reflection_wavelet_scale_3", typeof(Double)); + createCol(regionwindlight, "fresnel_scale", typeof(Double)); + createCol(regionwindlight, "fresnel_offset", typeof(Double)); + createCol(regionwindlight, "refract_scale_above", typeof(Double)); + createCol(regionwindlight, "refract_scale_below", typeof(Double)); + createCol(regionwindlight, "blur_multiplier", typeof(Double)); + createCol(regionwindlight, "big_wave_direction_x", typeof(Double)); + createCol(regionwindlight, "big_wave_direction_y", typeof(Double)); + createCol(regionwindlight, "little_wave_direction_x", typeof(Double)); + createCol(regionwindlight, "little_wave_direction_y", typeof(Double)); + createCol(regionwindlight, "normal_map_texture", typeof(String)); + createCol(regionwindlight, "horizon_r", typeof(Double)); + createCol(regionwindlight, "horizon_g", typeof(Double)); + createCol(regionwindlight, "horizon_b", typeof(Double)); + createCol(regionwindlight, "horizon_i", typeof(Double)); + createCol(regionwindlight, "haze_horizon", typeof(Double)); + createCol(regionwindlight, "blue_density_r", typeof(Double)); + createCol(regionwindlight, "blue_density_g", typeof(Double)); + createCol(regionwindlight, "blue_density_b", typeof(Double)); + createCol(regionwindlight, "blue_density_i", typeof(Double)); + createCol(regionwindlight, "haze_density", typeof(Double)); + createCol(regionwindlight, "density_multiplier", typeof(Double)); + createCol(regionwindlight, "distance_multiplier", typeof(Double)); + createCol(regionwindlight, "max_altitude", typeof(Int32)); + createCol(regionwindlight, "sun_moon_color_r", typeof(Double)); + createCol(regionwindlight, "sun_moon_color_g", typeof(Double)); + createCol(regionwindlight, "sun_moon_color_b", typeof(Double)); + createCol(regionwindlight, "sun_moon_color_i", typeof(Double)); + createCol(regionwindlight, "sun_moon_position", typeof(Double)); + createCol(regionwindlight, "ambient_r", typeof(Double)); + createCol(regionwindlight, "ambient_g", typeof(Double)); + createCol(regionwindlight, "ambient_b", typeof(Double)); + createCol(regionwindlight, "ambient_i", typeof(Double)); + createCol(regionwindlight, "east_angle", typeof(Double)); + createCol(regionwindlight, "sun_glow_focus", typeof(Double)); + createCol(regionwindlight, "sun_glow_size", typeof(Double)); + createCol(regionwindlight, "scene_gamma", typeof(Double)); + createCol(regionwindlight, "star_brightness", typeof(Double)); + createCol(regionwindlight, "cloud_color_r", typeof(Double)); + createCol(regionwindlight, "cloud_color_g", typeof(Double)); + createCol(regionwindlight, "cloud_color_b", typeof(Double)); + createCol(regionwindlight, "cloud_color_i", typeof(Double)); + createCol(regionwindlight, "cloud_x", typeof(Double)); + createCol(regionwindlight, "cloud_y", typeof(Double)); + createCol(regionwindlight, "cloud_density", typeof(Double)); + createCol(regionwindlight, "cloud_coverage", typeof(Double)); + createCol(regionwindlight, "cloud_scale", typeof(Double)); + createCol(regionwindlight, "cloud_detail_x", typeof(Double)); + createCol(regionwindlight, "cloud_detail_y", typeof(Double)); + createCol(regionwindlight, "cloud_detail_density", typeof(Double)); + createCol(regionwindlight, "cloud_scroll_x", typeof(Double)); + createCol(regionwindlight, "cloud_scroll_x_lock", typeof(Int32)); + createCol(regionwindlight, "cloud_scroll_y", typeof(Double)); + createCol(regionwindlight, "cloud_scroll_y_lock", typeof(Int32)); + createCol(regionwindlight, "draw_classic_clouds", typeof(Int32)); + + regionwindlight.PrimaryKey = new DataColumn[] { regionwindlight.Columns["region_id"] }; + return regionwindlight; + } + /*********************************************************************** * * Convert between ADO.NET <=> OpenSim Objects @@ -1229,26 +1383,26 @@ namespace OpenSim.Data.SQLite // back out. Not enough time to figure it out yet. SceneObjectPart prim = new SceneObjectPart(); - prim.UUID = new UUID((String) row["UUID"]); + prim.UUID = new UUID((String)row["UUID"]); // explicit conversion of integers is required, which sort // of sucks. No idea if there is a shortcut here or not. prim.CreationDate = Convert.ToInt32(row["CreationDate"]); prim.Name = row["Name"] == DBNull.Value ? string.Empty : (string)row["Name"]; // various text fields - prim.Text = (String) row["Text"]; + prim.Text = (String)row["Text"]; prim.Color = Color.FromArgb(Convert.ToInt32(row["ColorA"]), Convert.ToInt32(row["ColorR"]), Convert.ToInt32(row["ColorG"]), Convert.ToInt32(row["ColorB"])); - prim.Description = (String) row["Description"]; - prim.SitName = (String) row["SitName"]; - prim.TouchName = (String) row["TouchName"]; + prim.Description = (String)row["Description"]; + prim.SitName = (String)row["SitName"]; + prim.TouchName = (String)row["TouchName"]; // permissions prim.ObjectFlags = Convert.ToUInt32(row["ObjectFlags"]); - prim.CreatorIdentification = (String) row["CreatorID"]; - prim.OwnerID = new UUID((String) row["OwnerID"]); - prim.GroupID = new UUID((String) row["GroupID"]); - prim.LastOwnerID = new UUID((String) row["LastOwnerID"]); + prim.CreatorIdentification = (String)row["CreatorID"]; + prim.OwnerID = new UUID((String)row["OwnerID"]); + prim.GroupID = new UUID((String)row["GroupID"]); + prim.LastOwnerID = new UUID((String)row["LastOwnerID"]); prim.OwnerMask = Convert.ToUInt32(row["OwnerMask"]); prim.NextOwnerMask = Convert.ToUInt32(row["NextOwnerMask"]); prim.GroupMask = Convert.ToUInt32(row["GroupMask"]); @@ -1360,7 +1514,7 @@ namespace OpenSim.Data.SQLite if (!(row["MediaURL"] is System.DBNull)) { - //m_log.DebugFormat("[SQLITE]: MediaUrl type [{0}]", row["MediaURL"].GetType()); +// m_log.DebugFormat("[SQLITE]: MediaUrl type [{0}]", row["MediaURL"].GetType()); prim.MediaUrl = (string)row["MediaURL"]; } @@ -1376,28 +1530,28 @@ namespace OpenSim.Data.SQLite { TaskInventoryItem taskItem = new TaskInventoryItem(); - taskItem.ItemID = new UUID((String)row["itemID"]); - taskItem.ParentPartID = new UUID((String)row["primID"]); - taskItem.AssetID = new UUID((String)row["assetID"]); - taskItem.ParentID = new UUID((String)row["parentFolderID"]); + taskItem.ItemID = new UUID((String)row["itemID"]); + taskItem.ParentPartID = new UUID((String)row["primID"]); + taskItem.AssetID = new UUID((String)row["assetID"]); + taskItem.ParentID = new UUID((String)row["parentFolderID"]); - taskItem.InvType = Convert.ToInt32(row["invType"]); - taskItem.Type = Convert.ToInt32(row["assetType"]); + taskItem.InvType = Convert.ToInt32(row["invType"]); + taskItem.Type = Convert.ToInt32(row["assetType"]); - taskItem.Name = (String)row["name"]; - taskItem.Description = (String)row["description"]; - taskItem.CreationDate = Convert.ToUInt32(row["creationDate"]); + taskItem.Name = (String)row["name"]; + taskItem.Description = (String)row["description"]; + taskItem.CreationDate = Convert.ToUInt32(row["creationDate"]); taskItem.CreatorIdentification = (String)row["creatorID"]; - taskItem.OwnerID = new UUID((String)row["ownerID"]); - taskItem.LastOwnerID = new UUID((String)row["lastOwnerID"]); - taskItem.GroupID = new UUID((String)row["groupID"]); + taskItem.OwnerID = new UUID((String)row["ownerID"]); + taskItem.LastOwnerID = new UUID((String)row["lastOwnerID"]); + taskItem.GroupID = new UUID((String)row["groupID"]); taskItem.NextPermissions = Convert.ToUInt32(row["nextPermissions"]); - taskItem.CurrentPermissions = Convert.ToUInt32(row["currentPermissions"]); - taskItem.BasePermissions = Convert.ToUInt32(row["basePermissions"]); - taskItem.EveryonePermissions = Convert.ToUInt32(row["everyonePermissions"]); - taskItem.GroupPermissions = Convert.ToUInt32(row["groupPermissions"]); - taskItem.Flags = Convert.ToUInt32(row["flags"]); + taskItem.CurrentPermissions = Convert.ToUInt32(row["currentPermissions"]); + taskItem.BasePermissions = Convert.ToUInt32(row["basePermissions"]); + taskItem.EveryonePermissions = Convert.ToUInt32(row["everyonePermissions"]); + taskItem.GroupPermissions = Convert.ToUInt32(row["groupPermissions"]); + taskItem.Flags = Convert.ToUInt32(row["flags"]); return taskItem; } @@ -1411,35 +1565,35 @@ namespace OpenSim.Data.SQLite { LandData newData = new LandData(); - newData.GlobalID = new UUID((String) row["UUID"]); + newData.GlobalID = new UUID((String)row["UUID"]); newData.LocalID = Convert.ToInt32(row["LocalLandID"]); // Bitmap is a byte[512] - newData.Bitmap = (Byte[]) row["Bitmap"]; + newData.Bitmap = (Byte[])row["Bitmap"]; - newData.Name = (String) row["Name"]; - newData.Description = (String) row["Desc"]; - newData.OwnerID = (UUID)(String) row["OwnerUUID"]; - newData.IsGroupOwned = (Boolean) row["IsGroupOwned"]; + newData.Name = (String)row["Name"]; + newData.Description = (String)row["Desc"]; + newData.OwnerID = (UUID)(String)row["OwnerUUID"]; + newData.IsGroupOwned = (Boolean)row["IsGroupOwned"]; newData.Area = Convert.ToInt32(row["Area"]); newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unemplemented - newData.Category = (ParcelCategory) Convert.ToInt32(row["Category"]); - //Enum OpenMetaverse.Parcel.ParcelCategory + newData.Category = (ParcelCategory)Convert.ToInt32(row["Category"]); + //Enum OpenMetaverse.Parcel.ParcelCategory newData.ClaimDate = Convert.ToInt32(row["ClaimDate"]); newData.ClaimPrice = Convert.ToInt32(row["ClaimPrice"]); - newData.GroupID = new UUID((String) row["GroupUUID"]); + newData.GroupID = new UUID((String)row["GroupUUID"]); newData.SalePrice = Convert.ToInt32(row["SalePrice"]); - newData.Status = (ParcelStatus) Convert.ToInt32(row["LandStatus"]); - //Enum. OpenMetaverse.Parcel.ParcelStatus + newData.Status = (ParcelStatus)Convert.ToInt32(row["LandStatus"]); + //Enum. OpenMetaverse.Parcel.ParcelStatus newData.Flags = Convert.ToUInt32(row["LandFlags"]); - newData.LandingType = (Byte) row["LandingType"]; - newData.MediaAutoScale = (Byte) row["MediaAutoScale"]; - newData.MediaID = new UUID((String) row["MediaTextureUUID"]); - newData.MediaURL = (String) row["MediaURL"]; - newData.MusicURL = (String) row["MusicURL"]; + newData.LandingType = (Byte)row["LandingType"]; + newData.MediaAutoScale = (Byte)row["MediaAutoScale"]; + newData.MediaID = new UUID((String)row["MediaTextureUUID"]); + newData.MediaURL = (String)row["MediaURL"]; + newData.MusicURL = (String)row["MusicURL"]; newData.PassHours = Convert.ToSingle(row["PassHours"]); newData.PassPrice = Convert.ToInt32(row["PassPrice"]); - newData.SnapshotID = (UUID)(String) row["SnapshotUUID"]; + newData.SnapshotID = (UUID)(String)row["SnapshotUUID"]; try { @@ -1471,7 +1625,7 @@ namespace OpenSim.Data.SQLite { RegionSettings newSettings = new RegionSettings(); - newSettings.RegionUUID = new UUID((string) row["regionUUID"]); + newSettings.RegionUUID = new UUID((string)row["regionUUID"]); newSettings.BlockTerraform = Convert.ToBoolean(row["block_terraform"]); newSettings.AllowDamage = Convert.ToBoolean(row["allow_damage"]); newSettings.BlockFly = Convert.ToBoolean(row["block_fly"]); @@ -1485,10 +1639,10 @@ namespace OpenSim.Data.SQLite newSettings.DisableScripts = Convert.ToBoolean(row["disable_scripts"]); newSettings.DisableCollisions = Convert.ToBoolean(row["disable_collisions"]); newSettings.DisablePhysics = Convert.ToBoolean(row["disable_physics"]); - newSettings.TerrainTexture1 = new UUID((String) row["terrain_texture_1"]); - newSettings.TerrainTexture2 = new UUID((String) row["terrain_texture_2"]); - newSettings.TerrainTexture3 = new UUID((String) row["terrain_texture_3"]); - newSettings.TerrainTexture4 = new UUID((String) row["terrain_texture_4"]); + newSettings.TerrainTexture1 = new UUID((String)row["terrain_texture_1"]); + newSettings.TerrainTexture2 = new UUID((String)row["terrain_texture_2"]); + newSettings.TerrainTexture3 = new UUID((String)row["terrain_texture_3"]); + newSettings.TerrainTexture4 = new UUID((String)row["terrain_texture_4"]); newSettings.Elevation1NW = Convert.ToDouble(row["elevation_1_nw"]); newSettings.Elevation2NW = Convert.ToDouble(row["elevation_2_nw"]); newSettings.Elevation1NE = Convert.ToDouble(row["elevation_1_ne"]); @@ -1502,20 +1656,97 @@ namespace OpenSim.Data.SQLite newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]); newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]); newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]); - newSettings.SunVector = new Vector3 ( + newSettings.SunVector = new Vector3( Convert.ToSingle(row["sunvectorx"]), Convert.ToSingle(row["sunvectory"]), Convert.ToSingle(row["sunvectorz"]) ); newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]); newSettings.SunPosition = Convert.ToDouble(row["sun_position"]); - newSettings.Covenant = new UUID((String) row["covenant"]); + newSettings.Covenant = new UUID((String)row["covenant"]); newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]); newSettings.TerrainImageID = new UUID((String)row["map_tile_ID"]); return newSettings; } + /// + /// Build a windlight entry from the persisted data. + /// + /// + /// RegionLightShareData + private RegionLightShareData buildRegionWindlight(DataRow row) + { + RegionLightShareData windlight = new RegionLightShareData(); + + windlight.regionID = new UUID((string)row["region_id"]); + windlight.waterColor.X = Convert.ToSingle(row["water_color_r"]); + windlight.waterColor.Y = Convert.ToSingle(row["water_color_g"]); + windlight.waterColor.Z = Convert.ToSingle(row["water_color_b"]); + //windlight.waterColor.W = Convert.ToSingle(row["water_color_i"]); //not implemented + windlight.waterFogDensityExponent = Convert.ToSingle(row["water_fog_density_exponent"]); + windlight.underwaterFogModifier = Convert.ToSingle(row["underwater_fog_modifier"]); + windlight.reflectionWaveletScale.X = Convert.ToSingle(row["reflection_wavelet_scale_1"]); + windlight.reflectionWaveletScale.Y = Convert.ToSingle(row["reflection_wavelet_scale_2"]); + windlight.reflectionWaveletScale.Z = Convert.ToSingle(row["reflection_wavelet_scale_3"]); + windlight.fresnelScale = Convert.ToSingle(row["fresnel_scale"]); + windlight.fresnelOffset = Convert.ToSingle(row["fresnel_offset"]); + windlight.refractScaleAbove = Convert.ToSingle(row["refract_scale_above"]); + windlight.refractScaleBelow = Convert.ToSingle(row["refract_scale_below"]); + windlight.blurMultiplier = Convert.ToSingle(row["blur_multiplier"]); + windlight.bigWaveDirection.X = Convert.ToSingle(row["big_wave_direction_x"]); + windlight.bigWaveDirection.Y = Convert.ToSingle(row["big_wave_direction_y"]); + windlight.littleWaveDirection.X = Convert.ToSingle(row["little_wave_direction_x"]); + windlight.littleWaveDirection.Y = Convert.ToSingle(row["little_wave_direction_y"]); + windlight.normalMapTexture = new UUID((string)row["normal_map_texture"]); + windlight.horizon.X = Convert.ToSingle(row["horizon_r"]); + windlight.horizon.Y = Convert.ToSingle(row["horizon_g"]); + windlight.horizon.Z = Convert.ToSingle(row["horizon_b"]); + windlight.horizon.W = Convert.ToSingle(row["horizon_i"]); + windlight.hazeHorizon = Convert.ToSingle(row["haze_horizon"]); + windlight.blueDensity.X = Convert.ToSingle(row["blue_density_r"]); + windlight.blueDensity.Y = Convert.ToSingle(row["blue_density_g"]); + windlight.blueDensity.Z = Convert.ToSingle(row["blue_density_b"]); + windlight.blueDensity.W = Convert.ToSingle(row["blue_density_i"]); + windlight.hazeDensity = Convert.ToSingle(row["haze_density"]); + windlight.densityMultiplier = Convert.ToSingle(row["density_multiplier"]); + windlight.distanceMultiplier = Convert.ToSingle(row["distance_multiplier"]); + windlight.maxAltitude = Convert.ToUInt16(row["max_altitude"]); + windlight.sunMoonColor.X = Convert.ToSingle(row["sun_moon_color_r"]); + windlight.sunMoonColor.Y = Convert.ToSingle(row["sun_moon_color_g"]); + windlight.sunMoonColor.Z = Convert.ToSingle(row["sun_moon_color_b"]); + windlight.sunMoonColor.W = Convert.ToSingle(row["sun_moon_color_i"]); + windlight.sunMoonPosition = Convert.ToSingle(row["sun_moon_position"]); + windlight.ambient.X = Convert.ToSingle(row["ambient_r"]); + windlight.ambient.Y = Convert.ToSingle(row["ambient_g"]); + windlight.ambient.Z = Convert.ToSingle(row["ambient_b"]); + windlight.ambient.W = Convert.ToSingle(row["ambient_i"]); + windlight.eastAngle = Convert.ToSingle(row["east_angle"]); + windlight.sunGlowFocus = Convert.ToSingle(row["sun_glow_focus"]); + windlight.sunGlowSize = Convert.ToSingle(row["sun_glow_size"]); + windlight.sceneGamma = Convert.ToSingle(row["scene_gamma"]); + windlight.starBrightness = Convert.ToSingle(row["star_brightness"]); + windlight.cloudColor.X = Convert.ToSingle(row["cloud_color_r"]); + windlight.cloudColor.Y = Convert.ToSingle(row["cloud_color_g"]); + windlight.cloudColor.Z = Convert.ToSingle(row["cloud_color_b"]); + windlight.cloudColor.W = Convert.ToSingle(row["cloud_color_i"]); + windlight.cloudXYDensity.X = Convert.ToSingle(row["cloud_x"]); + windlight.cloudXYDensity.Y = Convert.ToSingle(row["cloud_y"]); + windlight.cloudXYDensity.Z = Convert.ToSingle(row["cloud_density"]); + windlight.cloudCoverage = Convert.ToSingle(row["cloud_coverage"]); + windlight.cloudScale = Convert.ToSingle(row["cloud_scale"]); + windlight.cloudDetailXYDensity.X = Convert.ToSingle(row["cloud_detail_x"]); + windlight.cloudDetailXYDensity.Y = Convert.ToSingle(row["cloud_detail_y"]); + windlight.cloudDetailXYDensity.Z = Convert.ToSingle(row["cloud_detail_density"]); + windlight.cloudScrollX = Convert.ToSingle(row["cloud_scroll_x"]); + windlight.cloudScrollXLock = Convert.ToBoolean(row["cloud_scroll_x_lock"]); + windlight.cloudScrollY = Convert.ToSingle(row["cloud_scroll_y"]); + windlight.cloudScrollYLock = Convert.ToBoolean(row["cloud_scroll_y_lock"]); + windlight.drawClassicClouds = Convert.ToBoolean(row["draw_classic_clouds"]); + + return windlight; + } + /// /// Build a land access entry from the persisted data. /// @@ -1524,8 +1755,8 @@ namespace OpenSim.Data.SQLite private static LandAccessEntry buildLandAccessData(DataRow row) { LandAccessEntry entry = new LandAccessEntry(); - entry.AgentID = new UUID((string) row["AccessUUID"]); - entry.Flags = (AccessList) row["Flags"]; + entry.AgentID = new UUID((string)row["AccessUUID"]); + entry.Flags = (AccessList)row["Flags"]; entry.Expires = 0; return entry; } @@ -1537,7 +1768,7 @@ namespace OpenSim.Data.SQLite /// private static Array serializeTerrain(double[,] val) { - MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double)); + MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) * sizeof(double)); BinaryWriter bw = new BinaryWriter(str); // TODO: COMPATIBILITY - Add byte-order conversions @@ -1548,21 +1779,21 @@ namespace OpenSim.Data.SQLite return str.ToArray(); } -// private void fillTerrainRow(DataRow row, UUID regionUUID, int rev, double[,] val) -// { -// row["RegionUUID"] = regionUUID; -// row["Revision"] = rev; + // private void fillTerrainRow(DataRow row, UUID regionUUID, int rev, double[,] val) + // { + // row["RegionUUID"] = regionUUID; + // row["Revision"] = rev; // MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize)*sizeof (double)); -// BinaryWriter bw = new BinaryWriter(str); + // BinaryWriter bw = new BinaryWriter(str); -// // TODO: COMPATIBILITY - Add byte-order conversions + // // TODO: COMPATIBILITY - Add byte-order conversions // for (int x = 0; x < (int)Constants.RegionSize; x++) // for (int y = 0; y < (int)Constants.RegionSize; y++) -// bw.Write(val[x, y]); + // bw.Write(val[x, y]); -// row["Heightfield"] = str.ToArray(); -// } + // row["Heightfield"] = str.ToArray(); + // } /// /// @@ -1839,6 +2070,79 @@ namespace OpenSim.Data.SQLite row["map_tile_ID"] = settings.TerrainImageID.ToString(); } + /// + /// + /// + /// + /// + private static void fillRegionWindlightRow(DataRow row, RegionLightShareData windlight) + { + row["region_id"] = windlight.regionID.ToString(); + row["water_color_r"] = windlight.waterColor.X; + row["water_color_g"] = windlight.waterColor.Y; + row["water_color_b"] = windlight.waterColor.Z; + row["water_color_i"] = 1; //windlight.waterColor.W; //not implemented + row["water_fog_density_exponent"] = windlight.waterFogDensityExponent; + row["underwater_fog_modifier"] = windlight.underwaterFogModifier; + row["reflection_wavelet_scale_1"] = windlight.reflectionWaveletScale.X; + row["reflection_wavelet_scale_2"] = windlight.reflectionWaveletScale.Y; + row["reflection_wavelet_scale_3"] = windlight.reflectionWaveletScale.Z; + row["fresnel_scale"] = windlight.fresnelScale; + row["fresnel_offset"] = windlight.fresnelOffset; + row["refract_scale_above"] = windlight.refractScaleAbove; + row["refract_scale_below"] = windlight.refractScaleBelow; + row["blur_multiplier"] = windlight.blurMultiplier; + row["big_wave_direction_x"] = windlight.bigWaveDirection.X; + row["big_wave_direction_y"] = windlight.bigWaveDirection.Y; + row["little_wave_direction_x"] = windlight.littleWaveDirection.X; + row["little_wave_direction_y"] = windlight.littleWaveDirection.Y; + row["normal_map_texture"] = windlight.normalMapTexture.ToString(); + row["horizon_r"] = windlight.horizon.X; + row["horizon_g"] = windlight.horizon.Y; + row["horizon_b"] = windlight.horizon.Z; + row["horizon_i"] = windlight.horizon.W; + row["haze_horizon"] = windlight.hazeHorizon; + row["blue_density_r"] = windlight.blueDensity.X; + row["blue_density_g"] = windlight.blueDensity.Y; + row["blue_density_b"] = windlight.blueDensity.Z; + row["blue_density_i"] = windlight.blueDensity.W; + row["haze_density"] = windlight.hazeDensity; + row["density_multiplier"] = windlight.densityMultiplier; + row["distance_multiplier"] = windlight.distanceMultiplier; + row["max_altitude"] = windlight.maxAltitude; + row["sun_moon_color_r"] = windlight.sunMoonColor.X; + row["sun_moon_color_g"] = windlight.sunMoonColor.Y; + row["sun_moon_color_b"] = windlight.sunMoonColor.Z; + row["sun_moon_color_i"] = windlight.sunMoonColor.W; + row["sun_moon_position"] = windlight.sunMoonPosition; + row["ambient_r"] = windlight.ambient.X; + row["ambient_g"] = windlight.ambient.Y; + row["ambient_b"] = windlight.ambient.Z; + row["ambient_i"] = windlight.ambient.W; + row["east_angle"] = windlight.eastAngle; + row["sun_glow_focus"] = windlight.sunGlowFocus; + row["sun_glow_size"] = windlight.sunGlowSize; + row["scene_gamma"] = windlight.sceneGamma; + row["star_brightness"] = windlight.starBrightness; + row["cloud_color_r"] = windlight.cloudColor.X; + row["cloud_color_g"] = windlight.cloudColor.Y; + row["cloud_color_b"] = windlight.cloudColor.Z; + row["cloud_color_i"] = windlight.cloudColor.W; + row["cloud_x"] = windlight.cloudXYDensity.X; + row["cloud_y"] = windlight.cloudXYDensity.Y; + row["cloud_density"] = windlight.cloudXYDensity.Z; + row["cloud_coverage"] = windlight.cloudCoverage; + row["cloud_scale"] = windlight.cloudScale; + row["cloud_detail_x"] = windlight.cloudDetailXYDensity.X; + row["cloud_detail_y"] = windlight.cloudDetailXYDensity.Y; + row["cloud_detail_density"] = windlight.cloudDetailXYDensity.Z; + row["cloud_scroll_x"] = windlight.cloudScrollX; + row["cloud_scroll_x_lock"] = windlight.cloudScrollXLock; + row["cloud_scroll_y"] = windlight.cloudScrollY; + row["cloud_scroll_y_lock"] = windlight.cloudScrollYLock; + row["draw_classic_clouds"] = windlight.drawClassicClouds; + } + /// /// /// @@ -1878,7 +2182,7 @@ namespace OpenSim.Data.SQLite byte[] textureEntry = (byte[])row["Texture"]; s.TextureEntry = textureEntry; - s.ExtraParams = (byte[]) row["ExtraParams"]; + s.ExtraParams = (byte[])row["ExtraParams"]; if (!(row["Media"] is System.DBNull)) s.Media = PrimitiveBaseShape.MediaList.FromXml((string)row["Media"]); @@ -1986,10 +2290,10 @@ namespace OpenSim.Data.SQLite // repalce with current inventory details foreach (TaskInventoryItem newItem in items) { -// m_log.InfoFormat( -// "[DATASTORE]: ", -// "Adding item {0}, {1} to prim ID {2}", -// newItem.Name, newItem.ItemID, newItem.ParentPartID); + // m_log.InfoFormat( + // "[DATASTORE]: ", + // "Adding item {0}, {1} to prim ID {2}", + // newItem.Name, newItem.ItemID, newItem.ParentPartID); DataRow newItemRow = dbItems.NewRow(); fillItemRow(newItemRow, newItem); @@ -2040,7 +2344,7 @@ namespace OpenSim.Data.SQLite sql += ") values (:"; sql += String.Join(", :", cols); sql += ")"; - //m_log.DebugFormat("[SQLITE]: Created insert command {0}", sql); +// m_log.DebugFormat("[SQLITE]: Created insert command {0}", sql); SqliteCommand cmd = new SqliteCommand(sql); // this provides the binding for all our parameters, so @@ -2192,7 +2496,7 @@ namespace OpenSim.Data.SQLite da.UpdateCommand.Connection = conn; SqliteCommand delete = new SqliteCommand("delete from prims where UUID = :UUID"); - delete.Parameters.Add(createSqliteParameter("UUID", typeof (String))); + delete.Parameters.Add(createSqliteParameter("UUID", typeof(String))); delete.Connection = conn; da.DeleteCommand = delete; } @@ -2211,7 +2515,7 @@ namespace OpenSim.Data.SQLite da.UpdateCommand.Connection = conn; SqliteCommand delete = new SqliteCommand("delete from primitems where itemID = :itemID"); - delete.Parameters.Add(createSqliteParameter("itemID", typeof (String))); + delete.Parameters.Add(createSqliteParameter("itemID", typeof(String))); delete.Connection = conn; da.DeleteCommand = delete; } @@ -2274,6 +2578,19 @@ namespace OpenSim.Data.SQLite da.UpdateCommand.Connection = conn; } + /// + /// + /// + /// + /// + private void setupRegionWindlightCommands(SqliteDataAdapter da, SqliteConnection conn) + { + da.InsertCommand = createInsertCommand("regionwindlight", ds.Tables["regionwindlight"]); + da.InsertCommand.Connection = conn; + da.UpdateCommand = createUpdateCommand("regionwindlight", "region_id=:region_id", ds.Tables["regionwindlight"]); + da.UpdateCommand.Connection = conn; + } + /// /// /// @@ -2288,7 +2605,7 @@ namespace OpenSim.Data.SQLite da.UpdateCommand.Connection = conn; SqliteCommand delete = new SqliteCommand("delete from primshapes where UUID = :UUID"); - delete.Parameters.Add(createSqliteParameter("UUID", typeof (String))); + delete.Parameters.Add(createSqliteParameter("UUID", typeof(String))); delete.Connection = conn; da.DeleteCommand = delete; } @@ -2306,27 +2623,27 @@ namespace OpenSim.Data.SQLite /// private static DbType dbtypeFromType(Type type) { - if (type == typeof (String)) + if (type == typeof(String)) { return DbType.String; } - else if (type == typeof (Int32)) + else if (type == typeof(Int32)) { return DbType.Int32; } - else if (type == typeof (Double)) + else if (type == typeof(Double)) { return DbType.Double; } - else if (type == typeof (Byte)) + else if (type == typeof(Byte)) { return DbType.Byte; } - else if (type == typeof (Double)) + else if (type == typeof(Double)) { return DbType.Double; } - else if (type == typeof (Byte[])) + else if (type == typeof(Byte[])) { return DbType.Binary; } @@ -2338,32 +2655,32 @@ namespace OpenSim.Data.SQLite static void PrintDataSet(DataSet ds) { - // Print out any name and extended properties. - Console.WriteLine("DataSet is named: {0}", ds.DataSetName); - foreach (System.Collections.DictionaryEntry de in ds.ExtendedProperties) - { - Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); - } - Console.WriteLine(); - foreach (DataTable dt in ds.Tables) - { - Console.WriteLine("=> {0} Table:", dt.TableName); - // Print out the column names. - for (int curCol = 0; curCol < dt.Columns.Count; curCol++) + // Print out any name and extended properties. + Console.WriteLine("DataSet is named: {0}", ds.DataSetName); + foreach (System.Collections.DictionaryEntry de in ds.ExtendedProperties) { - Console.Write(dt.Columns[curCol].ColumnName + "\t"); + Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); } - Console.WriteLine("\n----------------------------------"); - // Print the DataTable. - for (int curRow = 0; curRow < dt.Rows.Count; curRow++) + Console.WriteLine(); + foreach (DataTable dt in ds.Tables) { - for (int curCol = 0; curCol < dt.Columns.Count; curCol++) - { - Console.Write(dt.Rows[curRow][curCol].ToString() + "\t"); - } - Console.WriteLine(); + Console.WriteLine("=> {0} Table:", dt.TableName); + // Print out the column names. + for (int curCol = 0; curCol < dt.Columns.Count; curCol++) + { + Console.Write(dt.Columns[curCol].ColumnName + "\t"); + } + Console.WriteLine("\n----------------------------------"); + // Print the DataTable. + for (int curRow = 0; curRow < dt.Rows.Count; curRow++) + { + for (int curCol = 0; curCol < dt.Columns.Count; curCol++) + { + Console.Write(dt.Rows[curRow][curCol].ToString() + "\t"); + } + Console.WriteLine(); + } } - } } } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 2e620ff0fe..a820ddf93f 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -484,7 +484,6 @@ ;; such as the Meta7 viewer. ;; It has no ill effect on viewers which do not support server-side ;; windlight settings. - ;; Currently we only have support for MySQL databases. ; enable_windlight = false diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 3fd3d31b6e..fab2c476be 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -1070,7 +1070,6 @@ [LightShare] ; This enables the transmission of Windlight scenes to supporting clients, such as the Meta7 viewer. ; It has no ill effect on viewers which do not support server-side windlight settings. - ; Currently we only have support for MySQL databases. enable_windlight = false From 4589ce61bc68311d6ab7b5e7aa40ed1def40f52e Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Sat, 11 Feb 2012 19:00:01 +0100 Subject: [PATCH 35/38] Fix: get embedded objects from Notecard fails with activated FreeSwitchVoiceModul http://opensimulator.org/mantis/view.php?id=2607 --- .../Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index 5323a95e9b..05678c0fe9 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs @@ -63,9 +63,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // Capability string prefixes - private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; - private static readonly string m_provisionVoiceAccountRequestPath = "0008/"; - private static readonly string m_chatSessionRequestPath = "0009/"; + private static readonly string m_parcelVoiceInfoRequestPath = "0207/"; + private static readonly string m_provisionVoiceAccountRequestPath = "0208/"; + private static readonly string m_chatSessionRequestPath = "0209/"; // Control info private static bool m_Enabled = false; From a9e8bd59a377e7c7ce81e3693875467926dd7d4b Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Mon, 13 Feb 2012 19:38:22 -0800 Subject: [PATCH 36/38] Fix a race condition in the simian groups connector. When requests were too slow they would circumvent the cache (piling up on the network service and making the problem even worse). This condition happens frequently during permission checks. --- .../SimianGroupsServicesConnectorModule.cs | 73 ++++++++++++++++--- 1 file changed, 64 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs index 42008dae43..130513d4c0 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs @@ -30,6 +30,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; +using System.Threading; using Nwc.XmlRpc; @@ -167,6 +168,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups private bool m_debugEnabled = false; + private Dictionary m_pendingRequests = new Dictionary(); + private ExpiringCache m_memoryCache; private int m_cacheTimeout = 30; @@ -1348,6 +1351,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups // Immediately forward the request if the cache is disabled. if (m_cacheTimeout == 0) { + m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: cache is disabled"); return WebUtil.PostToService(m_groupsServerURI, requestArgs); } @@ -1355,6 +1359,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups if (requestArgs["RequestMethod"] == "RemoveGeneric" || requestArgs["RequestMethod"] == "AddGeneric") { + m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: clearing generics cache"); + // Any and all updates cause the cache to clear m_memoryCache.Clear(); @@ -1366,18 +1372,67 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups // Create the cache key for the request and see if we have it cached string CacheKey = WebUtil.BuildQueryString(requestArgs); - OSDMap response = null; - if (!m_memoryCache.TryGetValue(CacheKey, out response)) - { - // if it wasn't in the cache, pass the request to the Simian Grid Services - response = WebUtil.PostToService(m_groupsServerURI, requestArgs); - // and cache the response - m_memoryCache.AddOrUpdate(CacheKey, response, TimeSpan.FromSeconds(m_cacheTimeout)); + // This code uses a leader/follower pattern. On a cache miss, the request is added + // to a queue; the first thread to add it to the queue completes the request while + // follow on threads busy wait for the results, this situation seems to happen + // often when checking permissions + while (true) + { + OSDMap response = null; + bool firstRequest = false; + + lock (m_memoryCache) + { + if (m_memoryCache.TryGetValue(CacheKey, out response)) + return response; + + if (! m_pendingRequests.ContainsKey(CacheKey)) + { + m_pendingRequests.Add(CacheKey,true); + firstRequest = true; + } + } + + if (firstRequest) + { + // if it wasn't in the cache, pass the request to the Simian Grid Services + try + { + response = WebUtil.PostToService(m_groupsServerURI, requestArgs); + } + catch (Exception e) + { + m_log.InfoFormat("[SIMIAN GROUPS CONNECTOR] request failed {0}",CacheKey); + } + + // and cache the response + lock (m_memoryCache) + { + m_memoryCache.AddOrUpdate(CacheKey, response, TimeSpan.FromSeconds(m_cacheTimeout)); + m_pendingRequests.Remove(CacheKey); + } + + return response; + } + + Thread.Sleep(50); // waiting for a web request to complete, 50msecs is reasonable } - // return cached response - return response; + // if (!m_memoryCache.TryGetValue(CacheKey, out response)) + // { + // m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: query not in the cache"); + // Util.PrintCallStack(); + + // // if it wasn't in the cache, pass the request to the Simian Grid Services + // response = WebUtil.PostToService(m_groupsServerURI, requestArgs); + + // // and cache the response + // m_memoryCache.AddOrUpdate(CacheKey, response, TimeSpan.FromSeconds(m_cacheTimeout)); + // } + + // // return cached response + // return response; } #endregion From 2ebb421331c4e6c4f57e0cc1bab79cea70937172 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Tue, 14 Feb 2012 17:20:34 -0800 Subject: [PATCH 37/38] Refactor appearance saving for NPC to use AvatarFactoryModule interface. --- .../AvatarFactory/AvatarFactoryModule.cs | 40 ++++++++++++++----- .../Interfaces/IAvatarFactoryModule.cs | 1 + .../OptionalModules/World/NPC/NPCModule.cs | 12 +++--- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 8d503bd7e6..c7f4c20d67 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -111,6 +111,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory #region IAvatarFactoryModule + /// + /// + /// + /// + public void SetAppearance(IScenePresence sp, AvatarAppearance appearance) + { + SetAppearance(sp, appearance.Texture, appearance.VisualParams); + } + /// /// Set appearance data (texture asset IDs and slider settings) /// @@ -156,14 +165,23 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory changed = sp.Appearance.SetTextureEntries(textureEntry) || changed; // WriteBakedTexturesReport(sp, m_log.DebugFormat); - if (!ValidateBakedTextureCache(sp)) + + // If bake textures are missing and this is not an NPC, request a rebake from client + if (!ValidateBakedTextureCache(sp) && (((ScenePresence)sp).PresenceType != PresenceType.Npc)) RequestRebake(sp, true); // This appears to be set only in the final stage of the appearance // update transaction. In theory, we should be able to do an immediate // appearance send and save here. } - + + // NPC should send to clients immediately and skip saving appearance + if (((ScenePresence)sp).PresenceType == PresenceType.Npc) + { + SendAppearance((ScenePresence)sp); + return; + } + // save only if there were changes, send no matter what (doesn't hurt to send twice) if (changed) QueueAppearanceSave(sp.ControllingClient.AgentId); @@ -174,6 +192,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory // m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString()); } + private void SendAppearance(ScenePresence sp) + { + // Send the appearance to everyone in the scene + sp.SendAppearanceToAllOtherAgents(); + + // Send animations back to the avatar as well + sp.Animator.SendAnimPack(); + } + public bool SendAppearance(UUID agentId) { // m_log.DebugFormat("[AVFACTORY]: Sending appearance for {0}", agentId); @@ -185,12 +212,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory return false; } - // Send the appearance to everyone in the scene - sp.SendAppearanceToAllOtherAgents(); - - // Send animations back to the avatar as well - sp.Animator.SendAnimPack(); - + SendAppearance(sp); return true; } @@ -626,4 +648,4 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory outputAction("{0} baked appearance texture is {1}", sp.Name, bakedTextureValid ? "OK" : "corrupt"); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs index 39a760cbf4..34aca33349 100644 --- a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs @@ -35,6 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces public interface IAvatarFactoryModule { + void SetAppearance(IScenePresence sp, AvatarAppearance appearance); void SetAppearance(IScenePresence sp, Primitive.TextureEntry textureEntry, byte[] visualParams); /// diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index dc6eefcb16..53593545ef 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -96,15 +96,15 @@ namespace OpenSim.Region.OptionalModules.World.NPC if (!m_avatars.ContainsKey(agentId)) return false; + // Delete existing sp attachments scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false); - AvatarAppearance npcAppearance = new AvatarAppearance(appearance, true); - sp.Appearance = npcAppearance; + // Set new sp appearance. Also sends to clients. + scene.RequestModuleInterface().SetAppearance(sp, new AvatarAppearance(appearance, true)); + + // Rez needed sp attachments scene.AttachmentsModule.RezAttachments(sp); - - IAvatarFactoryModule module = scene.RequestModuleInterface(); - module.SendAppearance(sp.UUID); - + return true; } From ebe5e1731d24e68ec7a8aa61a397f5febc1c2662 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 15 Feb 2012 01:45:25 +0000 Subject: [PATCH 38/38] In ObjectTortureTests, run garbage collector on Teardown and run scene loop update when scene objects have been deleted. At least on mono 2.6.4, running GC.Collect() is not guaranteed to force gc of all objects when run in the same method where those objects had references. Therefore, GC.Collect() is now being done in the per-script teardown of ObjectTortureTests. In addition, scene loop update is being run after garbage collection in order to clean out the viewer update list of scene objects in the SceneGraph. These measures mean that scene objects/parts are now garbage collected after a test run if deleted from the scene, resulting in a much better memory usage report (though probably still not very accurate). However, deletion takes a very long time - what's really needed is to find out now why the entire scene isn't being GC'd by this measure. This change hasn't yet been applied to the other stress tests. --- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 10 ++--- .../Framework/Scenes/SceneObjectPart.cs | 3 ++ .../Scenes/Tests/SceneObjectBasicTests.cs | 41 ++++++++++++++++++- OpenSim/Tests/Common/Mock/TestScene.cs | 3 +- OpenSim/Tests/Torture/ObjectTortureTests.cs | 21 +++++++++- 5 files changed, 68 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 693a79e5df..e66678afb2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -359,7 +359,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.ErrorFormat( "[SCENEGRAPH]: Tried to add scene object {0} to {1} with illegal UUID of {2}", sceneObject.Name, m_parentScene.RegionInfo.RegionName, UUID.Zero); - + return false; } @@ -368,12 +368,12 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat( // "[SCENEGRAPH]: Scene graph for {0} already contains object {1} in AddSceneObject()", // m_parentScene.RegionInfo.RegionName, sceneObject.UUID); - + return false; } - + // m_log.DebugFormat( -// "[SCENEGRAPH]: Adding scene object {0} {1}, with {2} parts on {3}", +// "[SCENEGRAPH]: Adding scene object {0} {1}, with {2} parts on {3}", // sceneObject.Name, sceneObject.UUID, sceneObject.Parts.Length, m_parentScene.RegionInfo.RegionName); SceneObjectPart[] parts = sceneObject.Parts; @@ -409,7 +409,7 @@ namespace OpenSim.Region.Framework.Scenes lock (SceneObjectGroupsByFullID) SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject; - + lock (SceneObjectGroupsByFullPartID) { foreach (SceneObjectPart part in parts) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 4c339d9c8b..b130bf70dc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -303,6 +303,9 @@ namespace OpenSim.Region.Framework.Scenes // ~SceneObjectPart() // { +// Console.WriteLine( +// "[SCENE OBJECT PART]: Destructor called for {0}, local id {1}, parent {2} {3}", +// Name, LocalId, ParentGroup.Name, ParentGroup.LocalId); // m_log.DebugFormat( // "[SCENE OBJECT PART]: Destructor called for {0}, local id {1}, parent {2} {3}", // Name, LocalId, ParentGroup.Name, ParentGroup.LocalId); diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs index 80f198d2d6..7737d8ea83 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs @@ -27,6 +27,7 @@ using System; using System.Reflection; +using System.Threading; using NUnit.Framework; using OpenMetaverse; using OpenSim.Framework; @@ -43,6 +44,42 @@ namespace OpenSim.Region.Framework.Scenes.Tests [TestFixture] public class SceneObjectBasicTests { +// [TearDown] +// public void TearDown() +// { +// Console.WriteLine("TearDown"); +// GC.Collect(); +// Thread.Sleep(3000); +// } + +// public class GcNotify +// { +// public static AutoResetEvent gcEvent = new AutoResetEvent(false); +// private static bool _initialized = false; +// +// public static void Initialize() +// { +// if (!_initialized) +// { +// _initialized = true; +// new GcNotify(); +// } +// } +// +// private GcNotify(){} +// +// ~GcNotify() +// { +// if (!Environment.HasShutdownStarted && +// !AppDomain.CurrentDomain.IsFinalizingForUnload()) +// { +// Console.WriteLine("GcNotify called"); +// gcEvent.Set(); +// new GcNotify(); +// } +// } +// } + /// /// Test adding an object to a scene. /// @@ -147,11 +184,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests public void TestDeleteSceneObject() { TestHelpers.InMethod(); - + TestScene scene = SceneHelpers.SetupScene(); SceneObjectPart part = SceneHelpers.AddSceneObject(scene); scene.DeleteSceneObject(part.ParentGroup, false); - + SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId); Assert.That(retrievedPart, Is.Null); } diff --git a/OpenSim/Tests/Common/Mock/TestScene.cs b/OpenSim/Tests/Common/Mock/TestScene.cs index 328cd2b4e5..eea68c3b40 100644 --- a/OpenSim/Tests/Common/Mock/TestScene.cs +++ b/OpenSim/Tests/Common/Mock/TestScene.cs @@ -50,7 +50,8 @@ namespace OpenSim.Tests.Common.Mock ~TestScene() { - Console.WriteLine("TestScene destructor called for {0}", RegionInfo.RegionName); + //Console.WriteLine("TestScene destructor called for {0}", RegionInfo.RegionName); + Console.WriteLine("TestScene destructor called"); } /// diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs index 74b336eeb9..e83186a929 100644 --- a/OpenSim/Tests/Torture/ObjectTortureTests.cs +++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs @@ -49,6 +49,13 @@ namespace OpenSim.Tests.Torture [TestFixture] public class ObjectTortureTests { + [TearDown] + public void TearDown() + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + // [Test] // public void Test0000Clean() // { @@ -141,8 +148,18 @@ namespace OpenSim.Tests.Torture string.Format("Object {0} could not be retrieved", i)); } - // This does not work to fire the SceneObjectGroup destructors - something else is hanging on to them. -// scene.DeleteAllSceneObjects(); + // When a scene object is added to a scene, it is placed in the update list for sending to viewers + // (though in this case we have none). When it is deleted, it is not removed from the update which is + // fine since it will later be ignored. + // + // However, that means that we need to manually run an update here to clear out that list so that deleted + // objects will be clean up by the garbage collector before the next stress test is run. + scene.Update(); + + // Currently, we need to do this in order to garbage collect the scene objects ready for the next test run. + // However, what we really need to do is find out why the entire scene is not garbage collected in + // teardown. + scene.DeleteAllSceneObjects(); Console.WriteLine( "Took {0}ms, {1}MB ({2} - {3}) to create {4} objects each containing {5} prim(s)",