From 66ee28d0a971331018c277e8cd013304ef080660 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Sun, 3 May 2020 18:48:20 +0200 Subject: [PATCH] Lock CommandQueueManager.PushMany too --- .../Messaging/Commands/CommandQueueManager.cs | 53 ++++++++++--------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/NzbDrone.Core/Messaging/Commands/CommandQueueManager.cs b/src/NzbDrone.Core/Messaging/Commands/CommandQueueManager.cs index 30ff4a9d7..c1e8631d1 100644 --- a/src/NzbDrone.Core/Messaging/Commands/CommandQueueManager.cs +++ b/src/NzbDrone.Core/Messaging/Commands/CommandQueueManager.cs @@ -54,39 +54,42 @@ namespace NzbDrone.Core.Messaging.Commands { _logger.Trace("Publishing {0} commands", commands.Count); - var commandModels = new List(); - var existingCommands = _commandQueue.QueuedOrStarted(); - - foreach (var command in commands) + lock (_commandQueue) { - var existing = existingCommands.SingleOrDefault(c => c.Name == command.Name && CommandEqualityComparer.Instance.Equals(c.Body, command)); + var commandModels = new List(); + var existingCommands = _commandQueue.QueuedOrStarted(); - if (existing != null) + foreach (var command in commands) { - continue; + var existing = existingCommands.FirstOrDefault(c => c.Name == command.Name && CommandEqualityComparer.Instance.Equals(c.Body, command)); + + if (existing != null) + { + continue; + } + + var commandModel = new CommandModel + { + Name = command.Name, + Body = command, + QueuedAt = DateTime.UtcNow, + Trigger = CommandTrigger.Unspecified, + Priority = CommandPriority.Normal, + Status = CommandStatus.Queued + }; + + commandModels.Add(commandModel); } - var commandModel = new CommandModel + _repo.InsertMany(commandModels); + + foreach (var commandModel in commandModels) { - Name = command.Name, - Body = command, - QueuedAt = DateTime.UtcNow, - Trigger = CommandTrigger.Unspecified, - Priority = CommandPriority.Normal, - Status = CommandStatus.Queued - }; + _commandQueue.Add(commandModel); + } - commandModels.Add(commandModel); + return commandModels; } - - _repo.InsertMany(commandModels); - - foreach (var commandModel in commandModels) - { - _commandQueue.Add(commandModel); - } - - return commandModels; } public CommandModel Push(TCommand command, CommandPriority priority = CommandPriority.Normal, CommandTrigger trigger = CommandTrigger.Unspecified) where TCommand : Command