diff --git a/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs b/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs index 069b272959..cce77f0dc3 100644 --- a/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs +++ b/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs @@ -174,6 +174,11 @@ namespace Tgstation.Server.Host.Controllers if (model.Port.HasValue && model.Port.Value != current.Port!.Value) { + Logger.LogTrace( + "Triggering port allocator for DD-I:{instanceId} because model port {modelPort} doesn't match DB port {dbPort}...", + Instance.Id, + model.Port, + current.Port); var verifiedPort = await portAllocator .GetAvailablePort( model.Port.Value, diff --git a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs index 419bc9c90d..8b4cfce563 100644 --- a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs +++ b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs @@ -175,6 +175,7 @@ namespace Tgstation.Server.Host.Controllers [ProducesResponseType(typeof(DreamMakerResponse), 200)] [ProducesResponseType(204)] [ProducesResponseType(typeof(ErrorMessageResponse), 410)] +#pragma warning disable CA1506 // TODO: Decomplexify public async ValueTask Update([FromBody] DreamMakerRequest model, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(model); @@ -208,6 +209,11 @@ namespace Tgstation.Server.Host.Controllers if (model.ApiValidationPort.Value != hostModel.ApiValidationPort!.Value) { + Logger.LogTrace( + "Triggering port allocator for DM-I:{instanceId} because model port {modelPort} doesn't match DB port {dbPort}...", + Instance.Id, + model.ApiValidationPort, + hostModel.ApiValidationPort); var verifiedPort = await portAllocator .GetAvailablePort( model.ApiValidationPort.Value, @@ -248,6 +254,7 @@ namespace Tgstation.Server.Host.Controllers return await Read(cancellationToken); } +#pragma warning restore CA1506 /// /// Base query for pulling in all required fields. diff --git a/tests/Tgstation.Server.Tests/Live/Instance/DeploymentTest.cs b/tests/Tgstation.Server.Tests/Live/Instance/DeploymentTest.cs index 0cd00f5330..28485a7732 100644 --- a/tests/Tgstation.Server.Tests/Live/Instance/DeploymentTest.cs +++ b/tests/Tgstation.Server.Tests/Live/Instance/DeploymentTest.cs @@ -118,6 +118,7 @@ namespace Tgstation.Server.Tests.Live.Instance { Assert.IsNotNull(vpTest); // by alphabetization rules, it should discover api_free here + Console.WriteLine($"PORT REUSE BUG 5: Setting I-{instanceClient.Metadata.Id} DM to {dmPort}"); if (!new PlatformIdentifier().IsWindows) { var updatedDM = await dreamMakerClient.Update(new DreamMakerRequest @@ -137,6 +138,7 @@ namespace Tgstation.Server.Tests.Live.Instance Assert.AreEqual(dmPort, updatedDM.ApiValidationPort); } + Console.WriteLine($"PORT REUSE BUG 1: Setting I-{instanceClient.Metadata.Id} DD to {ddPort}"); var updatedDD = await dreamDaemonClient.Update(new DreamDaemonRequest { StartupTimeout = 60, @@ -157,10 +159,12 @@ namespace Tgstation.Server.Tests.Live.Instance await CheckDreamDaemonPriority(deploymentJobWaitTask, cancellationToken); + Console.WriteLine($"PORT REUSE BUG 2: Expect Conflict, Setting I-{instanceClient.Metadata.Id} DD to {dmPort}"); var t1 = ApiAssert.ThrowsException(() => dreamDaemonClient.Update(new DreamDaemonRequest { Port = dmPort, }, cancellationToken), ErrorCode.PortNotAvailable); + Console.WriteLine($"PORT REUSE BUG 3: Expect Conflict, Setting I-{instanceClient.Metadata.Id} DM to {ddPort}"); var t2 = ApiAssert.ThrowsException(() => dreamMakerClient.Update(new DreamMakerRequest { ApiValidationPort = ddPort diff --git a/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs b/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs index 571e3d88c7..a37ceb26e1 100644 --- a/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs +++ b/tests/Tgstation.Server.Tests/Live/Instance/InstanceTest.cs @@ -164,6 +164,7 @@ namespace Tgstation.Server.Tests.Live.Instance for (var i = 0; i < 10; ++i) try { + global::System.Console.WriteLine($"PORT REUSE BUG 6: Setting I-{instanceClient.Metadata.Id} DM to {dmPort}"); await instanceClient.DreamMaker.Update(new DreamMakerRequest { ApiValidationPort = dmPort, diff --git a/tests/Tgstation.Server.Tests/Live/Instance/WatchdogTest.cs b/tests/Tgstation.Server.Tests/Live/Instance/WatchdogTest.cs index 5b18b2417e..ceb8e80fe7 100644 --- a/tests/Tgstation.Server.Tests/Live/Instance/WatchdogTest.cs +++ b/tests/Tgstation.Server.Tests/Live/Instance/WatchdogTest.cs @@ -135,6 +135,7 @@ namespace Tgstation.Server.Tests.Live.Instance try { // Increase startup timeout, disable heartbeats, enable map threads because we've tested without for years + global::System.Console.WriteLine($"PORT REUSE BUG 4: Setting I-{instanceClient.Metadata.Id} DD to {ddPort}"); await instanceClient.DreamDaemon.Update(new DreamDaemonRequest { StartupTimeout = 60, @@ -155,6 +156,7 @@ namespace Tgstation.Server.Tests.Live.Instance } } + global::System.Console.WriteLine($"PORT REUSE BUG 4: Expect error. Setting I-{instanceClient.Metadata.Id} DD to 0"); await Task.WhenAll( UpdateDDSettings(), CheckByondVersions(),