From b4c7570492db17b48e01aca491d1be7f66219fa7 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 3 Sep 2020 01:42:18 +0100 Subject: [PATCH] Move getting files to VFS. --- RomRepoMgr.Core/Filesystem/Fuse.cs | 225 +++-------------------------- RomRepoMgr.Core/Filesystem/Vfs.cs | 63 ++++++++ 2 files changed, 80 insertions(+), 208 deletions(-) diff --git a/RomRepoMgr.Core/Filesystem/Fuse.cs b/RomRepoMgr.Core/Filesystem/Fuse.cs index fdbc56d..0f1c75b 100644 --- a/RomRepoMgr.Core/Filesystem/Fuse.cs +++ b/RomRepoMgr.Core/Filesystem/Fuse.cs @@ -19,19 +19,17 @@ namespace RomRepoMgr.Core.Filesystem // TODO: Last handle goes negative public sealed class Fuse : FileSystem { - readonly ConcurrentDictionary> _directoryCache; - readonly ConcurrentDictionary _fileStatHandleCache; - readonly ConcurrentDictionary> _machineFilesCache; - readonly ConcurrentDictionary _streamsCache; - readonly Vfs _vfs; - long _lastHandle; - string _umountToken; + readonly ConcurrentDictionary> _directoryCache; + readonly ConcurrentDictionary _fileStatHandleCache; + readonly ConcurrentDictionary _streamsCache; + readonly Vfs _vfs; + long _lastHandle; + string _umountToken; public Fuse(Vfs vfs) { _directoryCache = new ConcurrentDictionary>(); _lastHandle = 0; - _machineFilesCache = new ConcurrentDictionary>(); _streamsCache = new ConcurrentDictionary(); _fileStatHandleCache = new ConcurrentDictionary(); Name = "romrepombgrfs"; @@ -156,38 +154,9 @@ namespace RomRepoMgr.Core.Filesystem return 0; } - _machineFilesCache.TryGetValue(machine.Id, out ConcurrentDictionary cachedMachineFiles); + CachedFile file = _vfs.GetFile(machine.Id, pieces[2]); - if(cachedMachineFiles == null) - { - using var ctx = Context.Create(Settings.Settings.Current.DatabasePath); - - cachedMachineFiles = new ConcurrentDictionary(); - - foreach(FileByMachine machineFile in ctx.FilesByMachines.Where(fbm => fbm.Machine.Id == machine.Id && - fbm.File.IsInRepo)) - { - var cachedFile = new CachedFile - { - Id = machineFile.File.Id, - Crc32 = machineFile.File.Crc32, - Md5 = machineFile.File.Md5, - Sha1 = machineFile.File.Sha1, - Sha256 = machineFile.File.Sha256, - Sha384 = machineFile.File.Sha384, - Sha512 = machineFile.File.Sha512, - Size = machineFile.File.Size, - CreatedOn = machineFile.File.CreatedOn, - UpdatedOn = machineFile.File.UpdatedOn - }; - - cachedMachineFiles[machineFile.Name] = cachedFile; - } - - _machineFilesCache[machine.Id] = cachedMachineFiles; - } - - if(!cachedMachineFiles.TryGetValue(pieces[2], out CachedFile file)) + if(file == null) return Errno.ENOENT; if(pieces.Length == 3) @@ -267,38 +236,9 @@ namespace RomRepoMgr.Core.Filesystem if(pieces.Length == 2) return Errno.EISDIR; - _machineFilesCache.TryGetValue(machine.Id, out ConcurrentDictionary cachedMachineFiles); + CachedFile file = _vfs.GetFile(machine.Id, pieces[2]); - if(cachedMachineFiles == null) - { - using var ctx = Context.Create(Settings.Settings.Current.DatabasePath); - - cachedMachineFiles = new ConcurrentDictionary(); - - foreach(FileByMachine machineFile in ctx.FilesByMachines.Where(fbm => fbm.Machine.Id == machine.Id && - fbm.File.IsInRepo)) - { - var cachedFile = new CachedFile - { - Id = machineFile.File.Id, - Crc32 = machineFile.File.Crc32, - Md5 = machineFile.File.Md5, - Sha1 = machineFile.File.Sha1, - Sha256 = machineFile.File.Sha256, - Sha384 = machineFile.File.Sha384, - Sha512 = machineFile.File.Sha512, - Size = machineFile.File.Size, - CreatedOn = machineFile.File.CreatedOn, - UpdatedOn = machineFile.File.UpdatedOn - }; - - cachedMachineFiles[machineFile.Name] = cachedFile; - } - - _machineFilesCache[machine.Id] = cachedMachineFiles; - } - - if(!cachedMachineFiles.TryGetValue(pieces[2], out CachedFile file)) + if(file == null) return Errno.ENOENT; if(pieces.Length > 3) @@ -483,38 +423,9 @@ namespace RomRepoMgr.Core.Filesystem if(pieces.Length == 2) return Errno.ENODATA; - _machineFilesCache.TryGetValue(machine.Id, out ConcurrentDictionary cachedMachineFiles); + CachedFile file = _vfs.GetFile(machine.Id, pieces[2]); - if(cachedMachineFiles == null) - { - using var ctx = Context.Create(Settings.Settings.Current.DatabasePath); - - cachedMachineFiles = new ConcurrentDictionary(); - - foreach(FileByMachine machineFile in ctx.FilesByMachines.Where(fbm => fbm.Machine.Id == machine.Id && - fbm.File.IsInRepo)) - { - var cachedFile = new CachedFile - { - Id = machineFile.File.Id, - Crc32 = machineFile.File.Crc32, - Md5 = machineFile.File.Md5, - Sha1 = machineFile.File.Sha1, - Sha256 = machineFile.File.Sha256, - Sha384 = machineFile.File.Sha384, - Sha512 = machineFile.File.Sha512, - Size = machineFile.File.Size, - CreatedOn = machineFile.File.CreatedOn, - UpdatedOn = machineFile.File.UpdatedOn - }; - - cachedMachineFiles[machineFile.Name] = cachedFile; - } - - _machineFilesCache[machine.Id] = cachedMachineFiles; - } - - if(!cachedMachineFiles.TryGetValue(pieces[2], out CachedFile file)) + if(file == null) return Errno.ENOENT; if(pieces.Length > 3) @@ -623,38 +534,9 @@ namespace RomRepoMgr.Core.Filesystem if(pieces.Length == 2) return 0; - _machineFilesCache.TryGetValue(machine.Id, out ConcurrentDictionary cachedMachineFiles); + CachedFile file = _vfs.GetFile(machine.Id, pieces[2]); - if(cachedMachineFiles == null) - { - using var ctx = Context.Create(Settings.Settings.Current.DatabasePath); - - cachedMachineFiles = new ConcurrentDictionary(); - - foreach(FileByMachine machineFile in ctx.FilesByMachines.Where(fbm => fbm.Machine.Id == machine.Id && - fbm.File.IsInRepo)) - { - var cachedFile = new CachedFile - { - Id = machineFile.File.Id, - Crc32 = machineFile.File.Crc32, - Md5 = machineFile.File.Md5, - Sha1 = machineFile.File.Sha1, - Sha256 = machineFile.File.Sha256, - Sha384 = machineFile.File.Sha384, - Sha512 = machineFile.File.Sha512, - Size = machineFile.File.Size, - CreatedOn = machineFile.File.CreatedOn, - UpdatedOn = machineFile.File.UpdatedOn - }; - - cachedMachineFiles[machineFile.Name] = cachedFile; - } - - _machineFilesCache[machine.Id] = cachedMachineFiles; - } - - if(!cachedMachineFiles.TryGetValue(pieces[2], out CachedFile file)) + if(file == null) return Errno.ENOENT; if(pieces.Length > 3) @@ -769,37 +651,7 @@ namespace RomRepoMgr.Core.Filesystem if(machine == null) return Errno.ENOENT; - _machineFilesCache.TryGetValue(machine.Id, - out ConcurrentDictionary cachedMachineFiles); - - if(cachedMachineFiles == null) - { - using var ctx = Context.Create(Settings.Settings.Current.DatabasePath); - - cachedMachineFiles = new ConcurrentDictionary(); - - foreach(FileByMachine machineFile in - ctx.FilesByMachines.Where(fbm => fbm.Machine.Id == machine.Id && fbm.File.IsInRepo)) - { - var file = new CachedFile - { - Id = machineFile.File.Id, - Crc32 = machineFile.File.Crc32, - Md5 = machineFile.File.Md5, - Sha1 = machineFile.File.Sha1, - Sha256 = machineFile.File.Sha256, - Sha384 = machineFile.File.Sha384, - Sha512 = machineFile.File.Sha512, - Size = machineFile.File.Size, - CreatedOn = machineFile.File.CreatedOn, - UpdatedOn = machineFile.File.UpdatedOn - }; - - cachedMachineFiles[machineFile.Name] = file; - } - - _machineFilesCache[machine.Id] = cachedMachineFiles; - } + ConcurrentDictionary cachedMachineFiles = _vfs.GetFilesFromMachine(machine.Id); if(pieces.Length == 2) { @@ -887,38 +739,9 @@ namespace RomRepoMgr.Core.Filesystem if(pieces.Length == 2) return mode.HasFlag(AccessModes.W_OK) ? Errno.EROFS : 0; - _machineFilesCache.TryGetValue(machine.Id, out ConcurrentDictionary cachedMachineFiles); + CachedFile file = _vfs.GetFile(machine.Id, pieces[2]); - if(cachedMachineFiles == null) - { - using var ctx = Context.Create(Settings.Settings.Current.DatabasePath); - - cachedMachineFiles = new ConcurrentDictionary(); - - foreach(FileByMachine machineFile in ctx.FilesByMachines.Where(fbm => fbm.Machine.Id == machine.Id && - fbm.File.IsInRepo)) - { - var cachedFile = new CachedFile - { - Id = machineFile.File.Id, - Crc32 = machineFile.File.Crc32, - Md5 = machineFile.File.Md5, - Sha1 = machineFile.File.Sha1, - Sha256 = machineFile.File.Sha256, - Sha384 = machineFile.File.Sha384, - Sha512 = machineFile.File.Sha512, - Size = machineFile.File.Size, - CreatedOn = machineFile.File.CreatedOn, - UpdatedOn = machineFile.File.UpdatedOn - }; - - cachedMachineFiles[machineFile.Name] = cachedFile; - } - - _machineFilesCache[machine.Id] = cachedMachineFiles; - } - - if(!cachedMachineFiles.TryGetValue(pieces[2], out CachedFile _)) + if(file == null) return Errno.ENOENT; if(pieces.Length > 3) @@ -964,19 +787,5 @@ namespace RomRepoMgr.Core.Filesystem _umountToken = Base32.ToBase32String(token); setxattr(Path.Combine(MountPoint, ".fuse_umount"), _umountToken, IntPtr.Zero, 0, 0); } - - sealed class CachedFile - { - public ulong Id { get; set; } - public ulong Size { get; set; } - public string Crc32 { get; set; } - public string Md5 { get; set; } - public string Sha1 { get; set; } - public string Sha256 { get; set; } - public string Sha384 { get; set; } - public string Sha512 { get; set; } - public DateTime CreatedOn { get; set; } - public DateTime UpdatedOn { get; set; } - } } } \ No newline at end of file diff --git a/RomRepoMgr.Core/Filesystem/Vfs.cs b/RomRepoMgr.Core/Filesystem/Vfs.cs index ee136ad..5737e45 100644 --- a/RomRepoMgr.Core/Filesystem/Vfs.cs +++ b/RomRepoMgr.Core/Filesystem/Vfs.cs @@ -11,6 +11,7 @@ namespace RomRepoMgr.Core.Filesystem { public class Vfs : IDisposable { + readonly ConcurrentDictionary> _machineFilesCache; readonly ConcurrentDictionary> _machinesStatCache; readonly ConcurrentDictionary _romSetsCache; Fuse _fuse; @@ -22,6 +23,7 @@ namespace RomRepoMgr.Core.Filesystem _rootDirectoryCache = new ConcurrentDictionary(); _romSetsCache = new ConcurrentDictionary(); _machinesStatCache = new ConcurrentDictionary>(); + _machineFilesCache = new ConcurrentDictionary>(); } public static bool IsAvailable => Winfsp.IsAvailable || Fuse.IsAvailable; @@ -190,6 +192,53 @@ namespace RomRepoMgr.Core.Filesystem return machine; } + + internal ConcurrentDictionary GetFilesFromMachine(ulong id) + { + _machineFilesCache.TryGetValue(id, out ConcurrentDictionary cachedMachineFiles); + + if(cachedMachineFiles != null) + return cachedMachineFiles; + + using var ctx = Context.Create(Settings.Settings.Current.DatabasePath); + + cachedMachineFiles = new ConcurrentDictionary(); + + foreach(FileByMachine machineFile in ctx.FilesByMachines.Where(fbm => fbm.Machine.Id == id && + fbm.File.IsInRepo)) + { + var cachedFile = new CachedFile + { + Id = machineFile.File.Id, + Crc32 = machineFile.File.Crc32, + Md5 = machineFile.File.Md5, + Sha1 = machineFile.File.Sha1, + Sha256 = machineFile.File.Sha256, + Sha384 = machineFile.File.Sha384, + Sha512 = machineFile.File.Sha512, + Size = machineFile.File.Size, + CreatedOn = machineFile.File.CreatedOn, + UpdatedOn = machineFile.File.UpdatedOn + }; + + cachedMachineFiles[machineFile.Name] = cachedFile; + } + + _machineFilesCache[id] = cachedMachineFiles; + + return cachedMachineFiles; + } + + internal CachedFile GetFile(ulong machineId, string name) + { + ConcurrentDictionary cachedFiles = GetFilesFromMachine(machineId); + + if(cachedFiles == null || + !cachedFiles.TryGetValue(name, out CachedFile file)) + return null; + + return file; + } } internal sealed class CachedMachine @@ -198,4 +247,18 @@ namespace RomRepoMgr.Core.Filesystem public DateTime CreationDate { get; set; } public DateTime ModificationDate { get; set; } } + + internal sealed class CachedFile + { + public ulong Id { get; set; } + public ulong Size { get; set; } + public string Crc32 { get; set; } + public string Md5 { get; set; } + public string Sha1 { get; set; } + public string Sha256 { get; set; } + public string Sha384 { get; set; } + public string Sha512 { get; set; } + public DateTime CreatedOn { get; set; } + public DateTime UpdatedOn { get; set; } + } } \ No newline at end of file