20511: Limit server-to-server client to 1/4 of API req capacity.
authorTom Clegg <tom@curii.com>
Thu, 25 May 2023 15:25:02 +0000 (11:25 -0400)
committerTom Clegg <tom@curii.com>
Thu, 25 May 2023 15:25:02 +0000 (11:25 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

sdk/go/arvados/client.go
sdk/go/arvados/limiter.go

index d1a87e30e8c33408d0b9c51d18fc6ddc28466aac..6316d1bedaceb35bc7d3f5578aff3425078aabb7 100644 (file)
@@ -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
 }
 
index 0fc6cc09648a79cf491dcb60d3ff0c7643e3a449..dc944160ab2dd5d459a31fa2386ebe9a5f6bb2c3 100644 (file)
@@ -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