Temp files now implement IAsyncDisposable instead of IDisposable and use AbsolutePath.DeleteAsync

This commit is contained in:
Timothy Baldridge 2020-05-27 20:43:57 -06:00
parent 90d7d3b15c
commit ea76d88012
17 changed files with 60 additions and 55 deletions

View File

@ -37,7 +37,7 @@ namespace Compression.BSA
public async ValueTask DisposeAsync()
{
_slab.Dispose();
await _slab.DisposeAsync();
}
public async Task AddFile(FileStateObject state, Stream src)

View File

@ -78,7 +78,7 @@ namespace Compression.BSA
public async ValueTask DisposeAsync()
{
_slab.Dispose();
await _slab.DisposeAsync();
}
public async Task AddFile(FileStateObject state, Stream src)
{

View File

@ -47,7 +47,7 @@ namespace Wabbajack.Test
public async Task FileNoExistsCheck_Exists()
{
var vm = new FilePickerVM();
using (CreateSetFile(vm))
await using (CreateSetFile(vm))
{
vm.PathType = FilePickerVM.PathTypeOptions.File;
vm.ExistCheckOption = FilePickerVM.CheckOptions.Off;
@ -76,7 +76,7 @@ namespace Wabbajack.Test
public async Task ExistCheckTypeOff_Exists()
{
var vm = new FilePickerVM();
using (CreateSetFile(vm))
await using (CreateSetFile(vm))
{
vm.PathType = FilePickerVM.PathTypeOptions.Off;
vm.ExistCheckOption = FilePickerVM.CheckOptions.On;
@ -119,7 +119,7 @@ namespace Wabbajack.Test
public async Task FileIfNotEmptyCheck_Exists()
{
var vm = new FilePickerVM();
using (CreateSetFile(vm))
await using (CreateSetFile(vm))
{
vm.PathType = FilePickerVM.PathTypeOptions.File;
vm.ExistCheckOption = FilePickerVM.CheckOptions.IfPathNotEmpty;
@ -148,7 +148,7 @@ namespace Wabbajack.Test
public async Task FileOnExistsCheck_Exists()
{
var vm = new FilePickerVM();
using (CreateSetFile(vm))
await using (CreateSetFile(vm))
{
vm.PathType = FilePickerVM.PathTypeOptions.File;
vm.ExistCheckOption = FilePickerVM.CheckOptions.On;
@ -259,7 +259,7 @@ namespace Wabbajack.Test
public async Task FileExistsButSetToFolder()
{
var vm = new FilePickerVM();
using (CreateSetFile(vm))
await using (CreateSetFile(vm))
{
vm.PathType = FilePickerVM.PathTypeOptions.Folder;
vm.ExistCheckOption = FilePickerVM.CheckOptions.On;
@ -291,7 +291,7 @@ namespace Wabbajack.Test
public async Task FileWithFilters_Passes()
{
var vm = new FilePickerVM();
using (CreateSetFile(vm))
await using (CreateSetFile(vm))
{
vm.PathType = FilePickerVM.PathTypeOptions.File;
vm.ExistCheckOption = FilePickerVM.CheckOptions.Off;
@ -308,7 +308,7 @@ namespace Wabbajack.Test
public async Task FileWithFilters_ExistsButFails()
{
var vm = new FilePickerVM();
using (CreateSetFile(vm))
await using (CreateSetFile(vm))
{
vm.PathType = FilePickerVM.PathTypeOptions.File;
vm.ExistCheckOption = FilePickerVM.CheckOptions.Off;

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading.Tasks;
namespace Wabbajack.Common
{
@ -9,13 +10,13 @@ namespace Wabbajack.Common
/// Memory allocator that stores data via memory mapping to a on-disk file. Disposing of this object
/// deletes the memory mapped file
/// </summary>
public class DiskSlabAllocator : IDisposable
public class DiskSlabAllocator : IAsyncDisposable
{
private readonly TempFile _file;
private readonly MemoryMappedFile _mmap;
private long _head = 0;
private readonly FileStream _fileStream;
private List<IDisposable> _allocated = new List<IDisposable>();
private List<IAsyncDisposable> _allocated = new List<IAsyncDisposable>();
private long _size;
public DiskSlabAllocator(long size)
@ -44,12 +45,13 @@ namespace Wabbajack.Common
}
}
public void Dispose()
public async ValueTask DisposeAsync()
{
_allocated.Do(s => s.Dispose());
foreach (var allocated in _allocated)
await allocated.DisposeAsync();
_mmap.Dispose();
_fileStream.Dispose();
_file.Dispose();
await _fileStream.DisposeAsync();
await _file.DisposeAsync();
}
}
}

View File

@ -8,7 +8,7 @@ using AlphaPath = Alphaleonis.Win32.Filesystem.Path;
namespace Wabbajack.Common
{
public class TempFile : IDisposable
public class TempFile : IAsyncDisposable
{
public FileInfo File { get; private set; }
public AbsolutePath Path => (AbsolutePath)File.FullName;
@ -35,12 +35,11 @@ namespace Wabbajack.Common
}
this.DeleteAfter = deleteAfter;
}
public void Dispose()
public async ValueTask DisposeAsync()
{
if (DeleteAfter)
{
this.File.Delete();
await Path.DeleteAsync();
}
}
}

View File

@ -21,13 +21,13 @@ namespace Wabbajack.Common
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
_file.Dispose();
_file.DisposeAsync().AsTask().Wait();
}
public override async ValueTask DisposeAsync()
{
await base.DisposeAsync();
_file.Dispose();
await _file.DisposeAsync();
}
}
}

View File

@ -148,7 +148,7 @@ namespace Wabbajack.Lib.Downloaders
public override async Task<bool> Download(Archive a, AbsolutePath destination)
{
var (client, info, collected) = await ResolveDownloadInfo();
using var tf = new TempFile();
await using var tf = new TempFile();
await using var file = tf.File.Create();
var max_chunks = info.depot_list[0].file_list[0].chunk_count;
foreach (var chunk in info.depot_list[0].file_list[0].chunk_list.OrderBy(c => c.index))

View File

@ -16,8 +16,8 @@ namespace Wabbajack.BuildServer.Test
public async Task CanIngestFiles()
{
var maintainer = Fixture.GetService<ArchiveMaintainer>();
using var tf = new TempFile();
using var tf2 = new TempFile();
await using var tf = new TempFile();
await using var tf2 = new TempFile();
await tf.Path.WriteAllBytesAsync(RandomData(1024));
await tf.Path.CopyToAsync(tf2.Path);
@ -35,7 +35,7 @@ namespace Wabbajack.BuildServer.Test
public async Task IngestsExistingFiles()
{
var maintainer = Fixture.GetService<ArchiveMaintainer>();
using var tf = new TempFile();
await using var tf = new TempFile();
await tf.Path.WriteAllBytesAsync(RandomData(1024));
var hash = await tf.Path.FileHashAsync();

View File

@ -20,7 +20,7 @@ namespace Wabbajack.BuildServer.Test
[Fact]
public async Task CanUploadDownloadAndDeleteAuthoredFiles()
{
using var file = new TempFile();
await using var file = new TempFile();
await file.Path.WriteAllBytesAsync(RandomData(Consts.UPLOADED_FILE_BLOCK_SIZE * 4 + Consts.UPLOADED_FILE_BLOCK_SIZE / 3));
var originalHash = await file.Path.FileHashAsync();

View File

@ -104,7 +104,7 @@ namespace Wabbajack.Server.Test
await"TestEndToEndArchiveUpdating.txt".RelativeTo(Fixture.ServerPublicFolder).WriteAllBytesAsync(newFileData);
using var tempFile = new TempFile();
await using var tempFile = new TempFile();
var pendingRequest = DownloadDispatcher.DownloadWithPossibleUpgrade(oldArchive, tempFile.Path);
for (var times = 0; await downloader.Execute() == 0 && times < 40; times ++)
@ -124,7 +124,7 @@ namespace Wabbajack.Server.Test
private async Task IngestData(ArchiveMaintainer am, byte[] data)
{
using var f = new TempFile();
await using var f = new TempFile();
await f.Path.WriteAllBytesAsync(data);
await am.Ingest(f.Path);
}

View File

@ -60,7 +60,7 @@ namespace Wabbajack.Server.Services
_logger.Log(LogLevel.Information, $"Downloading {nextDownload.Archive.State.PrimaryKeyString}");
await DownloadDispatcher.PrepareAll(new[] {nextDownload.Archive.State});
using var tempPath = new TempFile();
await using var tempPath = new TempFile();
await nextDownload.Archive.State.Download(nextDownload.Archive, tempPath.Path);
var hash = await tempPath.Path.FileHashAsync();

View File

@ -184,7 +184,7 @@ namespace Wabbajack.Server.Services
_logger.Log(LogLevel.Information, $"Enqueued Patch from {srcDownload.Archive.Hash} to {destDownload.Archive.Hash}");
await _discord.Send(Channel.Spam, new DiscordMessage { Content = $"Enqueued Patch from {srcDownload.Archive.Hash} to {destDownload.Archive.Hash}" });
upgrade.NewFile.Dispose();
await upgrade.NewFile.DisposeAsync();
return (archive, ArchiveStatus.Updating);
}

View File

@ -68,8 +68,8 @@ 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 sigFile = new TempFile();
await using var patchFile = new TempFile();
await using var srcStream = await srcPath.OpenShared();
await using var destStream = await destPath.OpenShared();
await using var sigStream = await sigFile.Path.Create();

View File

@ -69,7 +69,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!){Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist {AllowedPrefixes = new List<string>{"https://mega.nz/#!CsMSFaaJ!-uziC4mbJPRy2e4pPk8Gjb3oDT_38Be9fzZ6Ld4NL-k" } }));
Assert.False(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>{ "blerg" }}));
@ -99,7 +99,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!){Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string> { "https://www.dropbox.com/s/5hov3m2pboppoc2/WABBAJACK_TEST_FILE.txt?" } }));
Assert.False(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string> { "blerg" } }));
@ -129,7 +129,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { GoogleIDs = new List<string> { "1grLRTrpHxlg7VPxATTFNfq2OkU_Plvh_" } }));
Assert.False(converted.IsWhitelisted(new ServerWhitelist { GoogleIDs = new List<string>()}));
@ -158,7 +158,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string> { "http://build.wabbajack.org/" } }));
Assert.False(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
@ -182,7 +182,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string> { "http://build.wabbajack.org/" } }));
@ -212,7 +212,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20 }));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist
{AllowedPrefixes = new List<string> {"http://www.mediafire.com/file/agiqzm1xwebczpx/"}}));
@ -241,7 +241,7 @@ namespace Wabbajack.Test
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20 }));
// Exercise the cache code
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20 }));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
@ -268,7 +268,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
@ -300,7 +300,7 @@ namespace Wabbajack.Test
Assert.False(await converted.Verify(new Archive(state: null!) { Size = 15}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
await converted.Download(new Archive(state: null!) { Name = "LoversLab Test.txt" }, filename.Path);
@ -327,7 +327,7 @@ namespace Wabbajack.Test
*/
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
@ -352,7 +352,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
@ -404,7 +404,7 @@ namespace Wabbajack.Test
var converted = RoundTripState(state);
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
using var filename = new TempFile();
await using var filename = new TempFile();
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
@ -425,7 +425,7 @@ namespace Wabbajack.Test
var ini = $@"[General]
directURL=https://bethesda.net/en/mods/skyrim/mod-detail/4145641";
using var filename = new TempFile();
await using var filename = new TempFile();
var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString());
Assert.NotNull(state);
@ -463,7 +463,7 @@ namespace Wabbajack.Test
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
using var tempFile = new TempFile();
await using var tempFile = new TempFile();
await converted.Download(new Archive(state: null!) { Name = "yt_test.zip"}, tempFile.Path);
Assert.Equal(Hash.FromBase64("kD36zbA2X9Q="), await tempFile.Path.FileHashAsync());
}

View File

@ -70,7 +70,7 @@ namespace Wabbajack.Test
[Fact]
public async Task DownloadResume()
{
using var testFile = new TempFile();
await using var testFile = new TempFile();
using var server = new CrappyRandomServer();
var state = new HTTPDownloader.State($"http://localhost:{server.Port}/foo");

View File

@ -267,8 +267,8 @@ namespace Wabbajack.Test
await utils.Configure();
using var tempFile = new TempFile();
await using var tempFile = new TempFile();
var bsaState = new BSAStateObject
{
Magic = "BSA\0", Version = 0x69, ArchiveFlags = 0x107, FileFlags = 0x0,
@ -306,8 +306,8 @@ namespace Wabbajack.Test
await utils.Configure();
using var tempFile = new TempFile();
await using var tempFile = new TempFile();
var bsaState = new BSAStateObject
{
Magic = "BSA\0", Version = 0x69, ArchiveFlags = 0x107, FileFlags = 0x0,
@ -347,8 +347,8 @@ namespace Wabbajack.Test
await utils.Configure();
using var tempFile = new TempFile();
await using var tempFile = new TempFile();
var bsaState = new BSAStateObject
{
Magic = "BSA\0", Version = 0x69, ArchiveFlags = 0x107, FileFlags = 0x0,
@ -389,7 +389,7 @@ namespace Wabbajack.Test
};
// Create the download
using var tempFile = new TempFile();
await using var tempFile = new TempFile();
await using (var bsa = bsaState.MakeBuilder(1024 * 1024))
{
await bsa.AddFile(new BSAFileStateObject

View File

@ -184,7 +184,11 @@ namespace Wabbajack.VirtualFileSystem
Utils.Status($"Extracting {source.FileName} - done", Percent.One, alsoLog: true);
}
tmpFile?.Dispose();
if (tmpFile != null)
{
await tmpFile.DisposeAsync();
}
return new ExtractedFiles(dest);
}