From ca9e92b1a4e79929d41ad51a1546bfb26a3bf432 Mon Sep 17 00:00:00 2001 From: Ce Gao Date: Wed, 12 Jun 2019 14:24:33 +0800 Subject: [PATCH 1/3] feat(experiment): Delete dup trials Signed-off-by: Ce Gao --- .../experiment/experiment_controller.go | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/controller/v1alpha2/experiment/experiment_controller.go b/pkg/controller/v1alpha2/experiment/experiment_controller.go index b15a5e420db..c7dfeddd8ce 100644 --- a/pkg/controller/v1alpha2/experiment/experiment_controller.go +++ b/pkg/controller/v1alpha2/experiment/experiment_controller.go @@ -273,7 +273,7 @@ func (r *ReconcileExperiment) ReconcileExperiment(instance *experimentsv1alpha2. logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) trials := &trialsv1alpha2.TrialList{} - labels := map[string]string{"experiment": instance.Name} + labels := map[string]string{consts.LabelExperimentName: instance.Name} lo := &client.ListOptions{} lo.MatchingLabels(labels).InNamespace(instance.Namespace) @@ -368,6 +368,26 @@ func (r *ReconcileExperiment) createTrials(instance *experimentsv1alpha2.Experim } func (r *ReconcileExperiment) deleteTrials(instance *experimentsv1alpha2.Experiment, deleteCount int32) error { + logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + trials := &trialsv1alpha2.TrialList{} + labels := map[string]string{consts.LabelExperimentName: instance.Name} + lo := &client.ListOptions{} + lo.MatchingLabels(labels).InNamespace(instance.Namespace) + if err := r.List(context.TODO(), lo, trials); err != nil { + logger.Error(err, "Trial List error") + return err + } + actualDeleteCount := int(deleteCount) + if int32(len(trials.Items)) < deleteCount { + actualDeleteCount = len(trials.Items) + } + + for i := 0; i < actualDeleteCount; i++ { + if err := r.Delete(context.TODO(), &trials.Items[len(trials.Items)-1-i]); err != nil { + logger.Error(err, "Trial Delete error") + return err + } + } return nil } From 76251cea39be40f181b074bf46ac8b29528d62bb Mon Sep 17 00:00:00 2001 From: Ce Gao Date: Wed, 12 Jun 2019 15:13:26 +0800 Subject: [PATCH 2/3] fix: Sort before delete Signed-off-by: Ce Gao --- .../v1alpha2/experiment/experiment_controller.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/controller/v1alpha2/experiment/experiment_controller.go b/pkg/controller/v1alpha2/experiment/experiment_controller.go index c7dfeddd8ce..1d7f2c5e208 100644 --- a/pkg/controller/v1alpha2/experiment/experiment_controller.go +++ b/pkg/controller/v1alpha2/experiment/experiment_controller.go @@ -19,6 +19,7 @@ package experiment import ( "context" "os" + "sort" "github.com/spf13/viper" admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" @@ -270,7 +271,6 @@ func (r *ReconcileExperiment) Reconcile(request reconcile.Request) (reconcile.Re } func (r *ReconcileExperiment) ReconcileExperiment(instance *experimentsv1alpha2.Experiment) error { - logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) trials := &trialsv1alpha2.TrialList{} labels := map[string]string{consts.LabelExperimentName: instance.Name} @@ -383,8 +383,14 @@ func (r *ReconcileExperiment) deleteTrials(instance *experimentsv1alpha2.Experim actualDeleteCount = len(trials.Items) } + trialSlice := trials.Items + sort.Slice(trialSlice, func(i, j int) bool { + return trialSlice[i].CreationTimestamp.Time. + After(trialSlice[j].CreationTimestamp.Time) + }) + for i := 0; i < actualDeleteCount; i++ { - if err := r.Delete(context.TODO(), &trials.Items[len(trials.Items)-1-i]); err != nil { + if err := r.Delete(context.TODO(), &trialSlice[i]); err != nil { logger.Error(err, "Trial Delete error") return err } From ecf628f3337eb462591526001effa66b4ea422e1 Mon Sep 17 00:00:00 2001 From: Ce Gao Date: Wed, 12 Jun 2019 15:35:24 +0800 Subject: [PATCH 3/3] fix: Use the result in the memory Signed-off-by: Ce Gao --- .../experiment/experiment_controller.go | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/pkg/controller/v1alpha2/experiment/experiment_controller.go b/pkg/controller/v1alpha2/experiment/experiment_controller.go index 1d7f2c5e208..a22474b7891 100644 --- a/pkg/controller/v1alpha2/experiment/experiment_controller.go +++ b/pkg/controller/v1alpha2/experiment/experiment_controller.go @@ -289,12 +289,12 @@ func (r *ReconcileExperiment) ReconcileExperiment(instance *experimentsv1alpha2. } reconcileRequired := !instance.IsCompleted() if reconcileRequired { - r.ReconcileTrials(instance) + r.ReconcileTrials(instance, trials.Items) } return nil } -func (r *ReconcileExperiment) ReconcileTrials(instance *experimentsv1alpha2.Experiment) error { +func (r *ReconcileExperiment) ReconcileTrials(instance *experimentsv1alpha2.Experiment, trials []trialsv1alpha2.Trial) error { logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) @@ -307,7 +307,7 @@ func (r *ReconcileExperiment) ReconcileTrials(instance *experimentsv1alpha2.Expe if deleteCount > 0 { //delete 'deleteCount' number of trails. Sort them? logger.Info("DeleteTrials", "deleteCount", deleteCount) - if err := r.deleteTrials(instance, deleteCount); err != nil { + if err := r.deleteTrials(instance, trials, deleteCount); err != nil { logger.Error(err, "Delete trials error") return err } @@ -367,29 +367,18 @@ func (r *ReconcileExperiment) createTrials(instance *experimentsv1alpha2.Experim return nil } -func (r *ReconcileExperiment) deleteTrials(instance *experimentsv1alpha2.Experiment, deleteCount int32) error { +func (r *ReconcileExperiment) deleteTrials(instance *experimentsv1alpha2.Experiment, + trials []trialsv1alpha2.Trial, + deleteCount int32) error { logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) - trials := &trialsv1alpha2.TrialList{} - labels := map[string]string{consts.LabelExperimentName: instance.Name} - lo := &client.ListOptions{} - lo.MatchingLabels(labels).InNamespace(instance.Namespace) - - if err := r.List(context.TODO(), lo, trials); err != nil { - logger.Error(err, "Trial List error") - return err - } - actualDeleteCount := int(deleteCount) - if int32(len(trials.Items)) < deleteCount { - actualDeleteCount = len(trials.Items) - } - trialSlice := trials.Items + trialSlice := trials sort.Slice(trialSlice, func(i, j int) bool { return trialSlice[i].CreationTimestamp.Time. After(trialSlice[j].CreationTimestamp.Time) }) - for i := 0; i < actualDeleteCount; i++ { + for i := 0; i < int(deleteCount); i++ { if err := r.Delete(context.TODO(), &trialSlice[i]); err != nil { logger.Error(err, "Trial Delete error") return err