about summary refs log tree commit diff
path: root/LibMatrix/Extensions/MatrixHttpClient.Single.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-03-20 07:32:14 +0100
committerRory& <root@rory.gay>2026-03-20 07:32:14 +0100
commit4ba55ade162c1658185208b9dd5b3585677ba030 (patch)
treee8a56973d0655f4672ad477546adb1710407072c /LibMatrix/Extensions/MatrixHttpClient.Single.cs
parentRoomBuilder: use chunked bulk sends to handle larger initial states (diff)
downloadLibMatrix-4ba55ade162c1658185208b9dd5b3585677ba030.tar.xz
MatrixHttpClient: switch retries to ConcurrentDictionary (hopefully)
Diffstat (limited to '')
-rw-r--r--LibMatrix/Extensions/MatrixHttpClient.Single.cs10
1 files changed, 8 insertions, 2 deletions
diff --git a/LibMatrix/Extensions/MatrixHttpClient.Single.cs b/LibMatrix/Extensions/MatrixHttpClient.Single.cs

index cd82071..ae18b2d 100644 --- a/LibMatrix/Extensions/MatrixHttpClient.Single.cs +++ b/LibMatrix/Extensions/MatrixHttpClient.Single.cs
@@ -1,5 +1,6 @@ #define SINGLE_HTTPCLIENT // Use a single HttpClient instance for all MatrixHttpClient instances // #define SYNC_HTTPCLIENT // Only allow one request as a time, for debugging +using System.Collections.Concurrent; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Net; @@ -70,7 +71,7 @@ public class MatrixHttpClient { public int MaxRetryIntervalMs { get; set; } = DefaultMaxRetryIntervalMs; public int MaxRetries { get; set; } = DefaultMaxRetries; - private Dictionary<HttpRequestMessage, int> _retries = []; + private readonly ConcurrentDictionary<HttpRequestMessage, int> _retries = []; // default headers, not bound to client public HttpRequestHeaders DefaultRequestHeaders { get; set; } = @@ -224,7 +225,12 @@ public class MatrixHttpClient { } if (responseMessage.IsSuccessStatusCode) { - _retries.Remove(request); + while (!_retries.TryRemove(request, out _)) { + Console.WriteLine("[MatrixHttpClient] Race - failed to remove retries entry, retrying..."); + // ReSharper disable once MethodSupportsCancellation - this shouldn't be cancellable as it would be a memory leak + await Task.Delay(5); // hopefully helps resolve contention? + } + return responseMessage; }