X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b9f32ccecc7835729d6ff20bd0a82b113bb00727..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 fd09c9305a..55f13b4625 100644 --- a/sdk/go/httpserver/request_limiter_test.go +++ b/sdk/go/httpserver/request_limiter_test.go @@ -6,7 +6,6 @@ package httpserver import ( "fmt" - "math" "net/http" "net/http/httptest" "strconv" @@ -135,19 +134,40 @@ func (*Suite) TestRequestLimiterQueuePriority(c *check.C) { <-h.inHandler } - c.Logf("starting %d priority=MinInt64 requests (should respond 503 immediately)", rl.MaxQueue) + 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", math.MinInt64)}}}) + 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)