* 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
63 lines
2.1 KiB
C#
63 lines
2.1 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Duplicati.Library.Interface;
|
|
|
|
namespace Duplicati.Library.Main.Backend;
|
|
|
|
#nullable enable
|
|
|
|
partial class BackendManager
|
|
{
|
|
/// <summary>
|
|
/// Represents a pending LIST operation
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Creates a new ListOperation
|
|
/// </remarks>
|
|
/// <param name="context">The execution context</param>
|
|
/// <param name="cancelToken">The cancellation token</param>
|
|
private class ListOperation(ExecuteContext context, CancellationToken cancelToken)
|
|
: PendingOperation<List<IFileEntry>>(context, true, cancelToken)
|
|
{
|
|
/// <summary>
|
|
/// The operation type
|
|
/// </summary>
|
|
public override BackendActionType Operation => BackendActionType.List;
|
|
|
|
/// <summary>
|
|
/// Executes the operation
|
|
/// </summary>
|
|
/// <param name="backend">The backend to list</param>
|
|
/// <param name="cancelToken">The cancellation token</param>
|
|
/// <returns>An awaitable task</returns>
|
|
public override Task<List<IFileEntry>> ExecuteAsync(IBackend backend, CancellationToken cancelToken)
|
|
{
|
|
Context.Statwriter.SendEvent(BackendActionType.List, BackendEventType.Started, null, -1);
|
|
|
|
var r = backend.List().ToList();
|
|
|
|
// TODO: Investigate better way to solve this so we do not use memory for large lists
|
|
var sb = new StringBuilder();
|
|
sb.AppendLine("[");
|
|
long count = 0;
|
|
foreach (var e in r)
|
|
{
|
|
if (count != 0)
|
|
sb.AppendLine(",");
|
|
count++;
|
|
sb.Append(System.Text.Json.JsonSerializer.Serialize(e));
|
|
}
|
|
|
|
sb.AppendLine();
|
|
sb.Append("]");
|
|
Context.Database.LogRemoteOperation("list", "", sb.ToString());
|
|
|
|
Context.Statwriter.SendEvent(BackendActionType.List, BackendEventType.Completed, null, r.Count);
|
|
|
|
return Task.FromResult(r);
|
|
}
|
|
}
|
|
} |