From 536e58aacc4d2bb21ee89b1d4f451e84ff5598fd Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 25 Apr 2025 17:45:01 +0100 Subject: [PATCH] Don't drop items to write when sending fast --- src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs | 7 +++---- src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs | 6 +++--- src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs index 45a0b93d..1f3efe84 100644 --- a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs +++ b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs @@ -8,7 +8,7 @@ namespace Speckle.Sdk.Dependencies.Serialization; public abstract class ChannelSaver where T : IHasByteSize { - private const int SEND_CAPACITY = 500; + private const int SEND_CAPACITY = 5000; private const int HTTP_SEND_CHUNK_SIZE = 25_000_000; //bytes private static readonly TimeSpan HTTP_BATCH_TIMEOUT = TimeSpan.FromSeconds(2); private const int MAX_PARALLELISM_HTTP = 4; @@ -68,14 +68,13 @@ public abstract class ChannelSaver TaskScheduler.Current ); - public void Save(T item) + public async Task SaveAsync(T item, CancellationToken cancellationToken) { if (Exception is not null) { return; //don't save if we're already done through an error } - // ReSharper disable once MethodSupportsCancellation - _checkCacheChannel.Writer.TryWrite(item); + await _checkCacheChannel.Writer.WriteAsync(item, cancellationToken).ConfigureAwait(false); } private async Task> SendToServer(IMemoryOwner batch) diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs b/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs index f797c3c2..d54f2d32 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs @@ -12,7 +12,7 @@ public interface IObjectSaver : IDisposable Task Start(int? maxParallelism, int? httpBatchSize, int? cacheBatchSize, CancellationToken cancellationToken); void DoneTraversing(); Task DoneSaving(); - void SaveItem(BaseItem item); + Task SaveAsync(BaseItem item); long Uploaded { get; } long Cached { get; } } @@ -81,10 +81,10 @@ public sealed class ObjectSaver( } } - public void SaveItem(BaseItem item) + public async Task SaveAsync(BaseItem item) { Interlocked.Increment(ref _objectsSerialized); - Save(item); + await SaveAsync(item, _cancellationTokenSource.Token).ConfigureAwait(false); } public override void SaveToCache(List batch) diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs index 92bc6478..28fae019 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs @@ -258,7 +258,7 @@ public sealed class SerializeProcess( } Interlocked.Increment(ref _objectsSerialized); - objectSaver.SaveItem(item); + await objectSaver.SaveAsync(item).ConfigureAwait(false); } if (!currentClosures.ContainsKey(item.Id))