From 8d9538b9c9764a75e835f46f7dfd89bc27d0f618 Mon Sep 17 00:00:00 2001 From: Poor12 Date: Mon, 3 Apr 2023 19:35:42 +0800 Subject: [PATCH] do not scheudle when status/metadata change Signed-off-by: Poor12 --- pkg/scheduler/event_handler.go | 18 ++++++++++++++++++ pkg/scheduler/scheduler_metrics_test.go | 12 +++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/pkg/scheduler/event_handler.go b/pkg/scheduler/event_handler.go index 4659c9803..d6ac299f7 100644 --- a/pkg/scheduler/event_handler.go +++ b/pkg/scheduler/event_handler.go @@ -18,6 +18,7 @@ import ( "github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util/fedinformer" "github.com/karmada-io/karmada/pkg/util/gclient" + "github.com/karmada-io/karmada/pkg/util/helper" ) // addAllEventHandlers is a helper function used in Scheduler @@ -103,6 +104,23 @@ func (s *Scheduler) onResourceBindingAdd(obj interface{}) { } func (s *Scheduler) onResourceBindingUpdate(old, cur interface{}) { + unstructuredOldObj, err := helper.ToUnstructured(old) + if err != nil { + klog.Errorf("Failed to transform oldObj, error: %v", err) + return + } + + unstructuredNewObj, err := helper.ToUnstructured(cur) + if err != nil { + klog.Errorf("Failed to transform newObj, error: %v", err) + return + } + + if unstructuredOldObj.GetGeneration() == unstructuredNewObj.GetGeneration() { + klog.V(4).Infof("Ignore update event of object (kind=%s, %s/%s) as specification no change", unstructuredOldObj.GetKind(), unstructuredOldObj.GetNamespace(), unstructuredOldObj.GetName()) + return + } + key, err := cache.MetaNamespaceKeyFunc(cur) if err != nil { klog.Errorf("couldn't get key for object %#v: %v", cur, err) diff --git a/pkg/scheduler/scheduler_metrics_test.go b/pkg/scheduler/scheduler_metrics_test.go index 3a774b9de..fe2cfd145 100644 --- a/pkg/scheduler/scheduler_metrics_test.go +++ b/pkg/scheduler/scheduler_metrics_test.go @@ -25,7 +25,12 @@ var ( scheduler.onResourceBindingAdd(obj) } updateBinding = func(scheduler *Scheduler, obj interface{}) { - scheduler.onResourceBindingUpdate(nil, obj) + oldRB := &workv1alpha2.ResourceBinding{ + ObjectMeta: metav1.ObjectMeta{ + Generation: 1, + }, + } + scheduler.onResourceBindingUpdate(oldRB, obj) } policyChanged = func(scheduler *Scheduler, obj interface{}) { rb := obj.(*workv1alpha2.ResourceBinding) @@ -68,7 +73,7 @@ func TestIncomingBindingMetrics(t *testing.T) { ObjectMeta: metav1.ObjectMeta{ Name: fmt.Sprintf("test-rb-%d", i), Namespace: "bar", - Generation: 1, + Generation: 2, }, } rbInfos = append(rbInfos, rb) @@ -77,7 +82,8 @@ func TestIncomingBindingMetrics(t *testing.T) { for i := 1; i <= 3; i++ { crb := &workv1alpha2.ClusterResourceBinding{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("test-rb-%d", i), + Name: fmt.Sprintf("test-rb-%d", i), + Generation: 2, }, } crbInfos = append(crbInfos, crb)