package kubernetes import ( "sync" ) import ( "github.com/dubbogo/getty" perrors "github.com/pkg/errors" ) import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/logger" ) const ( ConnDelay = 3 MaxFailTimes = 15 ) type clientFacade interface { Client() *Client SetClient(*Client) ClientLock() *sync.Mutex WaitGroup() *sync.WaitGroup GetDone() chan struct{} RestartCallBack() bool common.Node } func HandleClientRestart(r clientFacade) { var ( err error failTimes int ) defer r.WaitGroup().Done() LOOP: for { select { case <-r.GetDone(): logger.Warnf("(KubernetesProviderRegistry)reconnectKubernetes goroutine exit now...") break LOOP // re-register all services case <-r.Client().Done(): r.ClientLock().Lock() r.Client().Close() r.SetClient(nil) r.ClientLock().Unlock() // try to connect to kubernetes, failTimes = 0 for { select { case <-r.GetDone(): logger.Warnf("(KubernetesProviderRegistry)reconnectKubernetes Registry goroutine exit now...") break LOOP case <-getty.GetTimeWheel().After(timeSecondDuration(failTimes * ConnDelay)): // avoid connect frequent } err = ValidateClient(r) logger.Infof("Kubernetes ProviderRegistry.validateKubernetesClient = error{%#v}", perrors.WithStack(err)) if err == nil { if r.RestartCallBack() { break } } failTimes++ if MaxFailTimes <= failTimes { failTimes = MaxFailTimes } } } } }