From 69a7a714cdfcba238f8cf55d668de4eae5bc54dd Mon Sep 17 00:00:00 2001 From: JKorf Date: Mon, 11 Sep 2023 20:16:50 +0200 Subject: [PATCH] Updated rate limiters to support multiple instances --- CryptoExchange.Net/Objects/RateLimiter.cs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CryptoExchange.Net/Objects/RateLimiter.cs b/CryptoExchange.Net/Objects/RateLimiter.cs index 8219b4b..9667123 100644 --- a/CryptoExchange.Net/Objects/RateLimiter.cs +++ b/CryptoExchange.Net/Objects/RateLimiter.cs @@ -117,10 +117,10 @@ namespace CryptoExchange.Net.Objects { int totalWaitTime = 0; - EndpointRateLimiter? endpointLimit; + List endpointLimits; lock (_limiterLock) - endpointLimit = _limiters.OfType().SingleOrDefault(h => h.Endpoints.Contains(endpoint) && (h.Method == null || h.Method == method)); - if(endpointLimit != null) + endpointLimits = _limiters.OfType().Where(h => h.Endpoints.Contains(endpoint) && (h.Method == null || h.Method == method)).ToList(); + foreach (var endpointLimit in endpointLimits) { var waitResult = await ProcessTopic(logger, endpointLimit, endpoint, requestWeight, limitBehaviour, ct).ConfigureAwait(false); if (!waitResult) @@ -129,7 +129,7 @@ namespace CryptoExchange.Net.Objects totalWaitTime += waitResult.Data; } - if (endpointLimit?.IgnoreOtherRateLimits == true) + if (endpointLimits.Any(l => l.IgnoreOtherRateLimits)) return new CallResult(totalWaitTime); List partialEndpointLimits; @@ -169,10 +169,10 @@ namespace CryptoExchange.Net.Objects if(partialEndpointLimits.Any(p => p.IgnoreOtherRateLimits)) return new CallResult(totalWaitTime); - ApiKeyRateLimiter? apiLimit; + List apiLimits; lock (_limiterLock) - apiLimit = _limiters.OfType().SingleOrDefault(h => h.Type == RateLimitType.ApiKey); - if (apiLimit != null) + apiLimits = _limiters.OfType().Where(h => h.Type == RateLimitType.ApiKey).ToList(); + foreach (var apiLimit in apiLimits) { if(apiKey == null) { @@ -206,13 +206,13 @@ namespace CryptoExchange.Net.Objects } } - if ((signed || apiLimit?.OnlyForSignedRequests == false) && apiLimit?.IgnoreTotalRateLimit == true) + if ((signed || apiLimits.All(l => !l.OnlyForSignedRequests)) && apiLimits.Any(l => l.IgnoreTotalRateLimit)) return new CallResult(totalWaitTime); - TotalRateLimiter? totalLimit; + List totalLimits; lock (_limiterLock) - totalLimit = _limiters.OfType().SingleOrDefault(); - if (totalLimit != null) + totalLimits = _limiters.OfType().ToList(); + foreach(var totalLimit in totalLimits) { var waitResult = await ProcessTopic(logger, totalLimit, endpoint, requestWeight, limitBehaviour, ct).ConfigureAwait(false); if (!waitResult)