X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/53c44ca2f2e9e2df9d5eee96e7806fbb7576eadd..b2fe9103a8f42d393fdbb838106fa4d28ea9a25f:/sdk/go/httpserver/request_limiter_test.go diff --git a/sdk/go/httpserver/request_limiter_test.go b/sdk/go/httpserver/request_limiter_test.go index 4023a76bc4..55f13b4625 100644 --- a/sdk/go/httpserver/request_limiter_test.go +++ b/sdk/go/httpserver/request_limiter_test.go @@ -115,8 +115,8 @@ func (*Suite) TestRequestLimiter10(c *check.C) { func (*Suite) TestRequestLimiterQueuePriority(c *check.C) { h := newTestHandler() rl := RequestLimiter{ - MaxConcurrent: 100, - MaxQueue: 20, + MaxConcurrent: 1000, + MaxQueue: 200, Handler: h, Priority: func(r *http.Request, _ time.Time) int64 { p, _ := strconv.ParseInt(r.Header.Get("Priority"), 10, 64) @@ -134,6 +134,40 @@ func (*Suite) TestRequestLimiterQueuePriority(c *check.C) { <-h.inHandler } + c.Logf("starting %d priority=MinPriority requests (should respond 503 immediately)", rl.MaxQueue) + var wgX sync.WaitGroup + for i := 0; i < rl.MaxQueue; i++ { + wgX.Add(1) + go func() { + defer wgX.Done() + resp := httptest.NewRecorder() + rl.ServeHTTP(resp, &http.Request{Header: http.Header{"Priority": {fmt.Sprintf("%d", MinPriority)}}}) + c.Check(resp.Code, check.Equals, http.StatusServiceUnavailable) + }() + } + wgX.Wait() + + c.Logf("starting %d priority=MinPriority requests (should respond 503 after 100 ms)", rl.MaxQueue) + // Usage docs say the caller isn't allowed to change fields + // after first use, but we secretly know it's OK to change + // this field on the fly as long as no requests are arriving + // concurrently. + rl.MaxQueueTimeForMinPriority = time.Millisecond * 100 + for i := 0; i < rl.MaxQueue; i++ { + wgX.Add(1) + go func() { + defer wgX.Done() + resp := httptest.NewRecorder() + t0 := time.Now() + rl.ServeHTTP(resp, &http.Request{Header: http.Header{"Priority": {fmt.Sprintf("%d", MinPriority)}}}) + c.Check(resp.Code, check.Equals, http.StatusServiceUnavailable) + elapsed := time.Since(t0) + c.Check(elapsed > rl.MaxQueueTimeForMinPriority, check.Equals, true) + c.Check(elapsed < rl.MaxQueueTimeForMinPriority*10, check.Equals, true) + }() + } + wgX.Wait() + c.Logf("starting %d priority=1 and %d priority=1 requests", rl.MaxQueue, rl.MaxQueue) var wg1, wg2 sync.WaitGroup wg1.Add(rl.MaxQueue)