Skip to content

Commit 358499d

Browse files
deads2kbertinatto
authored andcommitted
UPSTREAM: 93286: wait for apiservices on startup
OpenShift-Rebase-Source: 5a2488c
1 parent 8806ee9 commit 358499d

File tree

1 file changed

+40
-2
lines changed
  • staging/src/k8s.io/kube-aggregator/pkg/apiserver

1 file changed

+40
-2
lines changed

staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go

+40-2
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@ import (
2020
"context"
2121
"fmt"
2222
"net/http"
23+
"strings"
2324
"sync"
2425
"time"
2526

2627
apierrors "k8s.io/apimachinery/pkg/api/errors"
2728
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29+
"k8s.io/apimachinery/pkg/labels"
2830
"k8s.io/apimachinery/pkg/runtime/schema"
31+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2932
"k8s.io/apimachinery/pkg/util/sets"
3033
"k8s.io/apimachinery/pkg/util/wait"
3134
"k8s.io/apiserver/pkg/endpoints/discovery/aggregated"
@@ -40,6 +43,7 @@ import (
4043
"k8s.io/client-go/transport"
4144
"k8s.io/component-base/metrics/legacyregistry"
4245
"k8s.io/component-base/tracing"
46+
"k8s.io/klog/v2"
4347
v1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
4448
v1helper "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper"
4549
"k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1"
@@ -370,6 +374,33 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg
370374

371375
return nil
372376
})
377+
s.GenericAPIServer.AddPostStartHook("apiservice-wait-for-first-sync", func(context genericapiserver.PostStartHookContext) error {
378+
// when the aggregator first starts, it should make sure that it has proxy handlers for all the known good API services at this time
379+
// we only need to do this once.
380+
err := wait.PollImmediateUntil(100*time.Millisecond, func() (bool, error) {
381+
// fix race
382+
handledAPIServices := sets.StringKeySet(s.proxyHandlers)
383+
apiservices, err := s.lister.List(labels.Everything())
384+
if err != nil {
385+
return false, err
386+
}
387+
expectedAPIServices := sets.NewString()
388+
for _, apiservice := range apiservices {
389+
if v1helper.IsAPIServiceConditionTrue(apiservice, v1.Available) {
390+
expectedAPIServices.Insert(apiservice.Name)
391+
}
392+
}
393+
394+
notYetHandledAPIServices := expectedAPIServices.Difference(handledAPIServices)
395+
if len(notYetHandledAPIServices) == 0 {
396+
return true, nil
397+
}
398+
klog.Infof("still waiting on handling APIServices: %v", strings.Join(notYetHandledAPIServices.List(), ","))
399+
400+
return false, nil
401+
}, context.Done())
402+
return err
403+
})
373404

374405
if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.AggregatedDiscoveryEndpoint) {
375406
s.discoveryAggregationController = NewDiscoveryManager(
@@ -555,7 +586,11 @@ func (s *APIAggregator) AddAPIService(apiService *v1.APIService) error {
555586
}
556587
proxyHandler.updateAPIService(apiService)
557588
if s.openAPIAggregationController != nil {
558-
s.openAPIAggregationController.AddAPIService(proxyHandler, apiService)
589+
// this is calling a controller. It should already handle being async.
590+
go func() {
591+
defer utilruntime.HandleCrash()
592+
s.openAPIAggregationController.AddAPIService(proxyHandler, apiService)
593+
}()
559594
}
560595
if s.openAPIV3AggregationController != nil {
561596
s.openAPIV3AggregationController.AddAPIService(proxyHandler, apiService)
@@ -564,7 +599,10 @@ func (s *APIAggregator) AddAPIService(apiService *v1.APIService) error {
564599
s.discoveryAggregationController.AddAPIService(apiService, proxyHandler)
565600
}
566601

567-
s.proxyHandlers[apiService.Name] = proxyHandler
602+
// we want to update the registration bit last after all the pieces are wired together
603+
defer func() {
604+
s.proxyHandlers[apiService.Name] = proxyHandler
605+
}()
568606
s.GenericAPIServer.Handler.NonGoRestfulMux.Handle(proxyPath, proxyHandler)
569607
s.GenericAPIServer.Handler.NonGoRestfulMux.UnlistedHandlePrefix(proxyPath+"/", proxyHandler)
570608

0 commit comments

Comments
 (0)