From f8f6ca2c0dd5fad4c60e33ea12ec911f20eaad0a Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sun, 23 Jun 2024 16:13:30 -0500 Subject: [PATCH] Reduce possibility of race condition reading updated config --- Application/ApplicationManager.cs | 7 ++++++- Application/IO/ConfigurationWatcher.cs | 23 ++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Application/ApplicationManager.cs b/Application/ApplicationManager.cs index 4dfda257..718b8db9 100644 --- a/Application/ApplicationManager.cs +++ b/Application/ApplicationManager.cs @@ -26,6 +26,7 @@ using Data.Abstractions; using Data.Context; using Data.Models; using IW4MAdmin.Application.Configuration; +using IW4MAdmin.Application.IO; using IW4MAdmin.Application.Migration; using IW4MAdmin.Application.Plugin.Script; using Microsoft.Extensions.DependencyInjection; @@ -68,6 +69,7 @@ namespace IW4MAdmin.Application private readonly ClientService ClientSvc; readonly PenaltyService PenaltySvc; private readonly IAlertManager _alertManager; + private readonly ConfigurationWatcher _watcher; public IConfigurationHandler ConfigHandler; readonly IPageList PageList; private readonly TimeSpan _throttleTimeout = new TimeSpan(0, 1, 0); @@ -94,7 +96,8 @@ namespace IW4MAdmin.Application IEnumerable plugins, IParserRegexFactory parserRegexFactory, IEnumerable customParserEvents, ICoreEventHandler coreEventHandler, IScriptCommandFactory scriptCommandFactory, IDatabaseContextFactory contextFactory, IMetaRegistration metaRegistration, IScriptPluginServiceResolver scriptPluginServiceResolver, ClientService clientService, IServiceProvider serviceProvider, - ChangeHistoryService changeHistoryService, ApplicationConfiguration appConfig, PenaltyService penaltyService, IAlertManager alertManager, IInteractionRegistration interactionRegistration, IEnumerable v2PLugins) + ChangeHistoryService changeHistoryService, ApplicationConfiguration appConfig, PenaltyService penaltyService, IAlertManager alertManager, IInteractionRegistration interactionRegistration, IEnumerable v2PLugins, + ConfigurationWatcher watcher) { MiddlewareActionHandler = actionHandler; _servers = new ConcurrentBag(); @@ -102,6 +105,7 @@ namespace IW4MAdmin.Application ClientSvc = clientService; PenaltySvc = penaltyService; _alertManager = alertManager; + _watcher = watcher; ConfigHandler = appConfigHandler; StartTime = DateTime.UtcNow; PageList = new PageList(); @@ -529,6 +533,7 @@ namespace IW4MAdmin.Application Console.WriteLine(_translationLookup["MANAGER_COMMUNICATION_INFO"]); await InitializeServers(); + _watcher.Enable(); IsInitialized = true; } diff --git a/Application/IO/ConfigurationWatcher.cs b/Application/IO/ConfigurationWatcher.cs index 979b7e60..8df130de 100644 --- a/Application/IO/ConfigurationWatcher.cs +++ b/Application/IO/ConfigurationWatcher.cs @@ -20,7 +20,6 @@ public sealed class ConfigurationWatcher : IDisposable }; _watcher.Changed += WatcherOnChanged; - _watcher.EnableRaisingEvents = true; } public void Dispose() @@ -31,30 +30,28 @@ public sealed class ConfigurationWatcher : IDisposable public void Register(string fileName, Action fileUpdated) { - if (_registeredActions.ContainsKey(fileName)) - { - return; - } - - _registeredActions.Add(fileName, fileUpdated); + _registeredActions.TryAdd(fileName, fileUpdated); } public void Unregister(string fileName) { - if (_registeredActions.ContainsKey(fileName)) - { - _registeredActions.Remove(fileName); - } + _registeredActions.Remove(fileName); + } + + public void Enable() + { + _watcher.EnableRaisingEvents = true; } private void WatcherOnChanged(object sender, FileSystemEventArgs eventArgs) { - if (!_registeredActions.ContainsKey(eventArgs.FullPath) || eventArgs.ChangeType != WatcherChangeTypes.Changed || + if (!_registeredActions.TryGetValue(eventArgs.FullPath, out var value) || + eventArgs.ChangeType != WatcherChangeTypes.Changed || new FileInfo(eventArgs.FullPath).Length == 0) { return; } - _registeredActions[eventArgs.FullPath].Invoke(eventArgs.FullPath); + value.Invoke(eventArgs.FullPath); } }