From 8b490dea3a2c16c89ef847b4c307ad282202a5b6 Mon Sep 17 00:00:00 2001 From: Andrew Sy Kim Date: Thu, 8 Aug 2019 15:49:08 -0400 Subject: [PATCH] service controller: add OnAdd and OnDelete node event handlers Signed-off-by: Andrew Sy Kim --- pkg/controller/service/controller.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/pkg/controller/service/controller.go b/pkg/controller/service/controller.go index aa82c6ed999..10f4ffb9e12 100644 --- a/pkg/controller/service/controller.go +++ b/pkg/controller/service/controller.go @@ -19,11 +19,10 @@ package service import ( "context" "fmt" + "reflect" "sync" "time" - "reflect" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" @@ -101,6 +100,7 @@ type serviceCache struct { type Controller struct { cloud cloudprovider.Interface knownHosts []*v1.Node + knownHostsLock sync.Mutex servicesToUpdate []*v1.Service kubeClient clientset.Interface clusterName string @@ -175,6 +175,21 @@ func New( s.serviceLister = serviceInformer.Lister() s.serviceListerSynced = serviceInformer.Informer().HasSynced + nodeInformer.Informer().AddEventHandlerWithResyncPeriod( + cache.ResourceEventHandlerFuncs{ + AddFunc: func(cur interface{}) { + s.nodeSyncLoop() + }, + UpdateFunc: func(old, cur interface{}) { + s.nodeSyncLoop() + }, + DeleteFunc: func(old interface{}) { + s.nodeSyncLoop() + }, + }, + time.Duration(0), + ) + if err := s.init(); err != nil { return nil, err } @@ -646,6 +661,8 @@ func getNodeConditionPredicate() NodeConditionPredicate { // nodeSyncLoop handles updating the hosts pointed to by all load // balancers whenever the set of nodes in the cluster changes. func (s *Controller) nodeSyncLoop() { + s.knownHostsLock.Lock() + defer s.knownHostsLock.Unlock() newHosts, err := listWithPredicate(s.nodeLister, getNodeConditionPredicate()) if err != nil { runtime.HandleError(fmt.Errorf("Failed to retrieve current set of nodes from node lister: %v", err))