more uploads fixes
This commit is contained in:
@@ -53,19 +53,22 @@ public class DownloadUi : Window, IDisposable
|
|||||||
if (_apiController.CurrentUploads.Any())
|
if (_apiController.CurrentUploads.Any())
|
||||||
{
|
{
|
||||||
var currentUploads = _apiController.CurrentUploads.ToList();
|
var currentUploads = _apiController.CurrentUploads.ToList();
|
||||||
var doneUploads = currentUploads.Count(c => c.IsTransferred);
|
|
||||||
var totalUploads = currentUploads.Count;
|
var totalUploads = currentUploads.Count;
|
||||||
|
|
||||||
|
var doneUploads = currentUploads.Count(c => c.IsTransferred);
|
||||||
var totalUploaded = currentUploads.Sum(c => c.Transferred);
|
var totalUploaded = currentUploads.Sum(c => c.Transferred);
|
||||||
var totalToUpload = currentUploads.Sum(c => c.Total);
|
var totalToUpload = currentUploads.Sum(c => c.Total);
|
||||||
|
|
||||||
UiShared.DrawOutlinedFont(drawList, "▲",
|
UiShared.DrawOutlinedFont(drawList, "▲",
|
||||||
new Vector2(basePosition.X + 0, basePosition.Y + (int)(yDistance * 0.5)),
|
new Vector2(basePosition.X + 0, basePosition.Y + (int)(yDistance * 0.5)),
|
||||||
UiShared.Color(255, 255, 255, 255), UiShared.Color(0, 0, 0, 255), 2);
|
UiShared.Color(255, 255, 255, 255), UiShared.Color(0, 0, 0, 255), 2);
|
||||||
UiShared.DrawOutlinedFont(drawList, $"Uploading {doneUploads}/{totalUploads}",
|
UiShared.DrawOutlinedFont(drawList, $"Compressing+Uploading {doneUploads}/{totalUploads}",
|
||||||
new Vector2(basePosition.X + xDistance, basePosition.Y + yDistance * 0),
|
new Vector2(basePosition.X + xDistance, basePosition.Y + yDistance * 0),
|
||||||
UiShared.Color(255, 255, 255, 255), UiShared.Color(0, 0, 0, 255), 2);
|
UiShared.Color(255, 255, 255, 255), UiShared.Color(0, 0, 0, 255), 2);
|
||||||
UiShared.DrawOutlinedFont(drawList, $"{UiShared.ByteToString(totalUploaded)}/{UiShared.ByteToString(totalToUpload)}",
|
UiShared.DrawOutlinedFont(drawList, $"{UiShared.ByteToString(totalUploaded)}/{UiShared.ByteToString(totalToUpload)}",
|
||||||
new Vector2(basePosition.X + xDistance, basePosition.Y + yDistance * 1),
|
new Vector2(basePosition.X + xDistance, basePosition.Y + yDistance * 1),
|
||||||
UiShared.Color(255, 255, 255, 255), UiShared.Color(0, 0, 0, 255), 2);
|
UiShared.Color(255, 255, 255, 255), UiShared.Color(0, 0, 0, 255), 2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_apiController.CurrentDownloads.Any())
|
if (_apiController.CurrentDownloads.Any())
|
||||||
|
|||||||
@@ -3,10 +3,9 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Dalamud.Logging;
|
|
||||||
using LZ4;
|
using LZ4;
|
||||||
using MareSynchronos.API;
|
using MareSynchronos.API;
|
||||||
using MareSynchronos.FileCacheDB;
|
using MareSynchronos.FileCacheDB;
|
||||||
@@ -162,6 +161,7 @@ namespace MareSynchronos.WebAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var totalSize = CurrentUploads.Sum(c => c.Total);
|
||||||
Logger.Verbose("Compressing and uploading files");
|
Logger.Verbose("Compressing and uploading files");
|
||||||
foreach (var file in CurrentUploads.Where(f => f.CanBeTransferred && !f.IsTransferred))
|
foreach (var file in CurrentUploads.Where(f => f.CanBeTransferred && !f.IsTransferred))
|
||||||
{
|
{
|
||||||
@@ -175,6 +175,12 @@ namespace MareSynchronos.WebAPI
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CurrentUploads.Any())
|
||||||
|
{
|
||||||
|
var compressedSize = CurrentUploads.Sum(c => c.Total);
|
||||||
|
Logger.Debug($"Compressed {totalSize} to {compressedSize} ({(compressedSize / (double)totalSize):P2})");
|
||||||
|
}
|
||||||
|
|
||||||
Logger.Verbose("Upload tasks complete, waiting for server to confirm");
|
Logger.Verbose("Upload tasks complete, waiting for server to confirm");
|
||||||
var anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken);
|
var anyUploadsOpen = await _fileHub!.InvokeAsync<bool>("IsUploadFinished", uploadToken);
|
||||||
Logger.Verbose("Uploads open: " + anyUploadsOpen);
|
Logger.Verbose("Uploads open: " + anyUploadsOpen);
|
||||||
@@ -213,21 +219,21 @@ namespace MareSynchronos.WebAPI
|
|||||||
{
|
{
|
||||||
if (uploadToken.IsCancellationRequested) return;
|
if (uploadToken.IsCancellationRequested) return;
|
||||||
|
|
||||||
async IAsyncEnumerable<byte[]> AsyncFileData()
|
async IAsyncEnumerable<byte[]> AsyncFileData([EnumeratorCancellation] CancellationToken token)
|
||||||
{
|
{
|
||||||
var chunkSize = 1024 * 512; // 512kb
|
var chunkSize = 1024 * 512; // 512kb
|
||||||
using var ms = new MemoryStream(compressedFile);
|
using var ms = new MemoryStream(compressedFile);
|
||||||
var buffer = new byte[chunkSize];
|
var buffer = new byte[chunkSize];
|
||||||
int bytesRead;
|
int bytesRead;
|
||||||
while ((bytesRead = await ms.ReadAsync(buffer, 0, chunkSize, uploadToken)) > 0)
|
while ((bytesRead = await ms.ReadAsync(buffer, 0, chunkSize, token)) > 0 && !token.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
CurrentUploads.Single(f => f.Hash == fileHash).Transferred += bytesRead;
|
CurrentUploads.Single(f => f.Hash == fileHash).Transferred += bytesRead;
|
||||||
uploadToken.ThrowIfCancellationRequested();
|
token.ThrowIfCancellationRequested();
|
||||||
yield return bytesRead == chunkSize ? buffer.ToArray() : buffer.Take(bytesRead).ToArray();
|
yield return bytesRead == chunkSize ? buffer.ToArray() : buffer.Take(bytesRead).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await _fileHub!.SendAsync("UploadFileStreamAsync", fileHash, AsyncFileData(), uploadToken);
|
await _fileHub!.SendAsync("UploadFileStreamAsync", fileHash, AsyncFileData(uploadToken), uploadToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MareSynchronos.API;
|
|
||||||
using MareSynchronos.FileCacheDB;
|
|
||||||
using MareSynchronos.Utils;
|
using MareSynchronos.Utils;
|
||||||
using MareSynchronos.WebAPI.Utils;
|
|
||||||
using Microsoft.AspNetCore.SignalR.Client;
|
using Microsoft.AspNetCore.SignalR.Client;
|
||||||
|
|
||||||
namespace MareSynchronos.WebAPI
|
namespace MareSynchronos.WebAPI
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ namespace MareSynchronos.WebAPI
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (_dalamudUtil.PlayerCharacter == null) throw new ArgumentException("Player not initialized");
|
||||||
Logger.Debug("Building connection");
|
Logger.Debug("Building connection");
|
||||||
_heartbeatHub = BuildHubConnection("heartbeat");
|
_heartbeatHub = BuildHubConnection("heartbeat");
|
||||||
_userHub = BuildHubConnection("user");
|
_userHub = BuildHubConnection("user");
|
||||||
@@ -184,7 +185,7 @@ namespace MareSynchronos.WebAPI
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.Warn(ex.Message);
|
Logger.Warn(ex.Message);
|
||||||
Logger.Warn(ex.StackTrace);
|
Logger.Warn(ex.StackTrace ?? string.Empty);
|
||||||
Logger.Debug("Failed to establish connection, retrying");
|
Logger.Debug("Failed to establish connection, retrying");
|
||||||
await Task.Delay(TimeSpan.FromSeconds(5), token);
|
await Task.Delay(TimeSpan.FromSeconds(5), token);
|
||||||
}
|
}
|
||||||
@@ -227,6 +228,9 @@ namespace MareSynchronos.WebAPI
|
|||||||
|
|
||||||
private Task HeartbeatHubOnClosed(Exception? arg)
|
private Task HeartbeatHubOnClosed(Exception? arg)
|
||||||
{
|
{
|
||||||
|
CurrentUploads.Clear();
|
||||||
|
CurrentDownloads.Clear();
|
||||||
|
_uploadCancellationTokenSource?.Cancel();
|
||||||
Logger.Debug("Connection closed");
|
Logger.Debug("Connection closed");
|
||||||
Disconnected?.Invoke(null, EventArgs.Empty);
|
Disconnected?.Invoke(null, EventArgs.Empty);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
@@ -243,14 +247,17 @@ namespace MareSynchronos.WebAPI
|
|||||||
|
|
||||||
private Task HeartbeatHubOnReconnecting(Exception? arg)
|
private Task HeartbeatHubOnReconnecting(Exception? arg)
|
||||||
{
|
{
|
||||||
Logger.Debug("Connection closed... Reconnecting…");
|
CurrentUploads.Clear();
|
||||||
|
CurrentDownloads.Clear();
|
||||||
|
_uploadCancellationTokenSource?.Cancel();
|
||||||
|
Logger.Debug("Connection closed... Reconnecting");
|
||||||
Disconnected?.Invoke(null, EventArgs.Empty);
|
Disconnected?.Invoke(null, EventArgs.Empty);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task StopAllConnections(CancellationToken token)
|
private async Task StopAllConnections(CancellationToken token)
|
||||||
{
|
{
|
||||||
if (_heartbeatHub is { State: HubConnectionState.Connected or HubConnectionState.Connecting or HubConnectionState.Reconnecting })
|
if (_heartbeatHub is not null)
|
||||||
{
|
{
|
||||||
await _heartbeatHub.StopAsync(token);
|
await _heartbeatHub.StopAsync(token);
|
||||||
_heartbeatHub.Closed -= HeartbeatHubOnClosed;
|
_heartbeatHub.Closed -= HeartbeatHubOnClosed;
|
||||||
@@ -260,21 +267,21 @@ namespace MareSynchronos.WebAPI
|
|||||||
_heartbeatHub = null;
|
_heartbeatHub = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_fileHub is { State: HubConnectionState.Connected or HubConnectionState.Connecting or HubConnectionState.Reconnecting })
|
if (_fileHub is not null)
|
||||||
{
|
{
|
||||||
await _fileHub.StopAsync(token);
|
await _fileHub.StopAsync(token);
|
||||||
await _fileHub.DisposeAsync();
|
await _fileHub.DisposeAsync();
|
||||||
_fileHub = null;
|
_fileHub = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_userHub is { State: HubConnectionState.Connected or HubConnectionState.Connecting or HubConnectionState.Reconnecting })
|
if (_userHub is not null)
|
||||||
{
|
{
|
||||||
await _userHub.StopAsync(token);
|
await _userHub.StopAsync(token);
|
||||||
await _userHub.DisposeAsync();
|
await _userHub.DisposeAsync();
|
||||||
_userHub = null;
|
_userHub = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_adminHub is { State: HubConnectionState.Connected or HubConnectionState.Connecting or HubConnectionState.Reconnecting })
|
if (_adminHub is not null)
|
||||||
{
|
{
|
||||||
await _adminHub.StopAsync(token);
|
await _adminHub.StopAsync(token);
|
||||||
await _adminHub.DisposeAsync();
|
await _adminHub.DisposeAsync();
|
||||||
|
|||||||
Reference in New Issue
Block a user