mirror of
https://github.com/chylex/Minecraft-Phantom-Panel.git
synced 2025-05-07 00:34:03 +02:00
Change backup world copying to use the dedicated temporary folder
This commit is contained in:
parent
c7354dce0e
commit
b3104f9ac3
Agent/Phantom.Agent.Services/Backups
@ -10,11 +10,15 @@ using Serilog;
|
||||
namespace Phantom.Agent.Services.Backups;
|
||||
|
||||
sealed class BackupArchiver {
|
||||
private readonly string destinationBasePath;
|
||||
private readonly string temporaryBasePath;
|
||||
private readonly ILogger logger;
|
||||
private readonly InstanceProperties instanceProperties;
|
||||
private readonly CancellationToken cancellationToken;
|
||||
|
||||
public BackupArchiver(string loggerName, InstanceProperties instanceProperties, CancellationToken cancellationToken) {
|
||||
public BackupArchiver(string destinationBasePath, string temporaryBasePath, string loggerName, InstanceProperties instanceProperties, CancellationToken cancellationToken) {
|
||||
this.destinationBasePath = destinationBasePath;
|
||||
this.temporaryBasePath = temporaryBasePath;
|
||||
this.logger = PhantomLogger.Create<BackupArchiver>(loggerName);
|
||||
this.instanceProperties = instanceProperties;
|
||||
this.cancellationToken = cancellationToken;
|
||||
@ -40,9 +44,11 @@ sealed class BackupArchiver {
|
||||
return false;
|
||||
}
|
||||
|
||||
public async Task ArchiveWorld(string destinationPath, BackupCreationResult.Builder resultBuilder) {
|
||||
string backupFolderPath = Path.Combine(destinationPath, instanceProperties.InstanceGuid.ToString());
|
||||
string backupFilePath = Path.Combine(backupFolderPath, DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".tar");
|
||||
public async Task ArchiveWorld(BackupCreationResult.Builder resultBuilder) {
|
||||
string guid = instanceProperties.InstanceGuid.ToString();
|
||||
string currentDateTime = DateTime.Now.ToString("yyyyMMdd-HHmmss");
|
||||
string backupFolderPath = Path.Combine(destinationBasePath, guid);
|
||||
string backupFilePath = Path.Combine(backupFolderPath, currentDateTime + ".tar");
|
||||
|
||||
if (File.Exists(backupFilePath)) {
|
||||
resultBuilder.Kind = BackupCreationResultKind.BackupFileAlreadyExists;
|
||||
@ -58,7 +64,8 @@ sealed class BackupArchiver {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!await CopyWorldAndCreateTarArchive(backupFolderPath, backupFilePath, resultBuilder)) {
|
||||
string temporaryFolderPath = Path.Combine(temporaryBasePath, guid + "_" + currentDateTime);
|
||||
if (!await CopyWorldAndCreateTarArchive(temporaryFolderPath, backupFilePath, resultBuilder)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -68,9 +75,7 @@ sealed class BackupArchiver {
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<bool> CopyWorldAndCreateTarArchive(string backupFolderPath, string backupFilePath, BackupCreationResult.Builder resultBuilder) {
|
||||
string temporaryFolderPath = Path.Combine(backupFolderPath, "temp");
|
||||
|
||||
private async Task<bool> CopyWorldAndCreateTarArchive(string temporaryFolderPath, string backupFilePath, BackupCreationResult.Builder resultBuilder) {
|
||||
try {
|
||||
if (!await CopyWorldToTemporaryFolder(temporaryFolderPath)) {
|
||||
resultBuilder.Kind = BackupCreationResultKind.CouldNotCopyWorldToTemporaryFolder;
|
||||
|
@ -8,10 +8,12 @@ using Serilog;
|
||||
namespace Phantom.Agent.Services.Backups;
|
||||
|
||||
sealed partial class BackupManager {
|
||||
private readonly string basePath;
|
||||
private readonly string destinationBasePath;
|
||||
private readonly string temporaryBasePath;
|
||||
|
||||
public BackupManager(AgentFolders agentFolders) {
|
||||
this.basePath = agentFolders.BackupsFolderPath;
|
||||
this.destinationBasePath = agentFolders.BackupsFolderPath;
|
||||
this.temporaryBasePath = Path.Combine(agentFolders.TemporaryFolderPath, "backups");
|
||||
}
|
||||
|
||||
public async Task<BackupCreationResult> CreateBackup(string loggerName, InstanceSession session, CancellationToken cancellationToken) {
|
||||
@ -26,22 +28,24 @@ sealed partial class BackupManager {
|
||||
}
|
||||
|
||||
try {
|
||||
return await new BackupCreator(basePath, loggerName, session, cancellationToken).CreateBackup();
|
||||
return await new BackupCreator(destinationBasePath, temporaryBasePath, loggerName, session, cancellationToken).CreateBackup();
|
||||
} finally {
|
||||
session.BackupSemaphore.Release();
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class BackupCreator {
|
||||
private readonly string basePath;
|
||||
private readonly string destinationBasePath;
|
||||
private readonly string temporaryBasePath;
|
||||
private readonly string loggerName;
|
||||
private readonly ILogger logger;
|
||||
private readonly InstanceSession session;
|
||||
private readonly BackupCommandListener listener;
|
||||
private readonly CancellationToken cancellationToken;
|
||||
|
||||
public BackupCreator(string basePath, string loggerName, InstanceSession session, CancellationToken cancellationToken) {
|
||||
this.basePath = basePath;
|
||||
public BackupCreator(string destinationBasePath, string temporaryBasePath, string loggerName, InstanceSession session, CancellationToken cancellationToken) {
|
||||
this.destinationBasePath = destinationBasePath;
|
||||
this.temporaryBasePath = temporaryBasePath;
|
||||
this.loggerName = loggerName;
|
||||
this.logger = PhantomLogger.Create<BackupManager>(loggerName);
|
||||
this.session = session;
|
||||
@ -81,7 +85,7 @@ sealed partial class BackupManager {
|
||||
try {
|
||||
await DisableAutomaticSaving();
|
||||
await SaveAllChunks();
|
||||
await new BackupArchiver(loggerName, session.InstanceProperties, cancellationToken).ArchiveWorld(basePath, resultBuilder);
|
||||
await new BackupArchiver(destinationBasePath, temporaryBasePath, loggerName, session.InstanceProperties, cancellationToken).ArchiveWorld(resultBuilder);
|
||||
} catch (OperationCanceledException) {
|
||||
resultBuilder.Kind = BackupCreationResultKind.BackupCancelled;
|
||||
logger.Warning("Backup creation was cancelled.");
|
||||
|
Loading…
Reference in New Issue
Block a user