From 248c0e18de1a95120e1f1700345ae8ba03624447 Mon Sep 17 00:00:00 2001 From: AliciaRaven Date: Mon, 13 Jul 2015 12:21:10 +0100 Subject: Prevent multiple instances of the FSAssets service causing problems. Protect against secondary instances registering duplicate console commands Also prevents multiple instances each starting a writer thread which will cause major file access exceptions as they fight over the contents of the spool directory. Signed-off-by: Melanie Thielker --- OpenSim/Services/FSAssetService/FSAssetService.cs | 79 +++++++++++++---------- 1 file changed, 46 insertions(+), 33 deletions(-) (limited to 'OpenSim/Services') diff --git a/OpenSim/Services/FSAssetService/FSAssetService.cs b/OpenSim/Services/FSAssetService/FSAssetService.cs index 8276f33..04f6d79 100644 --- a/OpenSim/Services/FSAssetService/FSAssetService.cs +++ b/OpenSim/Services/FSAssetService/FSAssetService.cs @@ -76,6 +76,9 @@ namespace OpenSim.Services.FSAssetService protected int m_missingAssetsFS = 0; protected string m_FSBase; + private static bool m_Initialized; + private bool m_MainInstance; + public FSAssetConnector(IConfigSource config) : this(config, "AssetService") { @@ -83,24 +86,30 @@ namespace OpenSim.Services.FSAssetService public FSAssetConnector(IConfigSource config, string configName) : base(config) { - MainConsole.Instance.Commands.AddCommand("fs", false, - "show assets", "show assets", "Show asset stats", - HandleShowAssets); - MainConsole.Instance.Commands.AddCommand("fs", false, - "show digest", "show digest ", "Show asset digest", - HandleShowDigest); - MainConsole.Instance.Commands.AddCommand("fs", false, - "delete asset", "delete asset ", - "Delete asset from database", - HandleDeleteAsset); - MainConsole.Instance.Commands.AddCommand("fs", false, - "import", "import [ ]", - "Import legacy assets", - HandleImportAssets); - MainConsole.Instance.Commands.AddCommand("fs", false, - "force import", "force import
[ ]", - "Import legacy assets, overwriting current content", - HandleImportAssets); + if (!m_Initialized) + { + m_Initialized = true; + m_MainInstance = true; + + MainConsole.Instance.Commands.AddCommand("fs", false, + "show assets", "show assets", "Show asset stats", + HandleShowAssets); + MainConsole.Instance.Commands.AddCommand("fs", false, + "show digest", "show digest ", "Show asset digest", + HandleShowDigest); + MainConsole.Instance.Commands.AddCommand("fs", false, + "delete asset", "delete asset ", + "Delete asset from database", + HandleDeleteAsset); + MainConsole.Instance.Commands.AddCommand("fs", false, + "import", "import
[ ]", + "Import legacy assets", + HandleImportAssets); + MainConsole.Instance.Commands.AddCommand("fs", false, + "force import", "force import
[ ]", + "Import legacy assets, overwriting current content", + HandleImportAssets); + } IConfig assetConfig = config.Configs[configName]; @@ -173,24 +182,28 @@ namespace OpenSim.Services.FSAssetService throw new Exception("Configuration error"); } - string loader = assetConfig.GetString("DefaultAssetLoader", string.Empty); - if (loader != string.Empty) + if (m_MainInstance) { - m_AssetLoader = LoadPlugin(loader); - string loaderArgs = assetConfig.GetString("AssetLoaderArgs", string.Empty); - m_log.InfoFormat("[FSASSETS]: Loading default asset set from {0}", loaderArgs); - m_AssetLoader.ForEachDefaultXmlAsset(loaderArgs, - delegate(AssetBase a) - { - Store(a, false); - }); + string loader = assetConfig.GetString("DefaultAssetLoader", string.Empty); + if (loader != string.Empty) + { + m_AssetLoader = LoadPlugin(loader); + string loaderArgs = assetConfig.GetString("AssetLoaderArgs", string.Empty); + m_log.InfoFormat("[FSASSETS]: Loading default asset set from {0}", loaderArgs); + m_AssetLoader.ForEachDefaultXmlAsset(loaderArgs, + delegate(AssetBase a) + { + Store(a, false); + }); + } + + m_WriterThread = new Thread(Writer); + m_WriterThread.Start(); + m_StatsThread = new Thread(Stats); + m_StatsThread.Start(); } + m_log.Info("[FSASSETS]: FS asset service enabled"); - - m_WriterThread = new Thread(Writer); - m_WriterThread.Start(); - m_StatsThread = new Thread(Stats); - m_StatsThread.Start(); } private void Stats() -- cgit v1.1