From f3b5289610db5f0b54c73ff5ec0cd80e51f1ae94 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Thu, 25 May 2023 11:25:02 -0400 Subject: [PATCH] 20511: Limit server-to-server client to 1/4 of API req capacity. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- sdk/go/arvados/client.go | 11 ++++++----- sdk/go/arvados/limiter.go | 4 ++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sdk/go/arvados/client.go b/sdk/go/arvados/client.go index d1a87e30e8..6316d1beda 100644 --- a/sdk/go/arvados/client.go +++ b/sdk/go/arvados/client.go @@ -142,11 +142,12 @@ func NewClientFromConfig(cluster *Cluster) (*Client, error) { } } return &Client{ - Client: hc, - Scheme: ctrlURL.Scheme, - APIHost: ctrlURL.Host, - Insecure: cluster.TLS.Insecure, - Timeout: 5 * time.Minute, + Client: hc, + Scheme: ctrlURL.Scheme, + APIHost: ctrlURL.Host, + Insecure: cluster.TLS.Insecure, + Timeout: 5 * time.Minute, + requestLimiter: requestLimiter{maxlimit: int64(cluster.API.MaxConcurrentRequests / 4)}, }, nil } diff --git a/sdk/go/arvados/limiter.go b/sdk/go/arvados/limiter.go index 0fc6cc0964..dc944160ab 100644 --- a/sdk/go/arvados/limiter.go +++ b/sdk/go/arvados/limiter.go @@ -21,6 +21,7 @@ var ( type requestLimiter struct { current int64 limit int64 + maxlimit int64 lock sync.Mutex cond *sync.Cond quietUntil time.Time @@ -144,6 +145,9 @@ func (rl *requestLimiter) Report(resp *http.Response, err error) bool { if max := rl.current * 2; max < rl.limit { rl.limit = max } + if rl.maxlimit > 0 && rl.maxlimit < rl.limit { + rl.limit = rl.maxlimit + } rl.cond.Broadcast() } return false -- 2.30.2