Small fixes to SDK (#347)

* Increase channel capacity to make things more performant

* Avoid logging send cancellation exceptions, caller did it

* Try to avoid collection modified errors when cancelling by more aggressive checks

* oops, rethrow, don't catch
This commit is contained in:
Adam Hathcock
2025-06-30 11:37:30 +01:00
committed by GitHub
parent 80c4f694ec
commit b97702adb1
4 changed files with 20 additions and 7 deletions
@@ -5,7 +5,7 @@ namespace Speckle.Sdk.Dependencies.Serialization;
public abstract class ChannelLoader<T>(CancellationToken cancellationToken)
{
private const int RECEIVE_CAPACITY = 5000;
private const int RECEIVE_CAPACITY = 10000;
private const int HTTP_GET_CHUNK_SIZE = 500;
private const int MAX_PARALLELISM_HTTP = 4;
@@ -8,7 +8,7 @@ namespace Speckle.Sdk.Dependencies.Serialization;
public abstract class ChannelSaver<T>
where T : IHasByteSize
{
private const int SEND_CAPACITY = 1000;
private const int SEND_CAPACITY = 10000;
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;
@@ -47,6 +47,11 @@ public partial class Operations
receiveActivity?.SetStatus(SdkActivityStatusCode.Ok);
return results;
}
catch (OperationCanceledException)
{
//this is handled by the caller
throw;
}
catch (Exception ex)
{
receiveActivity?.SetStatus(SdkActivityStatusCode.Error);
@@ -226,9 +226,17 @@ public sealed class SerializeProcess(
var childClosures = _childClosurePool.Get();
foreach (var childClosure in taskClosures)
{
if (_processSource.Token.IsCancellationRequested)
{
return EMPTY_CLOSURES;
}
foreach (var kvp in childClosure)
{
childClosures[kvp.Key] = kvp.Value;
if (_processSource.Token.IsCancellationRequested)
{
return EMPTY_CLOSURES;
}
}
_currentClosurePool.Return(childClosure);
@@ -253,13 +261,13 @@ public sealed class SerializeProcess(
progress?.Report(new(ProgressEvent.FromCacheOrSerialized, _objectCount, Math.Max(_objectCount, _objectsFound)));
foreach (var item in items)
{
if (_processSource.Token.IsCancellationRequested)
{
return EMPTY_CLOSURES;
}
if (item.NeedsStorage)
{
if (_processSource.Token.IsCancellationRequested)
{
return EMPTY_CLOSURES;
}
Interlocked.Increment(ref _objectsSerialized);
await objectSaver.SaveAsync(item).ConfigureAwait(false);
}