X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/1535c8d141b07f246a501d288a0d3a903ce41a56..6fe8e52020d421797306e5c6536afbcee761510a:/sdk/go/httpserver/request_limiter.go diff --git a/sdk/go/httpserver/request_limiter.go b/sdk/go/httpserver/request_limiter.go index 178ffb90f4..e7192d5b4f 100644 --- a/sdk/go/httpserver/request_limiter.go +++ b/sdk/go/httpserver/request_limiter.go @@ -1,21 +1,49 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 + package httpserver import ( "net/http" ) +// RequestCounter is an http.Handler that tracks the number of +// requests in progress. +type RequestCounter interface { + http.Handler + + // Current() returns the number of requests in progress. + Current() int + + // Max() returns the maximum number of concurrent requests + // that will be accepted. + Max() int +} + type limiterHandler struct { requests chan struct{} handler http.Handler } -func NewRequestLimiter(maxRequests int, handler http.Handler) http.Handler { +// NewRequestLimiter returns a RequestCounter that delegates up to +// maxRequests at a time to the given handler, and responds 503 to all +// incoming requests beyond that limit. +func NewRequestLimiter(maxRequests int, handler http.Handler) RequestCounter { return &limiterHandler{ requests: make(chan struct{}, maxRequests), handler: handler, } } +func (h *limiterHandler) Current() int { + return len(h.requests) +} + +func (h *limiterHandler) Max() int { + return cap(h.requests) +} + func (h *limiterHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { select { case h.requests <- struct{}{}: