apiserver: all bookkeeping must complete before apf handler returns

all bookkeeping must complete before the apf handler returns,
whether it panics or returns normally

Kubernetes-commit: 71d9307eaeda86d6a205548ecdeb7fbf226d7d82
This commit is contained in:
Abu Kashem 2024-09-05 12:01:36 -04:00 committed by Kubernetes Publisher
parent a785076ef7
commit 4483cc97cf
1 changed files with 17 additions and 11 deletions

View File

@ -266,17 +266,23 @@ func (h *priorityAndFairnessHandler) Handle(w http.ResponseWriter, r *http.Reque
select {
case <-shouldStartWatchCh:
watchCtx := utilflowcontrol.WithInitializationSignal(ctx, watchInitializationSignal)
watchReq = r.WithContext(watchCtx)
h.handler.ServeHTTP(w, watchReq)
// Protect from the situation when request will not reach storage layer
// and the initialization signal will not be send.
// It has to happen before waiting on the resultCh below.
watchInitializationSignal.Signal()
// TODO: Consider finishing the request as soon as Handle call panics.
if err := <-resultCh; err != nil {
panic(err)
}
func() {
// TODO: if both goroutines panic, propagate the stack traces from both
// goroutines so they are logged properly:
defer func() {
// Protect from the situation when request will not reach storage layer
// and the initialization signal will not be send.
// It has to happen before waiting on the resultCh below.
watchInitializationSignal.Signal()
// TODO: Consider finishing the request as soon as Handle call panics.
if err := <-resultCh; err != nil {
panic(err)
}
}()
watchCtx := utilflowcontrol.WithInitializationSignal(ctx, watchInitializationSignal)
watchReq = r.WithContext(watchCtx)
h.handler.ServeHTTP(w, watchReq)
}()
case err := <-resultCh:
if err != nil {
panic(err)