From f8e647b24235cbc824a817caee1d7dde09f8c4ae Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Sat, 18 Mar 2023 11:28:00 +0100 Subject: [PATCH] adjust disposal behavior, recalculate cache --- MareSynchronos/FileCache/FileCacheManager.cs | 2 +- MareSynchronos/MareSynchronos.csproj | 2 +- .../PlayerData/Pairs/CachedPlayer.cs | 70 ++++++++++++------- .../WebAPI/Files/FileDownloadManager.cs | 8 ++- 4 files changed, 54 insertions(+), 28 deletions(-) diff --git a/MareSynchronos/FileCache/FileCacheManager.cs b/MareSynchronos/FileCache/FileCacheManager.cs index 8f35870..475c834 100644 --- a/MareSynchronos/FileCache/FileCacheManager.cs +++ b/MareSynchronos/FileCache/FileCacheManager.cs @@ -66,7 +66,7 @@ public sealed class FileCacheManager : IDisposable var fullName = fi.FullName.ToLowerInvariant(); if (!fullName.Contains(_configService.Current.CacheFolder.ToLowerInvariant(), StringComparison.Ordinal)) return null; string prefixedPath = fullName.Replace(_configService.Current.CacheFolder.ToLowerInvariant(), _cachePrefix + "\\", StringComparison.Ordinal).Replace("\\\\", "\\", StringComparison.Ordinal); - return CreateFileCacheEntity(fi, prefixedPath, fi.Name.ToUpper(CultureInfo.InvariantCulture)); + return CreateFileCacheEntity(fi, prefixedPath); } public FileCacheEntity? CreateFileEntry(string path) diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index ddc3aae..f3e133c 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.8.9 + 0.8.10 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs index 85ffca9..57b02ae 100644 --- a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs +++ b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs @@ -158,21 +158,29 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase _charaHandler?.Dispose(); _charaHandler = null; - if (!_lifetime.ApplicationStopping.IsCancellationRequested && !_dalamudUtil.IsZoning && !_dalamudUtil.IsInCutscene) + if (!_lifetime.ApplicationStopping.IsCancellationRequested) { - Logger.LogTrace("[{applicationId}] Restoring state for {name} ({OnlineUser})", applicationId, name, OnlineUser); - _ipcManager.PenumbraRemoveTemporaryCollection(Logger, applicationId, name); - - foreach (KeyValuePair> item in _cachedData.FileReplacements) + if (_dalamudUtil.IsZoning) { - try + Logger.LogTrace("[{applicationId}] Removing temp collection for {name} ({OnlineUser})", applicationId, name, OnlineUser); + _ipcManager.PenumbraRemoveTemporaryCollection(Logger, applicationId, name); + } + else if (!_dalamudUtil.IsZoning && !_dalamudUtil.IsInCutscene) + { + Logger.LogTrace("[{applicationId}] Restoring state for {name} ({OnlineUser})", applicationId, name, OnlineUser); + _ipcManager.PenumbraRemoveTemporaryCollection(Logger, applicationId, name); + + foreach (KeyValuePair> item in _cachedData.FileReplacements) { - RevertCustomizationData(item.Key, name, applicationId).GetAwaiter().GetResult(); - } - catch (InvalidOperationException ex) - { - Logger.LogWarning("Failed disposing player (not present anymore?)", ex); - break; + try + { + RevertCustomizationData(item.Key, name, applicationId).GetAwaiter().GetResult(); + } + catch (InvalidOperationException ex) + { + Logger.LogWarning("Failed disposing player (not present anymore?)", ex); + break; + } } } } @@ -408,7 +416,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase while ((!_applicationTask?.IsCompleted ?? false) && !downloadToken.IsCancellationRequested && !_applicationCancellationTokenSource.IsCancellationRequested) { // block until current application is done - Logger.LogDebug("Waiting for current data application (Id: {id}) to finish", _applicationId); + Logger.LogDebug("Waiting for current data application (Id: {id}) for player ({handler}) to finish", _applicationId, PlayerName); await Task.Delay(250).ConfigureAwait(false); } @@ -419,22 +427,34 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase var token = _applicationCancellationTokenSource.Token; _applicationTask = Task.Run(async () => { - _applicationId = Guid.NewGuid(); - Logger.LogDebug("[{applicationId}] Starting application task", _applicationId); - - if (updateModdedPaths && (moddedPaths.Any() || !string.IsNullOrEmpty(charaData.ManipulationData))) + try { - await ApplyBaseData(_applicationId, moddedPaths, charaData.ManipulationData, token).ConfigureAwait(false); + _applicationId = Guid.NewGuid(); + Logger.LogDebug("[{applicationId}] Starting application task", _applicationId); + + Logger.LogDebug("[{applicationId}] Waiting for initial draw for for {handler}", _applicationId, _charaHandler); + await _dalamudUtil.WaitWhileCharacterIsDrawing(Logger, _charaHandler, _applicationId, 30000, token).ConfigureAwait(false); + + token.ThrowIfCancellationRequested(); + + if (updateModdedPaths && (moddedPaths.Any() || !string.IsNullOrEmpty(charaData.ManipulationData))) + { + await ApplyBaseData(_applicationId, moddedPaths, charaData.ManipulationData, token).ConfigureAwait(false); + } + + token.ThrowIfCancellationRequested(); + + foreach (var kind in updatedData) + { + await ApplyCustomizationData(_applicationId, kind, charaData, token).ConfigureAwait(false); + } + + Logger.LogDebug("[{applicationId}] Application finished", _applicationId); } - - token.ThrowIfCancellationRequested(); - - foreach (var kind in updatedData) + catch (Exception ex) { - await ApplyCustomizationData(_applicationId, kind, charaData, token).ConfigureAwait(false); + Logger.LogInformation("[{applicationId}] Cancelled, reason: {msg}", _applicationId, ex.Message); } - - Logger.LogDebug("[{applicationId}] Application finished", _applicationId); }, token); }, downloadToken); } diff --git a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs index 03b2a0b..5968a26 100644 --- a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs +++ b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs @@ -242,7 +242,13 @@ public partial class FileDownloadManager : DisposableMediatorSubscriberBase fi.LastWriteTime = RandomDayInThePast().Invoke(); try { - _ = _fileDbManager.CreateCacheEntry(filePath); + var entry = _fileDbManager.CreateCacheEntry(filePath); + if (!string.Equals(entry?.Hash, file.Hash, StringComparison.OrdinalIgnoreCase)) + { + Logger.LogError("Hash mismatch after extracting, got {hash}, expected {expectedHash}, deleting file", entry?.Hash, file.Hash); + File.Delete(filePath); + _fileDbManager.RemoveHash(entry); + } } catch (Exception ex) {