From 41f10d098e2bc56fb99341d17fbd3dc420cbb8f3 Mon Sep 17 00:00:00 2001 From: Qstick Date: Tue, 29 Nov 2022 21:44:03 -0600 Subject: [PATCH] Don't block task queue for queued update task when there are longer running tasks Fixes #7538 Co-Authored-By: Mark McDowall --- .../Download/ProcessMonitoredDownloadsCommand.cs | 2 ++ src/NzbDrone.Core/Indexers/RssSyncCommand.cs | 4 +++- src/NzbDrone.Core/Messaging/Commands/Command.cs | 1 + src/NzbDrone.Core/Messaging/Commands/CommandQueue.cs | 5 +++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/ProcessMonitoredDownloadsCommand.cs b/src/NzbDrone.Core/Download/ProcessMonitoredDownloadsCommand.cs index c3c934031c..4b39f1347f 100644 --- a/src/NzbDrone.Core/Download/ProcessMonitoredDownloadsCommand.cs +++ b/src/NzbDrone.Core/Download/ProcessMonitoredDownloadsCommand.cs @@ -5,5 +5,7 @@ namespace NzbDrone.Core.Download public class ProcessMonitoredDownloadsCommand : Command { public override bool RequiresDiskAccess => true; + + public override bool IsLongRunning => true; } } diff --git a/src/NzbDrone.Core/Indexers/RssSyncCommand.cs b/src/NzbDrone.Core/Indexers/RssSyncCommand.cs index 47b9cca67f..4722b32f2d 100644 --- a/src/NzbDrone.Core/Indexers/RssSyncCommand.cs +++ b/src/NzbDrone.Core/Indexers/RssSyncCommand.cs @@ -1,9 +1,11 @@ -using NzbDrone.Core.Messaging.Commands; +using NzbDrone.Core.Messaging.Commands; namespace NzbDrone.Core.Indexers { public class RssSyncCommand : Command { public override bool SendUpdatesToClient => true; + + public override bool IsLongRunning => true; } } diff --git a/src/NzbDrone.Core/Messaging/Commands/Command.cs b/src/NzbDrone.Core/Messaging/Commands/Command.cs index 020b5ec64b..057c8d4c43 100644 --- a/src/NzbDrone.Core/Messaging/Commands/Command.cs +++ b/src/NzbDrone.Core/Messaging/Commands/Command.cs @@ -27,6 +27,7 @@ public virtual bool SendUpdatesToClient public virtual bool RequiresDiskAccess => false; public virtual bool IsExclusive => false; public virtual bool IsTypeExclusive => false; + public virtual bool IsLongRunning => false; public string Name { get; private set; } public DateTime? LastExecutionTime { get; set; } diff --git a/src/NzbDrone.Core/Messaging/Commands/CommandQueue.cs b/src/NzbDrone.Core/Messaging/Commands/CommandQueue.cs index 7c34757575..03efc56277 100644 --- a/src/NzbDrone.Core/Messaging/Commands/CommandQueue.cs +++ b/src/NzbDrone.Core/Messaging/Commands/CommandQueue.cs @@ -176,6 +176,11 @@ public bool TryGet(out CommandModel item) queuedCommands = queuedCommands.Where(c => !exclusiveTypes.Any(x => x == c.Body.Name)); } + if (startedCommands.Any(x => x.Body.IsLongRunning)) + { + queuedCommands = queuedCommands.Where(c => !c.Body.IsExclusive); + } + var localItem = queuedCommands.OrderByDescending(c => c.Priority) .ThenBy(c => c.QueuedAt) .FirstOrDefault();