diff --git a/src/Tgstation.Server.Host/Swarm/SwarmService.cs b/src/Tgstation.Server.Host/Swarm/SwarmService.cs index 2f18423c3b..539cb75477 100644 --- a/src/Tgstation.Server.Host/Swarm/SwarmService.cs +++ b/src/Tgstation.Server.Host/Swarm/SwarmService.cs @@ -775,9 +775,10 @@ namespace Tgstation.Server.Host.Swarm try { SwarmServerResponse sourceNode = null; + List currentNodes; lock (swarmServers) { - var currentNodes = swarmServers + currentNodes = swarmServers .Select(node => { if (node.Identifier == updateRequest.SourceNode) @@ -810,7 +811,7 @@ namespace Tgstation.Server.Host.Swarm if (!swarmController && initiator) { - var downloadTickets = CreateDownloadTickets(initiatorProvider); + var downloadTickets = CreateDownloadTickets(initiatorProvider, currentNodes); logger.LogInformation("Forwarding update request to swarm controller..."); using var httpClient = httpClientFactory.CreateClient(); @@ -963,7 +964,7 @@ namespace Tgstation.Server.Host.Swarm } var downloadTicketDictionary = weAreInitiator - ? CreateDownloadTickets(initiatorProvider) + ? CreateDownloadTickets(initiatorProvider, currentUpdateOperation.InvolvedServers) : updateRequest.DownloadTickets; var sourceNode = weAreInitiator @@ -1056,8 +1057,9 @@ namespace Tgstation.Server.Host.Swarm /// Create a for downloading the content of a given for the rest of the swarm nodes. /// /// The containing the server update package. + /// An of the involved . /// A new of unique s keyed by their . - Dictionary CreateDownloadTickets(ISeekableFileStreamProvider initiatorProvider) + Dictionary CreateDownloadTickets(ISeekableFileStreamProvider initiatorProvider, IReadOnlyCollection involvedServers) { var downloadProvider = new FileDownloadProvider( () => initiatorProvider.Disposed @@ -1067,21 +1069,17 @@ namespace Tgstation.Server.Host.Swarm "", false); - Dictionary downloadTickets; - lock (swarmServers) - { - logger.LogTrace("Creating download tickets..."); - downloadTickets = new Dictionary(swarmServers.Count - 1); - foreach (var node in swarmServers) - { - if (node.Identifier == swarmConfiguration.Identifier) - continue; + var serversRequiringTickets = involvedServers + .Where(node => node.Identifier != swarmConfiguration.Identifier) + .ToList(); - downloadTickets.Add( - node.Identifier, - transferService.CreateDownload(downloadProvider)); - } - } + logger.LogTrace("Creating {n} download tickets for other nodes...", serversRequiringTickets.Count); + + var downloadTickets = new Dictionary(serversRequiringTickets.Count); + foreach (var node in serversRequiringTickets) + downloadTickets.Add( + node.Identifier, + transferService.CreateDownload(downloadProvider)); return downloadTickets; }