From 2eac7bf45704f9f057af6e7afba3348093d353fb Mon Sep 17 00:00:00 2001 From: Alexander Matyushentsev Date: Thu, 18 Apr 2019 08:12:18 -0700 Subject: [PATCH] Issue #1476 - Fix racing condition in controller cache (#1485) --- controller/cache/cluster.go | 26 +------------------------- util/util.go | 6 +++--- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/controller/cache/cluster.go b/controller/cache/cluster.go index 704e41468b..27852bfc1c 100644 --- a/controller/cache/cluster.go +++ b/controller/cache/cluster.go @@ -316,9 +316,6 @@ func (c *clusterInfo) sync() (err error) { } func (c *clusterInfo) ensureSynced() error { - if c.synced() { - return c.syncError - } c.syncLock.Lock() defer c.syncLock.Unlock() if c.synced() { @@ -384,7 +381,6 @@ func (c *clusterInfo) getManagedLiveObjs(a *appv1.Application, targetObjs []*uns managedObj, err = c.kubectl.GetResource(c.cluster.RESTConfig(), targetObj.GroupVersionKind(), existingObj.ref.Name, existingObj.ref.Namespace) if err != nil { if errors.IsNotFound(err) { - c.checkAndInvalidateStaleCache(targetObj.GroupVersionKind(), existingObj.ref.Namespace, existingObj.ref.Name) return nil } return err @@ -412,27 +408,7 @@ func (c *clusterInfo) getManagedLiveObjs(a *appv1.Application, targetObjs []*uns } func (c *clusterInfo) delete(obj *unstructured.Unstructured) error { - err := c.kubectl.DeleteResource(c.cluster.RESTConfig(), obj.GroupVersionKind(), obj.GetName(), obj.GetNamespace(), false) - if err != nil && errors.IsNotFound(err) { - // a delete request came in for an object which does not exist. it's possible that our cache - // is stale. Check and invalidate if it is - c.lock.Lock() - c.checkAndInvalidateStaleCache(obj.GroupVersionKind(), obj.GetNamespace(), obj.GetName()) - c.lock.Unlock() - return nil - } - return err -} - -// checkAndInvalidateStaleCache checks if our cache is stale and invalidate it based on error -// should be called whenever we suspect our cache is stale -func (c *clusterInfo) checkAndInvalidateStaleCache(gvk schema.GroupVersionKind, namespace string, name string) { - if _, ok := c.nodes[kube.NewResourceKey(gvk.Group, gvk.Kind, namespace, name)]; ok { - if c.syncTime != nil { - c.log.Warnf("invalidated stale cache due to mismatch of %s, %s/%s", gvk, namespace, name) - c.invalidate() - } - } + return c.kubectl.DeleteResource(c.cluster.RESTConfig(), obj.GroupVersionKind(), obj.GetName(), obj.GetNamespace(), false) } func (c *clusterInfo) processEvent(event watch.EventType, un *unstructured.Unstructured) error { diff --git a/util/util.go b/util/util.go index 7b0abee13d..175bfba8b9 100644 --- a/util/util.go +++ b/util/util.go @@ -95,17 +95,17 @@ func RetryUntilSucceed(action func() error, desc string, ctx context.Context, ti } }() for { - log.Infof("Start %s", desc) + log.Debugf("Start %s", desc) err := action() if err == nil { log.Infof("Completed %s", desc) return } if ctxCompleted { - log.Infof("Stop retrying %s", desc) + log.Debugf("Stop retrying %s", desc) return } - log.Warnf("Failed to %s: %+v, retrying in %v", desc, err, timeout) + log.Debugf("Failed to %s: %+v, retrying in %v", desc, err, timeout) time.Sleep(timeout) }