From ce6764cbf890a1b128436c9547ab17919c3c6ef2 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Sat, 3 Sep 2022 17:57:09 +0200 Subject: [PATCH] add some locking around modifiedfiles --- MareSynchronos/Managers/FileCacheManager.cs | 21 ++++++++++++++----- .../WebAPI/ApIController.Functions.Files.cs | 8 +++++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/MareSynchronos/Managers/FileCacheManager.cs b/MareSynchronos/Managers/FileCacheManager.cs index d415e3c..1ce838e 100644 --- a/MareSynchronos/Managers/FileCacheManager.cs +++ b/MareSynchronos/Managers/FileCacheManager.cs @@ -23,6 +23,7 @@ namespace MareSynchronos.Managers private readonly CancellationTokenSource _rescanTaskCancellationTokenSource = new(); private CancellationTokenSource _rescanTaskRunCancellationTokenSource = new(); private CancellationTokenSource? _scanCancellationTokenSource; + private object modifiedFilesLock = new object(); public FileCacheManager(IpcManager ipcManager, Configuration pluginConfiguration) { Logger.Verbose("Creating " + nameof(FileCacheManager)); @@ -142,7 +143,10 @@ namespace MareSynchronos.Managers private void OnModified(object sender, FileSystemEventArgs e) { - _modifiedFiles.Add(e.FullPath); + lock (modifiedFilesLock) + { + _modifiedFiles.Add(e.FullPath); + } _ = StartRescan(); } @@ -189,14 +193,21 @@ namespace MareSynchronos.Managers Logger.Debug("File changes detected"); - if (!_modifiedFiles.Any()) return; + lock (modifiedFilesLock) + { + if (!_modifiedFiles.Any()) return; + } _rescanTask = Task.Run(async () => { - var listCopy = _modifiedFiles.ToList(); - _modifiedFiles.Clear(); + List modifiedFilesCopy = new List(); + lock (modifiedFilesLock) + { + modifiedFilesCopy = _modifiedFiles.ToList(); + _modifiedFiles.Clear(); + } await using var db = new FileCacheContext(); - foreach (var item in listCopy.Distinct()) + foreach (var item in modifiedFilesCopy.Distinct()) { var fi = new FileInfo(item); if (!fi.Exists) diff --git a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs index 2c224be..e927e3f 100644 --- a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs +++ b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs @@ -123,9 +123,13 @@ namespace MareSynchronos.WebAPI { await using (var db = new FileCacheContext()) { - allFilesInDb = CurrentDownloads[currentDownloadId] + var fileCount = CurrentDownloads[currentDownloadId] .Where(c => c.CanBeTransferred) - .All(h => db.FileCaches.Any(f => f.Hash == h.Hash)); + .Count(h => db.FileCaches.Any(f => f.Hash == h.Hash)); + var totalFiles = CurrentDownloads[currentDownloadId].Count(c => c.CanBeTransferred); + Logger.Debug("Waiting for files to be in the DB, added " + fileCount + " of " + totalFiles); + + allFilesInDb = fileCount == totalFiles; } await Task.Delay(250, ct);