diff --git a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go index a485dfb22b3..117dc8042f3 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go +++ b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout.go @@ -138,7 +138,7 @@ func (t *timeoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { }() }() - postTimeoutFn() + defer postTimeoutFn() tw.timeout(err) } } diff --git a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go index 1bca00f2dbc..edf591bfaa4 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/filters/timeout_test.go @@ -219,6 +219,7 @@ func TestTimeoutHeaders(t *testing.T) { }) } + postTimeoutCh := make(chan struct{}) ts := httptest.NewServer( withDeadline( WithTimeout( @@ -226,13 +227,18 @@ func TestTimeoutHeaders(t *testing.T) { h := w.Header() // trigger the timeout cancel() - // mutate response Headers - for j := 0; j < 1000; j++ { - h.Set("Test", "post") + // keep mutating response Headers until the request times out + for { + select { + case <-postTimeoutCh: + return + default: + h.Set("Test", "post") + } } }), func(req *http.Request) (*http.Request, bool, func(), *apierrors.StatusError) { - return req, false, func() {}, apierrors.NewServerTimeout(schema.GroupResource{Group: "foo", Resource: "bar"}, "get", 0) + return req, false, func() { close(postTimeoutCh) }, apierrors.NewServerTimeout(schema.GroupResource{Group: "foo", Resource: "bar"}, "get", 0) }, ), ),