New: Cancel tasks in command queue

pull/481/head
Qstick 6 years ago
parent 61387b3d44
commit 9d2fbddc7d

@ -176,6 +176,7 @@ export const actionHandlers = handleThunks({
} }
}); });
dispatch(updateItem({ section: 'commands', ...payload }));
scheduleRemoveCommand(payload, dispatch); scheduleRemoveCommand(payload, dispatch);
showCommandMessage(payload, dispatch); showCommandMessage(payload, dispatch);
} }

@ -6,7 +6,8 @@ function createCommandExecutingSelector(name, contraints = {}) {
return createSelector( return createSelector(
createCommandsSelector(), createCommandsSelector(),
(commands) => { (commands) => {
return isCommandExecuting(findCommand(commands, { name, ...contraints })); const command = findCommand(commands, { name, ...contraints });
return isCommandExecuting(command);
} }
); );
} }

@ -68,8 +68,7 @@ namespace Lidarr.Api.V1.Commands
private void CancelCommand(int id) private void CancelCommand(int id)
{ {
// TODO: Cancel the existing command _commandQueueManager.Cancel(id);
// Executing tasks should preferably exit gracefully
} }
public void Handle(CommandUpdatedEvent message) public void Handle(CommandUpdatedEvent message)

@ -71,6 +71,24 @@ namespace NzbDrone.Core.Messaging.Commands
} }
} }
public bool RemoveIfQueued(int id)
{
var rval = false;
lock (_mutex)
{
var command = _items.FirstOrDefault(q => q.Id == id);
if (command?.Status == CommandStatus.Queued)
{
_items.Remove(command);
rval = true;
}
}
return rval;
}
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)

@ -1,12 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net;
using System.Threading; using System.Threading;
using NLog; using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Common.EnsureThat; using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Lifecycle;
using NzbDrone.Core.Exceptions;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
namespace NzbDrone.Core.Messaging.Commands namespace NzbDrone.Core.Messaging.Commands
@ -25,6 +27,7 @@ namespace NzbDrone.Core.Messaging.Commands
void Complete(CommandModel command, string message); void Complete(CommandModel command, string message);
void Fail(CommandModel command, string message, Exception e); void Fail(CommandModel command, string message, Exception e);
void Requeue(); void Requeue();
void Cancel(int id);
void CleanCommands(); void CleanCommands();
} }
@ -193,6 +196,14 @@ namespace NzbDrone.Core.Messaging.Commands
} }
} }
public void Cancel(int id)
{
if (!_commandQueue.RemoveIfQueued(id))
{
throw new NzbDroneClientException(HttpStatusCode.Conflict, "Unable to cancel task");
}
}
public void CleanCommands() public void CleanCommands()
{ {
_logger.Trace("Cleaning up old commands"); _logger.Trace("Cleaning up old commands");

Loading…
Cancel
Save