From 4c39d2b63fd6fd8baedd58f1ea67060ade1d9cfc Mon Sep 17 00:00:00 2001 From: Charlie Getzen Date: Mon, 22 Apr 2019 09:54:10 -0700 Subject: [PATCH] batch perform function by resource kind (Deployment, Pod, etc) Signed-off-by: Charlie Getzen --- pkg/kube/client.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index e5489164e..dca371d32 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -274,11 +274,7 @@ func perform(infos ResourceList, fn func(*resource.Info) error) error { } errs := make(chan error) - for _, info := range infos { - go func(i *resource.Info) { - errs <- fn(i) - }(info) - } + go batchPerform(infos, fn, errs) for range infos { err := <-errs @@ -289,6 +285,28 @@ func perform(infos ResourceList, fn func(*resource.Info) error) error { return nil } +func batchPerform(infos Result, fn ResourceActorFunc, errs chan<- error) { + finished := make(chan bool, 10000) + kind := infos[0].Object.GetObjectKind().GroupVersionKind().Kind + counter := 0 + for _, info := range infos { + currentKind := info.Object.GetObjectKind().GroupVersionKind().Kind + if kind != currentKind { + // Wait until the previous kind has finished + for i := 0; i < counter; i++ { + <-finished + } + counter = 0 + kind = currentKind + } + counter = counter + 1 + go func(i *resource.Info) { + errs <- fn(i) + finished <- true + }(info) + } +} + func createResource(info *resource.Info) error { obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object, nil) if err != nil {