From 2dee9ccbbcd0a01c2f0afcc89c5e0f5f03aa602a Mon Sep 17 00:00:00 2001 From: Mariell Hoversholm Date: Thu, 13 Feb 2025 08:54:58 +0100 Subject: [PATCH] APIServer: Cancel forked context after handler returns (#100504) We currently cancel the context when the adapter function is done. We should wait for the entire handler we're wrapping to finish before cancelling our context. --- pkg/apiserver/endpoints/responsewriter/responsewriter.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/apiserver/endpoints/responsewriter/responsewriter.go b/pkg/apiserver/endpoints/responsewriter/responsewriter.go index a076340d7bb..824cc05a17e 100644 --- a/pkg/apiserver/endpoints/responsewriter/responsewriter.go +++ b/pkg/apiserver/endpoints/responsewriter/responsewriter.go @@ -37,11 +37,12 @@ func WrapHandler(handler http.Handler) func(req *http.Request) (*http.Response, if err != nil { return nil, err } - defer cancel() + // The cancel happens in the goroutine we spawn, so as to not cancel it too early. req = req.WithContext(ctx) // returns a shallow copy, so we can't do it as part of the adapter. w := NewAdapter(req) go func() { + defer cancel() handler.ServeHTTP(w, req) if err := w.CloseWriter(); err != nil { klog.Errorf("error closing writer: %v", err)