diff --git a/src/Tgstation.Server.Host/Swarm/SwarmService.cs b/src/Tgstation.Server.Host/Swarm/SwarmService.cs index ed94445764..1b11dd58b1 100644 --- a/src/Tgstation.Server.Host/Swarm/SwarmService.cs +++ b/src/Tgstation.Server.Host/Swarm/SwarmService.cs @@ -535,6 +535,11 @@ namespace Tgstation.Server.Host.Swarm return false; } } + else + { + logger.LogTrace("No need to re-initiate update as it originated here on the swarm controller"); + updateCommitTcs = new TaskCompletionSource(); + } logger.LogDebug("Prepared for update to version {0}", version); } diff --git a/tests/Tgstation.Server.Tests/IntegrationTest.cs b/tests/Tgstation.Server.Tests/IntegrationTest.cs index 83b09adc0f..51e2b04f6b 100644 --- a/tests/Tgstation.Server.Tests/IntegrationTest.cs +++ b/tests/Tgstation.Server.Tests/IntegrationTest.cs @@ -276,11 +276,36 @@ namespace Tgstation.Server.Tests var updatedAssemblyVersion = FileVersionInfo.GetVersionInfo(updatedAssemblyPath); Assert.AreEqual(testUpdateVersion, Version.Parse(updatedAssemblyVersion.FileVersion).Semver()); + Directory.Delete(server.UpdatePath, true); } CheckServerUpdated(controller); CheckServerUpdated(node1); CheckServerUpdated(node2); + + // regression: test it also works from the controller + serverTask = Task.WhenAll( + node1.Run(cancellationToken), + node2.Run(cancellationToken), + controller.Run(cancellationToken)); + + using var controllerClient2 = await CreateAdminClient(controller.Url, cancellationToken); + using var node1Client2 = await CreateAdminClient(node1.Url, cancellationToken); + using var node2Client2 = await CreateAdminClient(node2.Url, cancellationToken); + + await controllerClient2.Administration.Update( + new Administration + { + NewVersion = testUpdateVersion + }, + cancellationToken); + + await Task.WhenAny(Task.Delay(TimeSpan.FromMinutes(2)), serverTask); + Assert.IsTrue(serverTask.IsCompleted); + + CheckServerUpdated(controller); + CheckServerUpdated(node1); + CheckServerUpdated(node2); } finally {