From b1143da37044d83ee8565193e598c02448c01278 Mon Sep 17 00:00:00 2001 From: jingxueli Date: Thu, 14 May 2020 15:43:54 +0800 Subject: [PATCH 1/2] skip unnecessary scheduling attempt when pod's finalizers change --- pkg/scheduler/eventhandlers.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/scheduler/eventhandlers.go b/pkg/scheduler/eventhandlers.go index 0b4f6d99011..be491488cfd 100644 --- a/pkg/scheduler/eventhandlers.go +++ b/pkg/scheduler/eventhandlers.go @@ -301,7 +301,7 @@ func responsibleForPod(pod *v1.Pod, profiles profile.Map) bool { // skipPodUpdate checks whether the specified pod update should be ignored. // This function will return true if // - The pod has already been assumed, AND -// - The pod has only its ResourceVersion, Spec.NodeName and/or Annotations +// - The pod has only its ResourceVersion, Spec.NodeName, Annotations, ManagedFields and/or Finalizers // updated. func (sched *Scheduler) skipPodUpdate(pod *v1.Pod) bool { // Non-assumed pods should never be skipped. @@ -338,6 +338,8 @@ func (sched *Scheduler) skipPodUpdate(pod *v1.Pod) bool { // Same as above, when annotations are modified with ServerSideApply, // ManagedFields may also change and must be excluded p.ManagedFields = nil + // Finalizers must be excluded because scheduled result can not be affected + p.Finalizers = nil return p } assumedPodCopy, podCopy := f(assumedPod), f(pod) From b95191fe10045e3d7f7866feb3fb8f8abdaa5a60 Mon Sep 17 00:00:00 2001 From: jingxueli Date: Fri, 15 May 2020 12:09:54 +0800 Subject: [PATCH 2/2] add test for finalizers --- pkg/scheduler/eventhandlers_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pkg/scheduler/eventhandlers_test.go b/pkg/scheduler/eventhandlers_test.go index 406f7d7089b..3fbe8663e17 100644 --- a/pkg/scheduler/eventhandlers_test.go +++ b/pkg/scheduler/eventhandlers_test.go @@ -180,6 +180,27 @@ func TestSkipPodUpdate(t *testing.T) { }, expected: false, }, + { + name: "with changes on Finalizers", + pod: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-0", + Finalizers: []string{"a", "b"}, + }, + }, + isAssumedPodFunc: func(*v1.Pod) bool { + return true + }, + getPodFunc: func(*v1.Pod) *v1.Pod { + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-0", + Finalizers: []string{"c", "d"}, + }, + } + }, + expected: true, + }, } { t.Run(test.name, func(t *testing.T) { c := &Scheduler{