21227: Don't reduce outgoing request concurrency below 4.
[arvados.git] / sdk / go / arvados / limiter.go
index ac244593b2e4ba98309b593c8b0a809a623e70f7..9edc5386a7655c3f1d9e31bcb0d3f55b2a999c87 100644 (file)
@@ -16,11 +16,13 @@ import (
 var (
        requestLimiterQuietPeriod        = time.Second
        requestLimiterInitialLimit int64 = 8
+       requestLimiterMinimumLimit int64 = 4
 )
 
 type requestLimiter struct {
        current    int64
        limit      int64
+       maxlimit   int64
        lock       sync.Mutex
        cond       *sync.Cond
        quietUntil time.Time
@@ -141,9 +143,18 @@ func (rl *requestLimiter) Report(resp *http.Response, err error) bool {
                        increase = 1
                }
                rl.limit += increase
-               if max := rl.current * 2; max > rl.limit {
+               if max := rl.current * 2; max < rl.limit {
                        rl.limit = max
                }
+               if min := requestLimiterMinimumLimit; min > rl.limit {
+                       // If limit is too low, programs like
+                       // controller and test suites can end up with
+                       // too few slots to complete a single request.
+                       rl.limit = min
+               }
+               if rl.maxlimit > 0 && rl.maxlimit < rl.limit {
+                       rl.limit = rl.maxlimit
+               }
                rl.cond.Broadcast()
        }
        return false