diff --git a/OpenSim/Data/IXAssetDataPlugin.cs b/OpenSim/Data/IXAssetDataPlugin.cs new file mode 100644 index 0000000000..74ad6f497d --- /dev/null +++ b/OpenSim/Data/IXAssetDataPlugin.cs @@ -0,0 +1,47 @@ +/* + * 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.Collections.Generic; +using OpenMetaverse; +using OpenSim.Framework; + +namespace OpenSim.Data +{ + /// + /// This interface exists to distinguish between the normal IAssetDataPlugin and the one used by XAssetService + /// for now. + /// + public interface IXAssetDataPlugin : IPlugin + { + AssetBase GetAsset(UUID uuid); + void StoreAsset(AssetBase asset); + bool ExistsAsset(UUID uuid); + List FetchAssetMetadataSet(int start, int count); + void Initialise(string connect); + bool Delete(string id); + } +} \ No newline at end of file diff --git a/OpenSim/Data/MySQL/MySQLXAssetData.cs b/OpenSim/Data/MySQL/MySQLXAssetData.cs index 7b634e2b09..9a503734be 100644 --- a/OpenSim/Data/MySQL/MySQLXAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLXAssetData.cs @@ -41,7 +41,7 @@ using OpenSim.Data; namespace OpenSim.Data.MySQL { - public class MySQLXAssetData : AssetDataBase + public class MySQLXAssetData : IXAssetDataPlugin { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -61,7 +61,7 @@ namespace OpenSim.Data.MySQL #region IPlugin Members - public override string Version { get { return "1.0.0.0"; } } + public string Version { get { return "1.0.0.0"; } } /// /// Initialises Asset interface @@ -74,7 +74,7 @@ namespace OpenSim.Data.MySQL /// /// /// connect string - public override void Initialise(string connect) + public void Initialise(string connect) { m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************"); m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************"); @@ -96,17 +96,17 @@ namespace OpenSim.Data.MySQL } } - public override void Initialise() + public void Initialise() { throw new NotImplementedException(); } - public override void Dispose() { } + public void Dispose() { } /// /// The name of this DB provider /// - override public string Name + public string Name { get { return "MySQL XAsset storage engine"; } } @@ -121,7 +121,7 @@ namespace OpenSim.Data.MySQL /// Asset UUID to fetch /// Return the asset /// On failure : throw an exception and attempt to reconnect to database - override public AssetBase GetAsset(UUID assetID) + public AssetBase GetAsset(UUID assetID) { // m_log.DebugFormat("[MYSQL XASSET DATA]: Looking for asset {0}", assetID); @@ -190,7 +190,7 @@ namespace OpenSim.Data.MySQL /// /// Asset UUID to create /// On failure : Throw an exception and attempt to reconnect to database - override public bool StoreAsset(AssetBase asset) + public void StoreAsset(AssetBase asset) { lock (m_dbLock) { @@ -265,7 +265,7 @@ namespace OpenSim.Data.MySQL transaction.Rollback(); - return false; + return; } if (!ExistsData(dbcon, transaction, hash)) @@ -289,7 +289,7 @@ namespace OpenSim.Data.MySQL transaction.Rollback(); - return false; + return; } } @@ -297,7 +297,6 @@ namespace OpenSim.Data.MySQL } } } - return true; } // private void UpdateAccessTime(AssetBase asset) @@ -381,7 +380,7 @@ namespace OpenSim.Data.MySQL /// /// The asset UUID /// true if it exists, false otherwise. - override public bool ExistsAsset(UUID uuid) + public bool ExistsAsset(UUID uuid) { // m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid); @@ -427,7 +426,7 @@ namespace OpenSim.Data.MySQL /// The number of results to discard from the total data set. /// The number of rows the returned list should contain. /// A list of AssetMetadata objects. - public override List FetchAssetMetadataSet(int start, int count) + public List FetchAssetMetadataSet(int start, int count) { List retList = new List(count); @@ -472,7 +471,7 @@ namespace OpenSim.Data.MySQL return retList; } - public override bool Delete(string id) + public bool Delete(string id) { // m_log.DebugFormat("[XASSETS DB]: Deleting asset {0}", id); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/LocalAuthorizationServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/LocalAuthorizationServiceConnector.cs index c982db61fc..267fb9ead9 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/LocalAuthorizationServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/LocalAuthorizationServiceConnector.cs @@ -93,8 +93,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization scene.RegisterModuleInterface(this); m_Scene = scene; - - scene.EventManager.OnLoginsEnabled += new EventManager.LoginsEnabled(OnLoginsEnabled); } public void RemoveRegion(Scene scene) @@ -106,16 +104,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization if (!m_Enabled) return; + m_AuthorizationService = new AuthorizationService(m_AuthorizationConfig, m_Scene); + m_log.InfoFormat( "[AUTHORIZATION CONNECTOR]: Enabled local authorization for region {0}", scene.RegionInfo.RegionName); } - private void OnLoginsEnabled(string regionName) - { - m_AuthorizationService = new AuthorizationService(m_AuthorizationConfig, m_Scene); - } - public bool IsAuthorizedForRegion( string userID, string firstName, string lastName, string regionID, out string message) { diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 605ee3202f..853491b2e0 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -485,6 +485,13 @@ namespace OpenSim.Region.Framework.Scenes public event RegionHeartbeatEnd OnRegionHeartbeatEnd; public delegate void LoginsEnabled(string regionName); + + /// + /// This should only fire in all circumstances if the RegionReady module is active. + /// + /// + /// TODO: Fire this even when the RegionReady module is not active. + /// public event LoginsEnabled OnLoginsEnabled; public delegate void PrimsLoaded(Scene s); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 753effcda0..b50ccc43f5 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1229,9 +1229,6 @@ namespace OpenSim.Region.Framework.Scenes while (!shuttingdown) Update(); } - catch (ThreadAbortException) - { - } finally { Monitor.Pulse(m_heartbeatLock); @@ -1409,10 +1406,6 @@ namespace OpenSim.Region.Framework.Scenes } } } - catch (NotImplementedException) - { - throw; - } catch (Exception e) { m_log.ErrorFormat( diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index c5a76b2683..bebc10ca25 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs @@ -63,17 +63,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests Thread testThread = new Thread(testClass.run); - try - { - // Seems kind of redundant to start a thread and then join it, however.. We need to protect against - // A thread abort exception in the simulator code. - testThread.Start(); - testThread.Join(); - } - catch (ThreadAbortException) - { - - } + // Seems kind of redundant to start a thread and then join it, however.. We need to protect against + // A thread abort exception in the simulator code. + testThread.Start(); + testThread.Join(); + Assert.That(testClass.results.Result, Is.EqualTo(true), testClass.results.Message); // Console.WriteLine("Beginning test {0}", MethodBase.GetCurrentMethod()); } diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 254d5785fc..6f37347781 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -842,17 +842,23 @@ namespace OpenSim.Region.Physics.OdePlugin mesh.getIndexListAsPtrToIntArray(out indices, out triStride, out indexCount); // Also fixed, needs release after usage mesh.releaseSourceMeshData(); // free up the original mesh data to save memory - if (m_MeshToTriMeshMap.ContainsKey(mesh)) - { - _triMeshData = m_MeshToTriMeshMap[mesh]; - } - else - { - _triMeshData = d.GeomTriMeshDataCreate(); - d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride); - d.GeomTriMeshDataPreprocess(_triMeshData); - m_MeshToTriMeshMap[mesh] = _triMeshData; + // We must lock here since m_MeshToTriMeshMap is static and multiple scene threads may call this method at + // the same time. + lock (m_MeshToTriMeshMap) + { + if (m_MeshToTriMeshMap.ContainsKey(mesh)) + { + _triMeshData = m_MeshToTriMeshMap[mesh]; + } + else + { + _triMeshData = d.GeomTriMeshDataCreate(); + + d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride); + d.GeomTriMeshDataPreprocess(_triMeshData); + m_MeshToTriMeshMap[mesh] = _triMeshData; + } } // _parent_scene.waitForSpaceUnlock(m_targetSpace); diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index eb10975658..1e0f01f73a 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -469,16 +469,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine // sb.AppendFormat("Assemblies loaded : {0}\n", m_Assemblies.Count); SensorRepeat sr = AsyncCommandManager.GetSensorRepeatPlugin(this); - sb.AppendFormat("Sensors : {0}\n", sr.SensorsCount); + sb.AppendFormat("Sensors : {0}\n", sr != null ? sr.SensorsCount : 0); Dataserver ds = AsyncCommandManager.GetDataserverPlugin(this); - sb.AppendFormat("Dataserver requests : {0}\n", ds.DataserverRequestsCount); + sb.AppendFormat("Dataserver requests : {0}\n", ds != null ? ds.DataserverRequestsCount : 0); Timer t = AsyncCommandManager.GetTimerPlugin(this); - sb.AppendFormat("Timers : {0}\n", t.TimersCount); + sb.AppendFormat("Timers : {0}\n", t != null ? t.TimersCount : 0); Listener l = AsyncCommandManager.GetListenerPlugin(this); - sb.AppendFormat("Listeners : {0}\n", l.ListenerCount); + sb.AppendFormat("Listeners : {0}\n", l != null ? l.ListenerCount : 0); return sb.ToString(); } diff --git a/OpenSim/Services/AssetService/XAssetService.cs b/OpenSim/Services/AssetService/XAssetService.cs index d161c58005..05eb125ebc 100644 --- a/OpenSim/Services/AssetService/XAssetService.cs +++ b/OpenSim/Services/AssetService/XAssetService.cs @@ -42,7 +42,7 @@ namespace OpenSim.Services.AssetService /// This will be developed into a de-duplicating asset service. /// XXX: Currently it's a just a copy of the existing AssetService. so please don't attempt to use it. /// - public class XAssetService : AssetServiceBase, IAssetService + public class XAssetService : XAssetServiceBase, IAssetService { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Services/AssetService/XAssetServiceBase.cs b/OpenSim/Services/AssetService/XAssetServiceBase.cs new file mode 100644 index 0000000000..0c5c2c3d15 --- /dev/null +++ b/OpenSim/Services/AssetService/XAssetServiceBase.cs @@ -0,0 +1,94 @@ +/* + * 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.Reflection; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Data; +using OpenSim.Services.Interfaces; +using OpenSim.Services.Base; + +namespace OpenSim.Services.AssetService +{ + public class XAssetServiceBase : ServiceBase + { + protected IXAssetDataPlugin m_Database = null; + protected IAssetLoader m_AssetLoader = null; + + public XAssetServiceBase(IConfigSource config) : base(config) + { + string dllName = String.Empty; + string connString = String.Empty; + + // + // Try reading the [AssetService] section first, if it exists + // + IConfig assetConfig = config.Configs["AssetService"]; + if (assetConfig != null) + { + dllName = assetConfig.GetString("StorageProvider", dllName); + connString = assetConfig.GetString("ConnectionString", connString); + } + + // + // Try reading the [DatabaseService] section, if it exists + // + IConfig dbConfig = config.Configs["DatabaseService"]; + if (dbConfig != null) + { + if (dllName == String.Empty) + dllName = dbConfig.GetString("StorageProvider", String.Empty); + if (connString == String.Empty) + connString = dbConfig.GetString("ConnectionString", String.Empty); + } + + // + // We tried, but this doesn't exist. We can't proceed. + // + if (dllName.Equals(String.Empty)) + throw new Exception("No StorageProvider configured"); + + m_Database = LoadPlugin(dllName); + if (m_Database == null) + throw new Exception("Could not find a storage interface in the given module"); + + m_Database.Initialise(connString); + + string loaderName = assetConfig.GetString("DefaultAssetLoader", + String.Empty); + + if (loaderName != String.Empty) + { + m_AssetLoader = LoadPlugin(loaderName); + + if (m_AssetLoader == null) + throw new Exception("Asset loader could not be loaded"); + } + } + } +} \ No newline at end of file diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 9d0aeefb2b..95c2935357 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -540,7 +540,7 @@ namespace OpenSim.Services.UserAccountService else { m_log.DebugFormat( - "[USER ACCOUNT SERVICE]; Created user inventory for {0} {1}", firstName, lastName); + "[USER ACCOUNT SERVICE]: Created user inventory for {0} {1}", firstName, lastName); } if (m_CreateDefaultAvatarEntries) diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index d98c826c5e..db9f08b729 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -66,7 +66,6 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; * in turn, reads the asset loader and database connection information ; * [AssetService] - StorageProvider = "OpenSim.Data.MySQL.dll:MySQLAssetData" LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService" DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll" AssetLoaderArgs = "./assets/AssetSets.xml" diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index 691bfdc1e9..326caeb86d 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -58,7 +58,6 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; * in turn, reads the asset loader and database connection information ; * [AssetService] - StorageProvider = "OpenSim.Data.MySQL.dll:MySQLAssetData" LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService" DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll" AssetLoaderArgs = "./assets/AssetSets.xml" diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example index 4c734a1ab4..3dfbed7fdc 100644 --- a/bin/config-include/StandaloneCommon.ini.example +++ b/bin/config-include/StandaloneCommon.ini.example @@ -44,7 +44,6 @@ ;AuthorizationServices = "LocalAuthorizationServicesConnector" [AssetService] - StorageProvider = "OpenSim.Data.MySQL.dll:MySQLAssetData" DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll" AssetLoaderArgs = "assets/AssetSets.xml" @@ -241,4 +240,4 @@ ; DisallowForeigners -- HG visitors not allowed ; DisallowResidents -- only Admins and Managers allowed ; Example: - ; Region_Test_1 = "DisallowForeigners" \ No newline at end of file + ; Region_Test_1 = "DisallowForeigners" diff --git a/bin/shutdown_commands.txt b/bin/shutdown_commands.txt deleted file mode 100644 index 4397749d23..0000000000 --- a/bin/shutdown_commands.txt +++ /dev/null @@ -1,3 +0,0 @@ -; You can place simulator console commands here to execute when the simulator is shut down -; e.g. show stats -; Lines starting with ; are comments diff --git a/bin/shutdown_commands.txt.example b/bin/shutdown_commands.txt.example new file mode 100644 index 0000000000..dc07dc93db --- /dev/null +++ b/bin/shutdown_commands.txt.example @@ -0,0 +1,3 @@ +; Copy this file to shutdown_commands.txt to execute region console commands when the simulator is asked to shut down +; e.g. show stats +; Lines that start with ; are comments diff --git a/bin/startup_commands.txt b/bin/startup_commands.txt deleted file mode 100644 index 1abfa64c87..0000000000 --- a/bin/startup_commands.txt +++ /dev/null @@ -1,3 +0,0 @@ -; You can place region console commands here to execute once the simulator has finished starting up -; e.g. show stats -; Lines start with ; are comments. diff --git a/bin/startup_commands.txt.example b/bin/startup_commands.txt.example new file mode 100644 index 0000000000..677109c5a2 --- /dev/null +++ b/bin/startup_commands.txt.example @@ -0,0 +1,3 @@ +; Copy this file to startup_commands.txt to run region console commands once the simulator has finished starting up +; e.g. show stats +; Lines that start with ; are comments.