diff --git a/cluster-autoscaler/cloudprovider/gce/cache.go b/cluster-autoscaler/cloudprovider/gce/cache.go index 075aa2343f4f8a177da9a7d940c7a735cbd799f1..1f2d38e1d1dc3f4ecea3a5006227766f35c13d4c 100644 --- a/cluster-autoscaler/cloudprovider/gce/cache.go +++ b/cluster-autoscaler/cloudprovider/gce/cache.go @@ -432,6 +432,25 @@ func (gc *GceCache) InvalidateAllMigInstanceTemplates() { gc.instanceTemplatesCache = map[GceRef]*gce.InstanceTemplate{} } +// DropInstanceTemplatesForMissingMigs clears the instance template +// cache intended MIGs which are no longer present in the cluster +func (gc *GceCache) DropInstanceTemplatesForMissingMigs(currentMigs []Mig) { + gc.cacheMutex.Lock() + defer gc.cacheMutex.Unlock() + + requiredKeys := make(map[GceRef]struct{}, len(currentMigs)) + for _, mig := range currentMigs { + requiredKeys[mig.GceRef()] = struct{}{} + } + + klog.V(5).Infof("Instance template cache partially invalidated") + for key := range gc.instanceTemplatesCache { + if _, exists := requiredKeys[key]; !exists { + delete(gc.instanceTemplatesCache, key) + } + } +} + // GetMigKubeEnv returns the cached KubeEnv for a mig GceRef func (gc *GceCache) GetMigKubeEnv(ref GceRef) (KubeEnv, bool) { gc.cacheMutex.Lock() diff --git a/cluster-autoscaler/cloudprovider/gce/gce_manager.go b/cluster-autoscaler/cloudprovider/gce/gce_manager.go index 11cebc26aa0c52b1bdeab5b5305194eee822fb06..9457b2953680313824ba418c03e15473c2a590aa 100644 --- a/cluster-autoscaler/cloudprovider/gce/gce_manager.go +++ b/cluster-autoscaler/cloudprovider/gce/gce_manager.go @@ -306,7 +306,14 @@ func (m *gceManagerImpl) Refresh() error { if m.lastRefresh.Add(refreshInterval).After(time.Now()) { return nil } - return m.forceRefresh() + + if err := m.forceRefresh(); err != nil { + return err + } + + migs := m.migLister.GetMigs() + m.cache.DropInstanceTemplatesForMissingMigs(migs) + return nil } func (m *gceManagerImpl) CreateInstances(mig Mig, delta int64) error {