Version 2.0.6.0 - Hotfix for healing

This commit is contained in:
Timothy Baldridge 2020-05-21 15:25:44 -06:00
parent a1ae365b09
commit 28b11b1c7f
3 changed files with 40 additions and 14 deletions

View File

@ -257,7 +257,7 @@ namespace Wabbajack.Lib.Downloaders
var tempFile = new TempFile();
var newArchive = new Archive(new State {Game = Game, ModID = ModID, FileID = FileID})
var newArchive = new Archive(new State {Game = Game, ModID = ModID, FileID = newFile.file_id})
{
Name = newFile.file_name,
};

View File

@ -138,11 +138,15 @@ namespace Wabbajack.Server.Services
using var _ = await _healLock.WaitAsync();
if (!(archive.State is IUpgradingState))
{
_logger.Log(LogLevel.Information, $"Cannot heal {archive.State} because it's not a healable state");
return (archive, ArchiveStatus.InValid);
}
var srcDownload = await _sql.GetArchiveDownload(archive.State.PrimaryKeyString, archive.Hash, archive.Size);
if (srcDownload == null || srcDownload.IsFailed == true)
{
_logger.Log(LogLevel.Information, $"Cannot heal {archive.State} because it hasn't been previously successfully downloaded");
return (archive, ArchiveStatus.InValid);
}
@ -166,6 +170,7 @@ namespace Wabbajack.Server.Services
var upgrade = await (archive.State as IUpgradingState)?.FindUpgrade(archive);
if (upgrade == default)
{
_logger.Log(LogLevel.Information, $"Cannot heal {archive.State} because an alternative wasn't found");
return (archive, ArchiveStatus.InValid);
}

View File

@ -10,6 +10,7 @@ using Wabbajack.Common;
using Wabbajack.Lib.CompilationSteps;
using Wabbajack.Server.DataLayer;
using Wabbajack.Server.DTOs;
using LogLevel = Microsoft.Extensions.Logging.LogLevel;
namespace Wabbajack.Server.Services
{
@ -53,24 +54,20 @@ namespace Wabbajack.Server.Services
var patchName = $"{Consts.ArchiveUpdatesCDNFolder}\\{patch.Src.Archive.Hash.ToHex()}_{patch.Dest.Archive.Hash.ToHex()}";
using var sigFile = new TempFile();
using var patchFile = new TempFile();
await using var srcStream = srcPath.OpenShared();
await using var destStream = destPath.OpenShared();
await using var sigStream = sigFile.Path.Create();
using var ftpClient = await GetBunnyCdnFtpClient();
if (!await ftpClient.DirectoryExistsAsync(Consts.ArchiveUpdatesCDNFolder))
await ftpClient.CreateDirectoryAsync(Consts.ArchiveUpdatesCDNFolder);
await using var patchOutput = await ftpClient.OpenWriteAsync(patchName);
await using var patchOutput = patchFile.Path.Create();
OctoDiff.Create(destStream, srcStream, sigStream, patchOutput);
await patchOutput.DisposeAsync();
var size = await ftpClient.GetFileSizeAsync(patchName);
var size = patchFile.Path.Size;
await UploadToCDN(patchFile.Path, patchName);
await patch.Finish(_sql, size);
await _discordWebHook.Send(Channel.Spam,
await _discordWebHook.Send(Channel.Ham,
new DiscordMessage
{
Content =
@ -95,7 +92,31 @@ namespace Wabbajack.Server.Services
return count;
}
private async Task UploadToCDN(AbsolutePath patchFile, string patchName)
{
for (var times = 0; times < 5; times ++)
{
try
{
_logger.Log(LogLevel.Information,
$"Uploading {patchFile.Size.ToFileSizeString()} patch file to CDN");
using var client = await GetBunnyCdnFtpClient();
if (!await client.DirectoryExistsAsync(Consts.ArchiveUpdatesCDNFolder))
await client.CreateDirectoryAsync(Consts.ArchiveUpdatesCDNFolder);
await client.UploadFileAsync((string)patchFile, patchName, FtpRemoteExists.Overwrite);
return;
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error uploading {patchFile} to CDN");
}
}
_logger.Log(LogLevel.Error, $"Couldn't upload {patchFile} to {patchName}");
}
private async Task<FtpClient> GetBunnyCdnFtpClient()
{
var info = Utils.FromEncryptedJson<BunnyCdnFtpInfo>("bunny-cdn-ftp-info");