From c31a797bd87178f1e1ed12080e8c7bc0492052c0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 22 Aug 2023 06:03:14 +0300 Subject: [PATCH] Revert "Switch to Parallel.ForEach for list processing with MaxParallelism" This reverts commit ebb2b4eca30cac07f8808254ca5e0fafcc5e22b9. --- .../FetchAndParseImportListService.cs | 79 ++++++++++++------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs b/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs index ed3a2d300..b325fecf4 100644 --- a/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs +++ b/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NLog; +using NzbDrone.Common.TPL; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.ImportLists @@ -40,7 +41,10 @@ namespace NzbDrone.Core.ImportLists _logger.Debug("Available import lists {0}", importLists.Count); - Parallel.ForEach(importLists, new ParallelOptions { MaxDegreeOfParallelism = 5 }, importList => + var taskList = new List(); + var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); + + foreach (var importList in importLists) { var importListLocal = importList; var importListStatus = _importListStatusService.GetLastSyncListInfo(importListLocal.Definition.Id); @@ -52,28 +56,35 @@ namespace NzbDrone.Core.ImportLists if (DateTime.UtcNow < importListNextSync) { _logger.Trace("Skipping refresh of Import List {0} ({1}) due to minimum refresh interval. Next sync after {2}", importList.Name, importListLocal.Definition.Name, importListNextSync); - return; + continue; } } - try - { - var importListReports = importListLocal.Fetch(); + var task = taskFactory.StartNew(() => + { + try + { + var importListReports = importListLocal.Fetch(); - lock (result) - { - _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); + lock (result) + { + _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); - result.AddRange(importListReports); - } + result.AddRange(importListReports); + } - _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); - } - catch (Exception e) - { - _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); - } - }); + _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); + } + catch (Exception e) + { + _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); + } + }).LogExceptions(); + + taskList.Add(task); + } + + Task.WaitAll(taskList.ToArray()); result = result.DistinctBy(r => new { r.Author, r.Book }).ToList(); @@ -94,25 +105,35 @@ namespace NzbDrone.Core.ImportLists return result; } + var taskList = new List(); + var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); + var importListLocal = importList; - try + var task = taskFactory.StartNew(() => { - var importListReports = importListLocal.Fetch(); - - lock (result) + try { - _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); + var importListReports = importListLocal.Fetch(); + + lock (result) + { + _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); + + result.AddRange(importListReports); + } - result.AddRange(importListReports); + _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); + } + catch (Exception e) + { + _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); } + }).LogExceptions(); - _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); - } - catch (Exception e) - { - _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); - } + taskList.Add(task); + + Task.WaitAll(taskList.ToArray()); result = result.DistinctBy(r => new { r.Author, r.Book }).ToList();