From fe3bdbfcdc2c66eb731341cef1ecdeb9a8808f2d Mon Sep 17 00:00:00 2001 From: Mike Lang Date: Wed, 19 Jul 2017 11:31:43 -0700 Subject: [PATCH] probe/kubernetes: Speed up lookups of large lists of cronjobs and jobs Currently joining the two lists is O(mn), by putting into a hashmap first it's O(m+n) --- probe/kubernetes/client.go | 6 ++++-- probe/kubernetes/cronjob.go | 12 +++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/probe/kubernetes/client.go b/probe/kubernetes/client.go index 15bcefc57..eae963e50 100644 --- a/probe/kubernetes/client.go +++ b/probe/kubernetes/client.go @@ -11,6 +11,7 @@ import ( log "github.com/Sirupsen/logrus" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" apiv1 "k8s.io/client-go/pkg/api/v1" apiappsv1beta1 "k8s.io/client-go/pkg/apis/apps/v1beta1" @@ -301,10 +302,11 @@ func (c *client) WalkCronJobs(f func(CronJob) error) error { if c.cronJobStore == nil { return nil } - jobs := []*apibatchv1.Job{} + // We index jobs by id to make lookup for each cronjob more efficient + jobs := map[types.UID]*apibatchv1.Job{} for _, m := range c.jobStore.List() { j := m.(*apibatchv1.Job) - jobs = append(jobs, j) + jobs[j.UID] = j } for _, m := range c.cronJobStore.List() { cj := m.(*apibatchv2alpha1.CronJob) diff --git a/probe/kubernetes/cronjob.go b/probe/kubernetes/cronjob.go index c188a7d1f..0230f5720 100644 --- a/probe/kubernetes/cronjob.go +++ b/probe/kubernetes/cronjob.go @@ -6,6 +6,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/types" batchv1 "k8s.io/client-go/pkg/apis/batch/v1" batchv2alpha1 "k8s.io/client-go/pkg/apis/batch/v2alpha1" @@ -35,14 +36,11 @@ type cronJob struct { // NewCronJob creates a new cron job. jobs should be all jobs, which will be filtered // for those matching this cron job. -func NewCronJob(cj *batchv2alpha1.CronJob, jobs []*batchv1.Job) CronJob { +func NewCronJob(cj *batchv2alpha1.CronJob, jobs map[types.UID]*batchv1.Job) CronJob { myJobs := []*batchv1.Job{} - for _, j := range jobs { - for _, o := range cj.Status.Active { - if j.UID == o.UID { - myJobs = append(myJobs, j) - break - } + for _, o := range cj.Status.Active { + if j, ok := jobs[o.UID]; ok { + myJobs = append(myJobs, j) } } return &cronJob{