Don't block task queue for queued update task when there are longer running tasks executing

This commit is contained in:
Mark McDowall 2022-08-07 12:26:37 -07:00
parent 762042ba97
commit 1f14276770
5 changed files with 20 additions and 2 deletions

View File

@ -5,5 +5,7 @@ namespace NzbDrone.Core.Download
public class ProcessMonitoredDownloadsCommand : Command public class ProcessMonitoredDownloadsCommand : Command
{ {
public override bool RequiresDiskAccess => true; public override bool RequiresDiskAccess => true;
public override bool IsLongRunning => true;
} }
} }

View File

@ -1,9 +1,11 @@
using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Commands;
namespace NzbDrone.Core.Indexers namespace NzbDrone.Core.Indexers
{ {
public class RssSyncCommand : Command public class RssSyncCommand : Command
{ {
public override bool SendUpdatesToClient => true; public override bool SendUpdatesToClient => true;
public override bool IsLongRunning => true;
} }
} }

View File

@ -26,6 +26,7 @@ namespace NzbDrone.Core.Messaging.Commands
public virtual string CompletionMessage => "Completed"; public virtual string CompletionMessage => "Completed";
public virtual bool RequiresDiskAccess => false; public virtual bool RequiresDiskAccess => false;
public virtual bool IsExclusive => false; public virtual bool IsExclusive => false;
public virtual bool IsLongRunning => false;
public string Name { get; private set; } public string Name { get; private set; }
public DateTime? LastExecutionTime { get; set; } public DateTime? LastExecutionTime { get; set; }

View File

@ -164,13 +164,24 @@ namespace NzbDrone.Core.Messaging.Commands
{ {
// If an executing command requires disk access don't return a command that // If an executing command requires disk access don't return a command that
// requires disk access. A lower priority or later queued task could be returned // requires disk access. A lower priority or later queued task could be returned
// instead, but that will allow other tasks to execute whiule waiting for disk access. // instead, but that will allow other tasks to execute while waiting for disk access.
if (startedCommands.Any(x => x.Body.RequiresDiskAccess)) if (startedCommands.Any(x => x.Body.RequiresDiskAccess))
{ {
return c.Status == CommandStatus.Queued && return c.Status == CommandStatus.Queued &&
!c.Body.RequiresDiskAccess; !c.Body.RequiresDiskAccess;
} }
// If an executing command is long running then skip any exclusive commands until
// they complete. A lower priority or later queued task could be returned
// instead, but that will allow other tasks to execute while waiting for exclusive
// execution.
if (startedCommands.Any(x => x.Body.IsLongRunning))
{
return c.Status == CommandStatus.Queued &&
!c.Body.IsExclusive;
}
return c.Status == CommandStatus.Queued; return c.Status == CommandStatus.Queued;
}) })
.OrderByDescending(c => c.Priority) .OrderByDescending(c => c.Priority)

View File

@ -20,5 +20,7 @@ namespace NzbDrone.Core.Tv.Commands
public override bool SendUpdatesToClient => true; public override bool SendUpdatesToClient => true;
public override bool UpdateScheduledTask => !SeriesId.HasValue; public override bool UpdateScheduledTask => !SeriesId.HasValue;
public override bool IsLongRunning => true;
} }
} }