Skip to content

Commit 96201b5

Browse files
authored
Merge pull request kubernetes#82156 from mrkm4ntr/fix-evaluated-nodes
Fix EvaluatedNodes in ScheduleResult
2 parents abfed68 + bb94dfe commit 96201b5

File tree

2 files changed

+56
-49
lines changed

2 files changed

+56
-49
lines changed

pkg/scheduler/core/generic_scheduler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ func (g *genericScheduler) Schedule(pod *v1.Pod, pluginContext *framework.Plugin
243243
metrics.DeprecatedSchedulingAlgorithmPriorityEvaluationDuration.Observe(metrics.SinceInMicroseconds(startPriorityEvalTime))
244244
return ScheduleResult{
245245
SuggestedHost: filteredNodes[0].Name,
246-
EvaluatedNodes: 1 + len(failedPredicateMap),
246+
EvaluatedNodes: 1 + len(failedPredicateMap) + len(filteredNodesStatuses),
247247
FeasibleNodes: 1,
248248
}, nil
249249
}
@@ -263,7 +263,7 @@ func (g *genericScheduler) Schedule(pod *v1.Pod, pluginContext *framework.Plugin
263263
trace.Step("Selecting host done")
264264
return ScheduleResult{
265265
SuggestedHost: host,
266-
EvaluatedNodes: len(filteredNodes) + len(failedPredicateMap),
266+
EvaluatedNodes: len(filteredNodes) + len(failedPredicateMap) + len(filteredNodesStatuses),
267267
FeasibleNodes: len(filteredNodes),
268268
}, err
269269
}

pkg/scheduler/core/generic_scheduler_test.go

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ var emptyFramework, _ = framework.NewFramework(EmptyPluginRegistry, nil, []sched
143143

144144
// FakeFilterPlugin is a test filter plugin used by default scheduler.
145145
type FakeFilterPlugin struct {
146-
numFilterCalled int32
147-
returnCode framework.Code
146+
numFilterCalled int32
147+
failedNodeReturnCodeMap map[string]framework.Code
148148
}
149149

150150
// Name returns name of the plugin.
@@ -155,19 +155,19 @@ func (fp *FakeFilterPlugin) Name() string {
155155
// reset is used to reset filter plugin.
156156
func (fp *FakeFilterPlugin) reset() {
157157
fp.numFilterCalled = 0
158-
fp.returnCode = framework.Success
158+
fp.failedNodeReturnCodeMap = map[string]framework.Code{}
159159
}
160160

161161
// Filter is a test function that returns an error or nil, depending on the
162-
// value of "failFilter".
162+
// value of "failedNodeReturnCodeMap".
163163
func (fp *FakeFilterPlugin) Filter(pc *framework.PluginContext, pod *v1.Pod, nodeName string) *framework.Status {
164164
atomic.AddInt32(&fp.numFilterCalled, 1)
165165

166-
if fp.returnCode == framework.Success {
167-
return nil
166+
if returnCode, ok := fp.failedNodeReturnCodeMap[nodeName]; ok {
167+
return framework.NewStatus(returnCode, fmt.Sprintf("injecting failure for pod %v", pod.Name))
168168
}
169169

170-
return framework.NewStatus(fp.returnCode, fmt.Sprintf("injecting failure for pod %v", pod.Name))
170+
return nil
171171
}
172172

173173
// newPlugin returns a plugin factory with specified Plugin.
@@ -274,25 +274,23 @@ func TestGenericScheduler(t *testing.T) {
274274
}
275275

276276
tests := []struct {
277-
name string
278-
predicates map[string]algorithmpredicates.FitPredicate
279-
prioritizers []priorities.PriorityConfig
280-
alwaysCheckAllPredicates bool
281-
nodes []string
282-
pvcs []*v1.PersistentVolumeClaim
283-
pod *v1.Pod
284-
pods []*v1.Pod
285-
buildPredMeta bool // build predicates metadata or not
286-
filterReturnCode framework.Code
287-
expectedHosts sets.String
288-
expectsErr bool
289-
wErr error
277+
name string
278+
predicates map[string]algorithmpredicates.FitPredicate
279+
prioritizers []priorities.PriorityConfig
280+
alwaysCheckAllPredicates bool
281+
nodes []string
282+
pvcs []*v1.PersistentVolumeClaim
283+
pod *v1.Pod
284+
pods []*v1.Pod
285+
buildPredMeta bool // build predicates metadata or not
286+
filterFailedNodeReturnCodeMap map[string]framework.Code
287+
expectedHosts sets.String
288+
wErr error
290289
}{
291290
{
292291
predicates: map[string]algorithmpredicates.FitPredicate{"false": falsePredicate},
293292
prioritizers: []priorities.PriorityConfig{{Map: EqualPriorityMap, Weight: 1}},
294293
nodes: []string{"machine1", "machine2"},
295-
expectsErr: true,
296294
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
297295
name: "test 1",
298296
wErr: &FitError{
@@ -356,7 +354,6 @@ func TestGenericScheduler(t *testing.T) {
356354
prioritizers: []priorities.PriorityConfig{{Function: numericPriority, Weight: 1}},
357355
nodes: []string{"3", "2", "1"},
358356
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
359-
expectsErr: true,
360357
name: "test 7",
361358
wErr: &FitError{
362359
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
@@ -388,7 +385,6 @@ func TestGenericScheduler(t *testing.T) {
388385
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
389386
prioritizers: []priorities.PriorityConfig{{Function: numericPriority, Weight: 1}},
390387
nodes: []string{"1", "2"},
391-
expectsErr: true,
392388
name: "test 8",
393389
wErr: &FitError{
394390
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
@@ -443,9 +439,8 @@ func TestGenericScheduler(t *testing.T) {
443439
},
444440
},
445441
},
446-
name: "unknown PVC",
447-
expectsErr: true,
448-
wErr: fmt.Errorf("persistentvolumeclaim \"unknownPVC\" not found"),
442+
name: "unknown PVC",
443+
wErr: fmt.Errorf("persistentvolumeclaim \"unknownPVC\" not found"),
449444
},
450445
{
451446
// Pod with deleting PVC
@@ -467,9 +462,8 @@ func TestGenericScheduler(t *testing.T) {
467462
},
468463
},
469464
},
470-
name: "deleted PVC",
471-
expectsErr: true,
472-
wErr: fmt.Errorf("persistentvolumeclaim \"existingPVC\" is being deleted"),
465+
name: "deleted PVC",
466+
wErr: fmt.Errorf("persistentvolumeclaim \"existingPVC\" is being deleted"),
473467
},
474468
{
475469
// alwaysCheckAllPredicates is true
@@ -599,14 +593,13 @@ func TestGenericScheduler(t *testing.T) {
599593
wErr: nil,
600594
},
601595
{
602-
name: "test with filter plugin returning Unschedulable status",
603-
predicates: map[string]algorithmpredicates.FitPredicate{"true": truePredicate},
604-
prioritizers: []priorities.PriorityConfig{{Function: numericPriority, Weight: 1}},
605-
nodes: []string{"3"},
606-
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
607-
expectedHosts: nil,
608-
filterReturnCode: framework.Unschedulable,
609-
expectsErr: true,
596+
name: "test with filter plugin returning Unschedulable status",
597+
predicates: map[string]algorithmpredicates.FitPredicate{"true": truePredicate},
598+
prioritizers: []priorities.PriorityConfig{{Function: numericPriority, Weight: 1}},
599+
nodes: []string{"3"},
600+
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
601+
expectedHosts: nil,
602+
filterFailedNodeReturnCodeMap: map[string]framework.Code{"3": framework.Unschedulable},
610603
wErr: &FitError{
611604
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
612605
NumAllNodes: 1,
@@ -617,14 +610,13 @@ func TestGenericScheduler(t *testing.T) {
617610
},
618611
},
619612
{
620-
name: "test with filter plugin returning UnschedulableAndUnresolvable status",
621-
predicates: map[string]algorithmpredicates.FitPredicate{"true": truePredicate},
622-
prioritizers: []priorities.PriorityConfig{{Function: numericPriority, Weight: 1}},
623-
nodes: []string{"3"},
624-
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
625-
expectedHosts: nil,
626-
filterReturnCode: framework.UnschedulableAndUnresolvable,
627-
expectsErr: true,
613+
name: "test with filter plugin returning UnschedulableAndUnresolvable status",
614+
predicates: map[string]algorithmpredicates.FitPredicate{"true": truePredicate},
615+
prioritizers: []priorities.PriorityConfig{{Function: numericPriority, Weight: 1}},
616+
nodes: []string{"3"},
617+
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
618+
expectedHosts: nil,
619+
filterFailedNodeReturnCodeMap: map[string]framework.Code{"3": framework.UnschedulableAndUnresolvable},
628620
wErr: &FitError{
629621
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
630622
NumAllNodes: 1,
@@ -634,10 +626,20 @@ func TestGenericScheduler(t *testing.T) {
634626
},
635627
},
636628
},
629+
{
630+
name: "test with partial failed filter plugin",
631+
predicates: map[string]algorithmpredicates.FitPredicate{"true": truePredicate},
632+
prioritizers: []priorities.PriorityConfig{{Function: numericPriority, Weight: 1}},
633+
nodes: []string{"1", "2"},
634+
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
635+
expectedHosts: nil,
636+
filterFailedNodeReturnCodeMap: map[string]framework.Code{"1": framework.Unschedulable},
637+
wErr: nil,
638+
},
637639
}
638640
for _, test := range tests {
639641
t.Run(test.name, func(t *testing.T) {
640-
filterPlugin.returnCode = test.filterReturnCode
642+
filterPlugin.failedNodeReturnCodeMap = test.filterFailedNodeReturnCodeMap
641643

642644
cache := internalcache.New(time.Duration(0), wait.NeverStop)
643645
for _, pod := range test.pods {
@@ -678,6 +680,9 @@ func TestGenericScheduler(t *testing.T) {
678680
if test.expectedHosts != nil && !test.expectedHosts.Has(result.SuggestedHost) {
679681
t.Errorf("Expected: %s, got: %s", test.expectedHosts, result.SuggestedHost)
680682
}
683+
if test.wErr == nil && len(test.nodes) != result.EvaluatedNodes {
684+
t.Errorf("Expected EvaluatedNodes: %d, got: %d", len(test.nodes), result.EvaluatedNodes)
685+
}
681686

682687
filterPlugin.reset()
683688
})
@@ -1366,17 +1371,19 @@ func TestSelectNodesForPreemption(t *testing.T) {
13661371
labelKeys := []string{"hostname", "zone", "region"}
13671372
for _, test := range tests {
13681373
t.Run(test.name, func(t *testing.T) {
1374+
filterFailedNodeReturnCodeMap := map[string]framework.Code{}
13691375
cache := internalcache.New(time.Duration(0), wait.NeverStop)
13701376
for _, pod := range test.pods {
13711377
cache.AddPod(pod)
13721378
}
13731379
for _, name := range test.nodes {
1380+
filterFailedNodeReturnCodeMap[name] = test.filterReturnCode
13741381
cache.AddNode(&v1.Node{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"hostname": name}}})
13751382
}
13761383

13771384
predMetaProducer := algorithmpredicates.EmptyPredicateMetadataProducer
13781385

1379-
filterPlugin.returnCode = test.filterReturnCode
1386+
filterPlugin.failedNodeReturnCodeMap = filterFailedNodeReturnCodeMap
13801387
scheduler := NewGenericScheduler(
13811388
nil,
13821389
internalqueue.NewSchedulingQueue(nil, nil),

0 commit comments

Comments
 (0)