hs := http.NotFoundHandler()
hs = prepend(hs, h.proxyRailsAPI)
+ hs = prepend(hs, h.limitLogCreateRequests)
hs = h.setupProxyRemoteCluster(hs)
hs = prepend(hs, oidcAuthorizer.Middleware)
mux.Handle("/", hs)
if logCreateLimit == 0 && h.Cluster.API.LogCreateRequestFraction > 0 {
logCreateLimit = 1
}
- if logCreateLimit == 0 {
- // can't have unlimited size channels, so just make
- // the buffer size really big.
- logCreateLimit = 4096
- }
h.limitLogCreate = make(chan struct{}, logCreateLimit)
h.proxy = &proxy{
}
func (h *Handler) limitLogCreateRequests(w http.ResponseWriter, req *http.Request, next http.Handler) {
- if req.Method == http.MethodPost && strings.HasPrefix(req.URL.Path, "/arvados/v1/logs") {
+ if cap(h.limitLogCreate) > 0 && req.Method == http.MethodPost && strings.HasPrefix(req.URL.Path, "/arvados/v1/logs") {
select {
case h.limitLogCreate <- struct{}{}:
+ defer func() { <-h.limitLogCreate }()
next.ServeHTTP(w, req)
- <-h.limitLogCreate
default:
http.Error(w, "Excess log messages", http.StatusServiceUnavailable)
}