From f73bb17efbf613af49579624e5869dbc54565342 Mon Sep 17 00:00:00 2001 From: AxeZhan Date: Sat, 18 May 2024 00:26:24 +0800 Subject: [PATCH 1/2] base on allNodes when calculating nextStartNodeIndex --- pkg/scheduler/schedule_one.go | 2 +- pkg/scheduler/schedule_one_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pkg/scheduler/schedule_one.go b/pkg/scheduler/schedule_one.go index 282ce5ab8e2..07c9d5834dd 100644 --- a/pkg/scheduler/schedule_one.go +++ b/pkg/scheduler/schedule_one.go @@ -502,7 +502,7 @@ func (sched *Scheduler) findNodesThatFitPod(ctx context.Context, fwk framework.F // always try to update the sched.nextStartNodeIndex regardless of whether an error has occurred // this is helpful to make sure that all the nodes have a chance to be searched processedNodes := len(feasibleNodes) + len(diagnosis.NodeToStatusMap) - sched.nextStartNodeIndex = (sched.nextStartNodeIndex + processedNodes) % len(nodes) + sched.nextStartNodeIndex = (sched.nextStartNodeIndex + processedNodes) % len(allNodes) if err != nil { return nil, diagnosis, err } diff --git a/pkg/scheduler/schedule_one_test.go b/pkg/scheduler/schedule_one_test.go index e4d33039688..47f1e771039 100644 --- a/pkg/scheduler/schedule_one_test.go +++ b/pkg/scheduler/schedule_one_test.go @@ -2416,6 +2416,33 @@ func TestSchedulerSchedulePod(t *testing.T) { wantNodes: sets.New("node1", "node2"), wantEvaluatedNodes: ptr.To[int32](2), }, + { + name: "test prefilter plugin returned an invalid node", + registerPlugins: []tf.RegisterPluginFunc{ + tf.RegisterQueueSortPlugin(queuesort.Name, queuesort.New), + tf.RegisterPreFilterPlugin( + "FakePreFilter", + tf.NewFakePreFilterPlugin("FakePreFilter", &framework.PreFilterResult{ + NodeNames: sets.New("invalid-node"), + }, nil), + ), + tf.RegisterFilterPlugin("TrueFilter", tf.NewTrueFilterPlugin), + tf.RegisterBindPlugin(defaultbinder.Name, defaultbinder.New), + }, + nodes: []string{"1", "2"}, + pod: st.MakePod().Name("test-prefilter").UID("test-prefilter").Obj(), + wantNodes: nil, + wErr: &framework.FitError{ + Pod: st.MakePod().Name("test-prefilter").UID("test-prefilter").Obj(), + NumAllNodes: 2, + Diagnosis: framework.Diagnosis{ + NodeToStatusMap: framework.NodeToStatusMap{ + "1": framework.NewStatus(framework.UnschedulableAndUnresolvable, "node is filtered out by the prefilter result"), + "2": framework.NewStatus(framework.UnschedulableAndUnresolvable, "node is filtered out by the prefilter result"), + }, + }, + }, + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { From 42b93b35ba70786f2dd781276752858cca33a149 Mon Sep 17 00:00:00 2001 From: AxeZhan Date: Sat, 18 May 2024 05:00:02 +0800 Subject: [PATCH 2/2] add an integration test when nodeAffinity specifies a non-existent node. --- test/integration/scheduler/scheduler_test.go | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go index 8f3bf89e0ab..092c8834324 100644 --- a/test/integration/scheduler/scheduler_test.go +++ b/test/integration/scheduler/scheduler_test.go @@ -480,6 +480,33 @@ func TestSchedulerInformers(t *testing.T) { }), preemptedPodIndexes: map[int]struct{}{2: {}}, }, + { + name: "The pod cannot be scheduled when nodeAffinity specifies a non-existent node.", + nodes: []*nodeConfig{{name: "node-1", res: defaultNodeRes}}, + existingPods: []*v1.Pod{}, + pod: testutils.InitPausePod(&testutils.PausePodConfig{ + Name: "unschedulable-pod", + Namespace: testCtx.NS.Name, + Affinity: &v1.Affinity{ + NodeAffinity: &v1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ + NodeSelectorTerms: []v1.NodeSelectorTerm{ + { + MatchFields: []v1.NodeSelectorRequirement{ + { + Key: "metadata.name", + Operator: v1.NodeSelectorOpIn, + Values: []string{"invalid-node"}, + }, + }, + }, + }, + }, + }, + }, + Resources: defaultPodRes, + }), + }, } for _, test := range tests {