From b5bf0a8ac48737f1907c043379579d696f0d19a6 Mon Sep 17 00:00:00 2001 From: Salvador Cipolla Date: Tue, 24 Mar 2026 00:16:26 -0300 Subject: [PATCH] Retry file uploads final verify and expose value to UI --- Knossos.NET/Models/GlobalSettings.cs | 3 +++ Knossos.NET/Models/Nebula.cs | 20 +++++++++++++++---- .../ViewModels/GlobalSettingsViewModel.cs | 9 +++++++++ Knossos.NET/Views/GlobalSettingsView.axaml | 5 +++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Knossos.NET/Models/GlobalSettings.cs b/Knossos.NET/Models/GlobalSettings.cs index 8b8fcfb2..c2209df2 100644 --- a/Knossos.NET/Models/GlobalSettings.cs +++ b/Knossos.NET/Models/GlobalSettings.cs @@ -133,6 +133,8 @@ public StandaloneServerSettings(MultiCfg multiCfg, string id, string version, in public bool forceSSE2 { get; set; } = false; [JsonPropertyName("max_concurrent_subtasks")] public int maxConcurrentSubtasks { get; set; } = 3; + [JsonPropertyName("max_upload_retries")] + public int maxUploadRetries { get; set; } = 4; [JsonPropertyName("max_download_speed")] public long maxDownloadSpeed { get; set; } = 0; [JsonPropertyName("mirror_blacklist")] @@ -730,6 +732,7 @@ public void Load() ignoredLauncherUpdates = tempSettings.ignoredLauncherUpdates; hiddenModIds = tempSettings.hiddenModIds; antiStuck = tempSettings.antiStuck; + maxUploadRetries = tempSettings.maxUploadRetries; if (hiddenModIds.Any()) { foreach (var hiddenMod in hiddenModIds) diff --git a/Knossos.NET/Models/Nebula.cs b/Knossos.NET/Models/Nebula.cs index 87805ee6..8c47bdc7 100644 --- a/Knossos.NET/Models/Nebula.cs +++ b/Knossos.NET/Models/Nebula.cs @@ -1743,7 +1743,7 @@ public static async Task IsFileUploaded(string? checksum = null, string? c public class MultipartUploader { private static readonly int maxUploadParallelism = 3; - private static readonly int maxUploadRetries = 4; + private static readonly int maxUploadRetries = Knossos.globalSettings.maxUploadRetries; private static readonly long partMaxSize = 10485760; //10MB private List fileParts = new List(); private CancellationTokenSource cancellationTokenSource; @@ -1852,10 +1852,22 @@ public async Task Upload() if (cancellationTokenSource.IsCancellationRequested) throw new TaskCanceledException(); - verified = await Finish(); + int attempt = 1; + do + { + verified = await Finish(); + + if (verified && progressCallback != null) + progressCallback.Invoke("Verify: " + verified, maxProgress, maxProgress); + + if (!verified && progressCallback != null && attempt <= maxUploadRetries) + { + Log.Add(Log.LogSeverity.Warning, "Nebula.Upload", "File failed nebula upload verify, retrying: " + fileFullPath); + progressCallback.Invoke("Verify: Failed, Retrying... Retry #" + attempt, maxProgress, maxProgress); + await Task.Delay(2000); + } - if (verified && progressCallback != null) - progressCallback.Invoke("Verify: " + verified, maxProgress, maxProgress); + } while (!verified && attempt++ <= maxUploadRetries); return verified; } diff --git a/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs b/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs index 8e9188eb..67326168 100644 --- a/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs +++ b/Knossos.NET/ViewModels/GlobalSettingsViewModel.cs @@ -127,6 +127,13 @@ internal int MaxConcurrentSubtasks set { if (maxConcurrentSubtasks != value) { this.SetProperty(ref maxConcurrentSubtasks, value); UnCommitedChanges = true; } } } + private int maxUploadsRetries = 4; + internal int MaxUploadsRetries + { + get { return maxUploadsRetries; } + set { if (maxUploadsRetries != value) { this.SetProperty(ref maxUploadsRetries, value); UnCommitedChanges = true; } } + } + private long maxDownloadSpeedIndex = 0; internal long MaxDownloadSpeedIndex { @@ -677,6 +684,7 @@ public void LoadData() ShowDevOptions = Knossos.globalSettings.showDevOptions || NoSystemCMD; CloseToTray = Knossos.globalSettings.closeToTray; AntiStuck = Knossos.globalSettings.antiStuck; + MaxUploadsRetries = Knossos.globalSettings.maxUploadRetries; /* VIDEO SETTINGS */ //RESOLUTION @@ -1258,6 +1266,7 @@ internal void SaveCommand() Knossos.globalSettings.showDevOptions = ShowDevOptions; Knossos.globalSettings.closeToTray = CloseToTray; Knossos.globalSettings.antiStuck = AntiStuck; + Knossos.globalSettings.maxUploadRetries = MaxUploadsRetries; /* VIDEO */ //Resolution diff --git a/Knossos.NET/Views/GlobalSettingsView.axaml b/Knossos.NET/Views/GlobalSettingsView.axaml index 55fa3fa8..2d564098 100644 --- a/Knossos.NET/Views/GlobalSettingsView.axaml +++ b/Knossos.NET/Views/GlobalSettingsView.axaml @@ -101,6 +101,11 @@ 4 + + + Max Upload Retries + + Bandwidth Limit