From db7d994039b83b8d81a3de04de5e7f96e6907af1 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 10 Nov 2025 02:06:21 +0800 Subject: [PATCH] :bug: Fix bugs --- .../Storage/PersistentTaskService.cs | 68 +++++++++++-------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/DysonNetwork.Drive/Storage/PersistentTaskService.cs b/DysonNetwork.Drive/Storage/PersistentTaskService.cs index 1e9a349..1e762e3 100644 --- a/DysonNetwork.Drive/Storage/PersistentTaskService.cs +++ b/DysonNetwork.Drive/Storage/PersistentTaskService.cs @@ -697,30 +697,38 @@ public class PersistentTaskService( { var previousProgress = task.ChunksCount > 0 ? (double)task.ChunksUploaded / task.ChunksCount * 100 : 0; - // Use ExecuteUpdateAsync for better performance - update only the fields we need - var now = SystemClock.Instance.GetCurrentInstant(); - var updatedRows = await db.Tasks - .OfType() - .Where(t => t.TaskId == taskId) - .ExecuteUpdateAsync(setters => setters - .SetProperty(t => t.UploadedChunks, t => t.UploadedChunks.Append(chunkIndex).Distinct().ToList()) - .SetProperty(t => t.ChunksUploaded, t => t.UploadedChunks.Count) - .SetProperty(t => t.LastActivity, now) - .SetProperty(t => t.UpdatedAt, now) - ); - - if (updatedRows > 0) + // Get current parameters and update them directly + var parameters = task.TypedParameters; + if (!parameters.UploadedChunks.Contains(chunkIndex)) { - // Update the cached task - task.UploadedChunks.Add(chunkIndex); - task.ChunksUploaded = task.UploadedChunks.Count; - task.LastActivity = now; - task.UpdatedAt = now; - await SetCacheAsync(task); + parameters.UploadedChunks.Add(chunkIndex); + parameters.ChunksUploaded = parameters.UploadedChunks.Count; + + var now = SystemClock.Instance.GetCurrentInstant(); - // Send real-time progress update - var newProgress = task.ChunksCount > 0 ? (double)task.ChunksUploaded / task.ChunksCount * 100 : 0; - await SendUploadProgressUpdateAsync(task, newProgress, previousProgress); + // Use ExecuteUpdateAsync to update the Parameters dictionary directly + var updatedRows = await db.Tasks + .OfType() + .Where(t => t.TaskId == taskId) + .ExecuteUpdateAsync(setters => setters + .SetProperty(t => t.Parameters, ParameterHelper.Untyped(parameters)) + .SetProperty(t => t.LastActivity, now) + .SetProperty(t => t.UpdatedAt, now) + ); + + if (updatedRows > 0) + { + // Update the cached task + task.UploadedChunks.Add(chunkIndex); + task.ChunksUploaded = task.UploadedChunks.Count; + task.LastActivity = now; + task.UpdatedAt = now; + await SetCacheAsync(task); + + // Send real-time progress update + var newProgress = task.ChunksCount > 0 ? (double)task.ChunksUploaded / task.ChunksCount * 100 : 0; + await SendUploadProgressUpdateAsync(task, newProgress, previousProgress); + } } } } @@ -822,13 +830,13 @@ public class PersistentTaskService( var stats = new UserUploadStats { TotalTasks = tasks.Count, - InProgressTasks = tasks.Count(t => t.Status == Model.TaskStatus.InProgress), - CompletedTasks = tasks.Count(t => t.Status == Model.TaskStatus.Completed), - FailedTasks = tasks.Count(t => t.Status == Model.TaskStatus.Failed), - ExpiredTasks = tasks.Count(t => t.Status == Model.TaskStatus.Expired), - TotalUploadedBytes = tasks.Sum(t => (long)t.ChunksUploaded * t.ChunkSize), - AverageProgress = tasks.Any(t => t.Status == Model.TaskStatus.InProgress) - ? tasks.Where(t => t.Status == Model.TaskStatus.InProgress) + InProgressTasks = tasks.Count(t => t.Status == TaskStatus.InProgress), + CompletedTasks = tasks.Count(t => t.Status == TaskStatus.Completed), + FailedTasks = tasks.Count(t => t.Status == TaskStatus.Failed), + ExpiredTasks = tasks.Count(t => t.Status == TaskStatus.Expired), + TotalUploadedBytes = tasks.Sum(t => t.ChunksUploaded * t.ChunkSize), + AverageProgress = tasks.Any(t => t.Status == TaskStatus.InProgress) + ? tasks.Where(t => t.Status == TaskStatus.InProgress) .Average(t => t.ChunksCount > 0 ? (double)t.ChunksUploaded / t.ChunksCount * 100 : 0) : 0, RecentActivity = tasks.OrderByDescending(t => t.LastActivity) @@ -1158,4 +1166,4 @@ public class RecentActivity public double Progress { get; set; } } -#endregion \ No newline at end of file +#endregion