From 145dc50f8a64abadbfac1938870a3bf4c712488e Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 6 Jul 2022 09:14:09 +0200 Subject: [PATCH] fix file cache size calculation exception, add more logging to character data factory, add more resilience into file system scan --- .../Factories/CharacterDataFactory.cs | 9 ++++++++- MareSynchronos/Managers/FileCacheManager.cs | 19 +++++++++++++++---- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/Models/FileReplacement.cs | 4 ++-- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 1eb2a79..4129c6a 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; +using Dalamud.Logging; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.System.Resource; @@ -60,6 +61,8 @@ public class CharacterDataFactory } var mdlPath = new Utf8String(mdl->ResourceHandle->FileName()).ToString(); + PluginLog.Verbose("Adding File Replacement for Model " + mdlPath); + FileReplacement mdlFileReplacement = CreateFileReplacement(mdlPath); DebugPrint(mdlFileReplacement, objectKind, "Model", inheritanceLevel); @@ -76,7 +79,9 @@ public class CharacterDataFactory private unsafe void AddReplacementsFromMaterial(Material* mtrl, CharacterData cache, int inheritanceLevel = 0, string objectKind = "") { - var mtrlPath = new Utf8String(mtrl->ResourceHandle->FileName()).ToString().Split("|")[2]; + var fileName = new Utf8String(mtrl->ResourceHandle->FileName()).ToString(); + PluginLog.Verbose("Adding File Replacement for Material " + fileName); + var mtrlPath = fileName.Split("|")[2]; var mtrlFileReplacement = CreateFileReplacement(mtrlPath); DebugPrint(mtrlFileReplacement, objectKind, "Material", inheritanceLevel); @@ -96,6 +101,8 @@ public class CharacterDataFactory private void AddReplacementsFromTexture(string texPath, CharacterData cache, int inheritanceLevel = 0, string objectKind = "", bool doNotReverseResolve = true) { + PluginLog.Verbose("Adding File Replacement for Texture " + texPath); + var texFileReplacement = CreateFileReplacement(texPath, doNotReverseResolve); DebugPrint(texFileReplacement, objectKind, "Texture", inheritanceLevel); diff --git a/MareSynchronos/Managers/FileCacheManager.cs b/MareSynchronos/Managers/FileCacheManager.cs index 6ffadd6..85b8ca4 100644 --- a/MareSynchronos/Managers/FileCacheManager.cs +++ b/MareSynchronos/Managers/FileCacheManager.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Dalamud.Logging; using MareSynchronos.FileCacheDB; using MareSynchronos.Utils; +using Microsoft.EntityFrameworkCore; namespace MareSynchronos.Managers { @@ -143,7 +144,17 @@ namespace MareSynchronos.Managers private void RecalculateFileCacheSize() { - FileCacheSize = Directory.EnumerateFiles(_pluginConfiguration.CacheFolder).Sum(f => new FileInfo(f).Length); + FileCacheSize = Directory.EnumerateFiles(_pluginConfiguration.CacheFolder).Sum(f => + { + try + { + return new FileInfo(f).Length; + } + catch + { + return 0; + } + }); if (FileCacheSize < (long)_pluginConfiguration.MaxLocalCacheInGiB * 1024 * 1024 * 1024) return; @@ -288,10 +299,10 @@ namespace MareSynchronos.Managers { foreach (var deletion in fileCachesToDelete) { - var entry = db.FileCaches.SingleOrDefault(f => + var entries = db.FileCaches.Where(f => f.Hash == deletion.Hash && f.Filepath == deletion.Filepath); - if (entry != null) - db.FileCaches.Remove(entry); + if (await entries.AnyAsync(ct)) + db.FileCaches.RemoveRange(entries); } await db.SaveChangesAsync(ct); foreach (var entry in fileCachesToAdd) diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 063f612..069f53e 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.0.9.0 + 0.0.10.0 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Models/FileReplacement.cs b/MareSynchronos/Models/FileReplacement.cs index c9eb7ab..a9b696b 100644 --- a/MareSynchronos/Models/FileReplacement.cs +++ b/MareSynchronos/Models/FileReplacement.cs @@ -40,7 +40,7 @@ namespace MareSynchronos.Models FileCache? fileCache; using (FileCacheContext db = new()) { - fileCache = db.FileCaches.SingleOrDefault(f => f.Filepath == path.ToLower()); + fileCache = db.FileCaches.FirstOrDefault(f => f.Filepath == path.ToLower()); } if (fileCache != null) @@ -88,7 +88,7 @@ namespace MareSynchronos.Models string hash = Crypto.GetFileHash(fi.FullName); using FileCacheContext db = new(); - var fileAddedDuringCompute = db.FileCaches.SingleOrDefault(f => f.Filepath == fi.FullName.ToLower()); + var fileAddedDuringCompute = db.FileCaches.FirstOrDefault(f => f.Filepath == fi.FullName.ToLower()); if (fileAddedDuringCompute != null) return fileAddedDuringCompute.Hash; try