From 4ad3195ffacdf8b8a7e9f0a237f6fed207eb2e50 Mon Sep 17 00:00:00 2001 From: Jordan Dominion Date: Wed, 31 Jul 2024 17:55:11 -0400 Subject: [PATCH] Fix the issue where you can't detach an instance due to database conflicts --- .../Controllers/InstanceController.cs | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Tgstation.Server.Host/Controllers/InstanceController.cs b/src/Tgstation.Server.Host/Controllers/InstanceController.cs index b56d5a9a7a..dbcb03b70b 100644 --- a/src/Tgstation.Server.Host/Controllers/InstanceController.cs +++ b/src/Tgstation.Server.Host/Controllers/InstanceController.cs @@ -285,8 +285,6 @@ namespace Tgstation.Server.Host.Controllers if (originalModel.Online!.Value) return Conflict(new ErrorMessageResponse(ErrorCode.InstanceDetachOnline)); - DatabaseContext.Instances.Remove(originalModel); - var originalPath = originalModel.Path!; var attachFileName = ioManager.ConcatPath(originalPath, InstanceAttachFileName); try @@ -301,7 +299,35 @@ namespace Tgstation.Server.Host.Controllers throw; } - await DatabaseContext.Save(cancellationToken); // cascades everything + try + { + // yes this is racy af. I hate it + // there's a bug where removing the root instance doesn't work sometimes + await DatabaseContext + .CompileJobs + .AsQueryable() + .Where(x => x.Job!.Instance!.Id == id) + .ExecuteDeleteAsync(cancellationToken); + await DatabaseContext + .RevInfoTestMerges + .AsQueryable() + .Where(x => x.RevisionInformation.InstanceId == id) + .ExecuteDeleteAsync(cancellationToken); + await DatabaseContext + .RevisionInformations + .AsQueryable() + .Where(x => x.InstanceId == id) + .ExecuteDeleteAsync(cancellationToken); + + DatabaseContext.Instances.Remove(originalModel); + await DatabaseContext.Save(cancellationToken); // cascades everything else + } + catch + { + await ioManager.DeleteFile(attachFileName, CancellationToken.None); // DCT: Shouldn't be cancelled + throw; + } + return NoContent(); }