diff --git a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs index 45a0b93d..89bd97f7 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 = 1000; 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,15 @@ 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); + //can switch to check then try pattern when back pressure is needed or exceptions are too much + //the trees don't need to respond to back pressure + 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..f325e1f4 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs @@ -12,9 +12,7 @@ public interface IObjectSaver : IDisposable Task Start(int? maxParallelism, int? httpBatchSize, int? cacheBatchSize, CancellationToken cancellationToken); void DoneTraversing(); Task DoneSaving(); - void SaveItem(BaseItem item); - long Uploaded { get; } - long Cached { get; } + Task SaveAsync(BaseItem item); } public sealed class ObjectSaver( @@ -40,8 +38,6 @@ public sealed class ObjectSaver( private long _cached; private long _objectsSerialized; - public long Cached => _cached; - public long Uploaded => _uploaded; protected override async Task SendToServerInternal(Batch batch) { @@ -81,10 +77,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))