From f5744043a6fb81330ee78e4f7a0f04d0ef65c9f1 Mon Sep 17 00:00:00 2001 From: dax Date: Tue, 28 May 2019 10:25:48 -0700 Subject: [PATCH] Refactor set of cluster scoped handlers Problem: Cluster scoped gc was taking significantly longer to complete than before 7387aa5. This was due to a large number of list calls and the time needed to iterate over them. Solution: Instead of requesting every type than Rancher uses, a seperate map appended to when a cluster scoped handler is created. The full map of all GroupVersionResources is kept as a fallback for the use case where user controllers may exist on another host other than the current leader. --- generator/controller_template.go | 1 + resource/resource.go | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/generator/controller_template.go b/generator/controller_template.go index ba3394c9..122a74a7 100644 --- a/generator/controller_template.go +++ b/generator/controller_template.go @@ -157,6 +157,7 @@ func (c *{{.schema.ID}}Controller) AddHandler(ctx context.Context, name string, } func (c *{{.schema.ID}}Controller) AddClusterScopedHandler(ctx context.Context, name, cluster string, handler {{.schema.CodeName}}HandlerFunc) { + resource.PutClusterScoped({{.schema.CodeName}}GroupVersionResource) c.GenericController.AddHandler(ctx, name, func(key string, obj interface{}) (interface{}, error) { if obj == nil { return handler(key, nil) diff --git a/resource/resource.go b/resource/resource.go index 8ed4eb47..710adb61 100644 --- a/resource/resource.go +++ b/resource/resource.go @@ -7,11 +7,17 @@ import ( ) //rancherTypes is a set of all types generated by rancher +//clusterScopedTypes is a set of all types that have been added by a clusterScoped handler var ( rancherTypes = struct { sync.RWMutex m map[schema.GroupVersionResource]bool }{m: make(map[schema.GroupVersionResource]bool)} + + clusterScopedTypes = struct { + sync.RWMutex + m map[schema.GroupVersionResource]bool + }{m: make(map[schema.GroupVersionResource]bool)} ) //Get returns a copy of the set of rancherTypes @@ -25,6 +31,16 @@ func Get() map[schema.GroupVersionResource]bool { return targetMap } +func GetClusterScopedTypes() map[schema.GroupVersionResource]bool { + clusterScopedTypes.Lock() + defer clusterScopedTypes.Unlock() + targetMap := make(map[schema.GroupVersionResource]bool, len(clusterScopedTypes.m)) + for key, value := range clusterScopedTypes.m { + targetMap[key] = value + } + return targetMap +} + //Put adds an object to the set and panic on collision func Put(key schema.GroupVersionResource) { rancherTypes.Lock() @@ -36,3 +52,10 @@ func Put(key schema.GroupVersionResource) { } rancherTypes.m[key] = true } + +//PutClusterScoped adds a object that contains a cluster scoped handler to the set +func PutClusterScoped(key schema.GroupVersionResource) { + clusterScopedTypes.Lock() + defer clusterScopedTypes.Unlock() + clusterScopedTypes.m[key] = true +}