20831: Add DiscoveryDocument to arvados.API
[arvados.git] / sdk / go / httpserver / request_limiter_test.go
index 4023a76bc442493097c61328853b75a03311b635..55f13b4625fdf1c637dfba721b4ee8f00af2ecc3 100644 (file)
@@ -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)