mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-23 04:57:17 +01:00
Delete an instance's Game directory when moving it
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user