mirror of
https://github.com/lidarr/Lidarr
synced 2025-02-24 06:50:43 +00:00
Don't block task queue for queued update task when long running tasks queued
Fixes #2935 Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
This commit is contained in:
parent
5a8082de2d
commit
93cce9a02e
5 changed files with 45 additions and 5 deletions
|
@ -3,6 +3,7 @@
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
using NzbDrone.Core.ImportLists;
|
using NzbDrone.Core.ImportLists;
|
||||||
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Messaging.Commands;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Core.Music.Commands;
|
using NzbDrone.Core.Music.Commands;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
@ -25,6 +26,18 @@ private void GivenStartedDiskCommand()
|
||||||
Subject.Add(commandModel);
|
Subject.Add(commandModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GivenLongRunningCommand()
|
||||||
|
{
|
||||||
|
var commandModel = Builder<CommandModel>
|
||||||
|
.CreateNew()
|
||||||
|
.With(c => c.Name = "RssSync")
|
||||||
|
.With(c => c.Body = new RssSyncCommand())
|
||||||
|
.With(c => c.Status = CommandStatus.Started)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
Subject.Add(commandModel);
|
||||||
|
}
|
||||||
|
|
||||||
private void GivenStartedTypeExclusiveCommand()
|
private void GivenStartedTypeExclusiveCommand()
|
||||||
{
|
{
|
||||||
var commandModel = Builder<CommandModel>
|
var commandModel = Builder<CommandModel>
|
||||||
|
@ -85,6 +98,24 @@ public void should_not_return_type_exclusive_command_if_another_running()
|
||||||
command.Should().BeNull();
|
command.Should().BeNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_return_exclusive_command_if_long_running_command_running()
|
||||||
|
{
|
||||||
|
GivenLongRunningCommand();
|
||||||
|
|
||||||
|
var newCommandModel = Builder<CommandModel>
|
||||||
|
.CreateNew()
|
||||||
|
.With(c => c.Name = "ApplicationUpdate")
|
||||||
|
.With(c => c.Body = new ApplicationUpdateCommand())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
Subject.Add(newCommandModel);
|
||||||
|
|
||||||
|
Subject.TryGet(out var command);
|
||||||
|
|
||||||
|
command.Should().BeNull();
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_not_return_type_exclusive_command_if_another_and_disk_access_command_running()
|
public void should_not_return_type_exclusive_command_if_another_and_disk_access_command_running()
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,5 +5,7 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ public virtual bool SendUpdatesToClient
|
||||||
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 IsTypeExclusive => false;
|
public virtual bool IsTypeExclusive => 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; }
|
||||||
|
|
|
@ -98,7 +98,7 @@ public bool RemoveIfQueued(int id)
|
||||||
public List<CommandModel> QueuedOrStarted()
|
public List<CommandModel> QueuedOrStarted()
|
||||||
{
|
{
|
||||||
return All().Where(q => q.Status == CommandStatus.Queued || q.Status == CommandStatus.Started)
|
return All().Where(q => q.Status == CommandStatus.Queued || q.Status == CommandStatus.Started)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<CommandModel> GetConsumingEnumerable()
|
public IEnumerable<CommandModel> GetConsumingEnumerable()
|
||||||
|
@ -158,7 +158,7 @@ public bool TryGet(out CommandModel item)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var startedCommands = _items.Where(c => c.Status == CommandStatus.Started)
|
var startedCommands = _items.Where(c => c.Status == CommandStatus.Started)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var exclusiveTypes = startedCommands.Where(x => x.Body.IsTypeExclusive)
|
var exclusiveTypes = startedCommands.Where(x => x.Body.IsTypeExclusive)
|
||||||
.Select(x => x.Body.Name)
|
.Select(x => x.Body.Name)
|
||||||
|
@ -176,9 +176,14 @@ public bool TryGet(out CommandModel item)
|
||||||
queuedCommands = queuedCommands.Where(c => !exclusiveTypes.Any(x => x == c.Body.Name));
|
queuedCommands = queuedCommands.Where(c => !exclusiveTypes.Any(x => x == c.Body.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (startedCommands.Any(x => x.Body.IsLongRunning))
|
||||||
|
{
|
||||||
|
queuedCommands = queuedCommands.Where(c => c.Status == CommandStatus.Queued && !c.Body.IsExclusive);
|
||||||
|
}
|
||||||
|
|
||||||
var localItem = queuedCommands.OrderByDescending(c => c.Priority)
|
var localItem = queuedCommands.OrderByDescending(c => c.Priority)
|
||||||
.ThenBy(c => c.QueuedAt)
|
.ThenBy(c => c.QueuedAt)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
|
|
||||||
// Nothing queued that meets the requirements
|
// Nothing queued that meets the requirements
|
||||||
if (localItem == null)
|
if (localItem == null)
|
||||||
|
|
Loading…
Reference in a new issue