* 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
54 lines
1.9 KiB
C#
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);
|
|
}
|
|
}
|
|
} |