Delete an instance's Game directory when moving it

This commit is contained in:
Dominion
2023-04-10 19:03:01 -04:00
parent d09b5c8d5e
commit 7de2b3b93b
3 changed files with 45 additions and 2 deletions
@@ -3,6 +3,7 @@
using Microsoft.Extensions.Hosting;
using Tgstation.Server.Host.Components.Interop.Bridge;
using Tgstation.Server.Host.IO;
namespace Tgstation.Server.Host.Components
{
@@ -18,5 +19,12 @@ namespace Tgstation.Server.Host.Components
/// <param name="metadata">The <see cref="Models.Instance"/>.</param>
/// <returns>A <see cref="Task{TResult}"/> resulting in a new <see cref="IInstance"/>.</returns>
Task<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata);
/// <summary>
/// Create an <see cref="IIOManager"/> that resolves to the "Game" directory of the <see cref="Models.Instance"/> defined by <paramref name="metadata"/>.
/// </summary>
/// <param name="metadata">The <see cref="Models.Instance"/>.</param>
/// <returns>The <see cref="IIOManager"/> for the instance's "Game" directory.</returns>
IIOManager CreateGameIOManager(Models.Instance metadata);
}
}
@@ -144,6 +144,13 @@ namespace Tgstation.Server.Host.Components
/// </summary>
readonly SessionConfiguration sessionConfiguration;
/// <summary>
/// Create the <see cref="IIOManager"/> pointing to the "Game" directory of a given <paramref name="instanceIOManager"/>.
/// </summary>
/// <param name="instanceIOManager">The instance's <see cref="IIOManager"/>.</param>
/// <returns>The <see cref="IIOManager"/> for the instance's "Game" directory.</returns>
static IIOManager CreateGameIOManager(IIOManager instanceIOManager) => new ResolvingIOManager(instanceIOManager, "Game");
#pragma warning disable CA1502 // TODO: Decomplexify
/// <summary>
/// Initializes a new instance of the <see cref="InstanceFactory"/> class.
@@ -222,17 +229,32 @@ namespace Tgstation.Server.Host.Components
}
#pragma warning restore CA1502
/// <inheritdoc />
public IIOManager CreateGameIOManager(Models.Instance metadata)
{
if (metadata == null)
throw new ArgumentNullException(nameof(metadata));
var instanceIoManager = CreateInstanceIOManager(metadata);
return CreateGameIOManager(instanceIoManager);
}
/// <inheritdoc />
#pragma warning disable CA1506 // TODO: Decomplexify
public async Task<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
{
if (bridgeRegistrar == null)
throw new ArgumentNullException(nameof(bridgeRegistrar));
if (metadata == null)
throw new ArgumentNullException(nameof(metadata));
// Create the ioManager for the instance
var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
var instanceIoManager = CreateInstanceIOManager(metadata);
// various other ioManagers
var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
var gameIoManager = CreateGameIOManager(instanceIoManager);
var diagnosticsIOManager = new ResolvingIOManager(instanceIoManager, "Diagnostics");
var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
@@ -386,5 +408,12 @@ namespace Tgstation.Server.Host.Components
/// Test that the <see cref="repositoryFactory"/> is functional.
/// </summary>
void CheckSystemCompatibility() => repositoryFactory.CreateInMemory();
/// <summary>
/// Create the <see cref="IIOManager"/> for a given set of instance <paramref name="metadata"/>.
/// </summary>
/// <param name="metadata">The <see cref="Models.Instance"/>.</param>
/// <returns>The <see cref="IIOManager"/> for the <paramref name="metadata"/>.</returns>
IIOManager CreateInstanceIOManager(Models.Instance metadata) => new ResolvingIOManager(ioManager, metadata.Path);
}
}
@@ -218,6 +218,8 @@ namespace Tgstation.Server.Host.Components
{
if (oldPath == null)
throw new ArgumentNullException(nameof(oldPath));
using var lockContext = await SemaphoreSlimContext.Lock(instanceStateChangeSemaphore, cancellationToken);
using var instanceReferenceCheck = GetInstanceReference(instance);
if (instanceReferenceCheck != null)
throw new InvalidOperationException("Cannot move an online instance!");
@@ -225,6 +227,10 @@ namespace Tgstation.Server.Host.Components
try
{
await ioManager.MoveDirectory(oldPath, newPath, cancellationToken);
// Delete the Game directory to clear out broken symlinks
var instanceGameIOManager = instanceFactory.CreateGameIOManager(instance);
await instanceGameIOManager.DeleteDirectory(".", cancellationToken);
}
catch (Exception ex)
{