Files
duplicati/Duplicati/Library/Main/Backend/BackendManager.ProgressHandler.cs
T
Kenneth SkovhedeandGitHub d99f74ed94 Rewrite the backend manager. (#5896)
* Rewrite the backend manager.

This creates a new more logic backend manager that handles all backend operations.

For each top-level operation, there is now a single backend manager instance that is passed to sub-commands.

The internals of the backend manager are now rewritten to use async logic instead of threading.

The design uses a single task runner that dispatches operations and honors concurrent settings and limits from one place.

The logic for each operation has been moved into a separate files/classes to make it easier to understand each operation.

This fixes #5804

* Fixed a few issues with not awaiting tasks

* Fixed not creating empty databases

* Fixed an issue with hashes not being recorded on download

* Reworked the download logic to avoid attempting to decrypt the file if it has been modified.

* Review fixes

* Renamed db collector to better reflect the purpose.

* Review fixes
2025-01-28 08:54:50 +01:00

54 lines
1.9 KiB
C#

using Duplicati.Library.Main.Operation.Common;
using Duplicati.Library.Utility;
namespace Duplicati.Library.Main.Backend;
#nullable enable
partial class BackendManager
{
/// <summary>
/// Represents a pending QuotaInfo operation
/// </summary>
private sealed record ProgressHandler(Options Options, IBackendWriter Stats, ITaskReader TaskReader)
{
/// <summary>
/// Stores the last throttle values
/// </summary>
/// <param name="Upload">The upload throttle value</param>
/// <param name="Download">The download throttle value</param>
private sealed record ThrottleValues(string? Upload, string? Download);
/// <summary>
/// The last throttle values
/// </summary>
private ThrottleValues lastThrottleValue = new(string.Empty, string.Empty);
/// <summary>
/// Handles the progress of a throttled stream
/// </summary>
/// <param name="ts">The throttled stream</param>
/// <param name="pg">The progress</param>
/// <param name="filename">The filename</param>
public void HandleProgress(ThrottledStream ts, long pg, string filename)
{
// This pauses and throws on cancellation, but ignores stop
TaskReader.TransferRendevouz().Await();
var prev = lastThrottleValue;
// Update the throttle speeds if they have changed
Options.RawOptions.TryGetValue("throttle-upload", out var tmpUpload);
Options.RawOptions.TryGetValue("throttle-download", out var tmpDownload);
if (tmpUpload != prev.Upload || tmpDownload != prev.Download)
{
ts.WriteSpeed = Options.MaxUploadPrSecond;
ts.ReadSpeed = Options.MaxDownloadPrSecond;
lastThrottleValue = new(tmpUpload, tmpDownload);
}
Stats.BackendProgressUpdater.UpdateProgress(pg);
}
}
}