debian-mirror-gitlab/workhorse/internal/queueing/requests.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

56 lines
1.4 KiB
Go
Raw Normal View History

2021-02-22 17:27:13 +05:30
package queueing
import (
"net/http"
"time"
2022-11-25 23:54:43 +05:30
"github.com/prometheus/client_golang/prometheus"
2023-03-04 22:38:38 +05:30
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper/fail"
2021-02-22 17:27:13 +05:30
)
const (
DefaultTimeout = 30 * time.Second
httpStatusTooManyRequests = 429
)
// QueueRequests creates a new request queue
// name specifies the name of queue, used to label Prometheus metrics
2023-06-20 00:43:36 +05:30
//
// Don't call QueueRequests twice with the same name argument!
//
2021-02-22 17:27:13 +05:30
// h specifies a http.Handler which will handle the queue requests
// limit specifies number of requests run concurrently
// queueLimit specifies maximum number of requests that can be queued
// queueTimeout specifies the time limit of storing the request in the queue
2022-11-25 23:54:43 +05:30
func QueueRequests(name string, h http.Handler, limit, queueLimit uint, queueTimeout time.Duration, reg prometheus.Registerer) http.Handler {
2021-02-22 17:27:13 +05:30
if limit == 0 {
return h
}
if queueTimeout == 0 {
queueTimeout = DefaultTimeout
}
2022-11-25 23:54:43 +05:30
queue := newQueue(name, limit, queueLimit, queueTimeout, reg)
2021-02-22 17:27:13 +05:30
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
err := queue.Acquire()
switch err {
case nil:
defer queue.Release()
h.ServeHTTP(w, r)
case ErrTooManyRequests:
http.Error(w, "Too Many Requests", httpStatusTooManyRequests)
case ErrQueueingTimedout:
http.Error(w, "Service Unavailable", http.StatusServiceUnavailable)
default:
2023-03-04 22:38:38 +05:30
fail.Request(w, r, err)
2021-02-22 17:27:13 +05:30
}
})
}