From 31fb7cc11372486810052b4c1f1813770e64e468 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Tue, 3 Mar 2020 10:45:39 +0900 Subject: [PATCH] feat: Efficient runner set looks up for the deployment controller Enhances the deployment controller to use indexed lookups against runner sets for more scalability. --- controllers/runnerdeployment_controller.go | 38 ++++++++++++++-------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/controllers/runnerdeployment_controller.go b/controllers/runnerdeployment_controller.go index 2bdf8ae6..84368e0b 100644 --- a/controllers/runnerdeployment_controller.go +++ b/controllers/runnerdeployment_controller.go @@ -38,6 +38,8 @@ import ( const ( LabelKeyRunnerTemplateHash = "runner-template-hash" + + runnerSetOwnerKey = ".metadata.controller" ) // RunnerDeploymentReconciler reconciles a Runner object @@ -66,22 +68,14 @@ func (r *RunnerDeploymentReconciler) Reconcile(req ctrl.Request) (ctrl.Result, e return ctrl.Result{}, nil } - var allRunnerSets v1alpha1.RunnerSetList - if err := r.List(ctx, &allRunnerSets, client.InNamespace(req.Namespace)); err != nil { + var myRunnerSetList v1alpha1.RunnerSetList + if err := r.List(ctx, &myRunnerSetList, client.InNamespace(req.Namespace), client.MatchingFields{runnerSetOwnerKey: req.Name}); err != nil { if !errors.IsNotFound(err) { return ctrl.Result{}, err } } - var myRunnerSets []*v1alpha1.RunnerSet - - for i := range allRunnerSets.Items { - rs := allRunnerSets.Items[i] - - if metav1.IsControlledBy(&rs, &rd) { - myRunnerSets = append(myRunnerSets, &rs) - } - } + myRunnerSets := myRunnerSetList.Items sort.Slice(myRunnerSets, func(i, j int) bool { return myRunnerSets[i].GetCreationTimestamp().After(myRunnerSets[j].GetCreationTimestamp().Time) @@ -89,10 +83,10 @@ func (r *RunnerDeploymentReconciler) Reconcile(req ctrl.Request) (ctrl.Result, e var newestSet *v1alpha1.RunnerSet - var oldSets []*v1alpha1.RunnerSet + var oldSets []v1alpha1.RunnerSet if len(myRunnerSets) > 0 { - newestSet = myRunnerSets[0] + newestSet = &myRunnerSets[0] } if len(myRunnerSets) > 1 { @@ -156,7 +150,7 @@ func (r *RunnerDeploymentReconciler) Reconcile(req ctrl.Request) (ctrl.Result, e for i := range oldSets { rs := oldSets[i] - if err := r.Client.Delete(ctx, rs); err != nil { + if err := r.Client.Delete(ctx, &rs); err != nil { log.Error(err, "Failed to delete runner resource") return ctrl.Result{}, err @@ -246,6 +240,22 @@ func (r *RunnerDeploymentReconciler) newRunnerSet(rd v1alpha1.RunnerDeployment) func (r *RunnerDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error { r.Recorder = mgr.GetEventRecorderFor("runnerdeployment-controller") + if err := mgr.GetFieldIndexer().IndexField(&v1alpha1.RunnerSet{}, runnerSetOwnerKey, func(rawObj runtime.Object) []string { + runnerSet := rawObj.(*v1alpha1.RunnerSet) + owner := metav1.GetControllerOf(runnerSet) + if owner == nil { + return nil + } + + if owner.APIVersion != v1alpha1.GroupVersion.String() || owner.Kind != "RunnerSet" { + return nil + } + + return []string{owner.Name} + }); err != nil { + return err + } + return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.RunnerDeployment{}). Owns(&v1alpha1.RunnerSet{}).