@@ -66,15 +66,10 @@ const (
66
66
minFeasibleNodesPercentageToFind = 5
67
67
)
68
68
69
- // FailedPredicateMap declares a map[string][]algorithm.PredicateFailureReason type.
70
- type FailedPredicateMap map [string ][]predicates.PredicateFailureReason
71
-
72
69
// FitError describes a fit error of a pod.
73
70
type FitError struct {
74
- Pod * v1.Pod
75
- NumAllNodes int
76
- // TODO(Huang-Wei): remove 'FailedPredicates'
77
- FailedPredicates FailedPredicateMap
71
+ Pod * v1.Pod
72
+ NumAllNodes int
78
73
FilteredNodesStatuses framework.NodeToStatusMap
79
74
}
80
75
@@ -89,20 +84,14 @@ const (
89
84
// Error returns detailed information of why the pod failed to fit on each node
90
85
func (f * FitError ) Error () string {
91
86
reasons := make (map [string ]int )
92
- for _ , predicates := range f .FailedPredicates {
93
- for _ , pred := range predicates {
94
- reasons [pred .GetReason ()]++
95
- }
96
- }
97
-
98
87
for _ , status := range f .FilteredNodesStatuses {
99
88
for _ , reason := range status .Reasons () {
100
89
reasons [reason ]++
101
90
}
102
91
}
103
92
104
93
sortReasonsHistogram := func () []string {
105
- reasonStrings := []string {}
94
+ var reasonStrings []string
106
95
for k , v := range reasons {
107
96
reasonStrings = append (reasonStrings , fmt .Sprintf ("%v %v" , v , k ))
108
97
}
@@ -209,7 +198,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, state *framework.CycleS
209
198
trace .Step ("Running prefilter plugins done" )
210
199
211
200
startPredicateEvalTime := time .Now ()
212
- filteredNodes , failedPredicateMap , filteredNodesStatuses , err := g .findNodesThatFit (ctx , state , pod )
201
+ filteredNodes , filteredNodesStatuses , err := g .findNodesThatFit (ctx , state , pod )
213
202
if err != nil {
214
203
return result , err
215
204
}
@@ -225,7 +214,6 @@ func (g *genericScheduler) Schedule(ctx context.Context, state *framework.CycleS
225
214
return result , & FitError {
226
215
Pod : pod ,
227
216
NumAllNodes : len (g .nodeInfoSnapshot .NodeInfoList ),
228
- FailedPredicates : failedPredicateMap ,
229
217
FilteredNodesStatuses : filteredNodesStatuses ,
230
218
}
231
219
}
@@ -242,7 +230,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, state *framework.CycleS
242
230
metrics .DeprecatedSchedulingAlgorithmPriorityEvaluationDuration .Observe (metrics .SinceInMicroseconds (startPriorityEvalTime ))
243
231
return ScheduleResult {
244
232
SuggestedHost : filteredNodes [0 ].Name ,
245
- EvaluatedNodes : 1 + len (failedPredicateMap ) + len ( filteredNodesStatuses ),
233
+ EvaluatedNodes : 1 + len (filteredNodesStatuses ),
246
234
FeasibleNodes : 1 ,
247
235
}, nil
248
236
}
@@ -263,7 +251,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, state *framework.CycleS
263
251
264
252
return ScheduleResult {
265
253
SuggestedHost : host ,
266
- EvaluatedNodes : len (filteredNodes ) + len (failedPredicateMap ) + len ( filteredNodesStatuses ),
254
+ EvaluatedNodes : len (filteredNodes ) + len (filteredNodesStatuses ),
267
255
FeasibleNodes : len (filteredNodes ),
268
256
}, err
269
257
}
@@ -470,10 +458,8 @@ func (g *genericScheduler) numFeasibleNodesToFind(numAllNodes int32) (numNodes i
470
458
471
459
// Filters the nodes to find the ones that fit based on the given predicate functions
472
460
// Each node is passed through the predicate functions to determine if it is a fit
473
- // TODO(Huang-Wei): remove 'FailedPredicateMap' from the return parameters.
474
- func (g * genericScheduler ) findNodesThatFit (ctx context.Context , state * framework.CycleState , pod * v1.Pod ) ([]* v1.Node , FailedPredicateMap , framework.NodeToStatusMap , error ) {
461
+ func (g * genericScheduler ) findNodesThatFit (ctx context.Context , state * framework.CycleState , pod * v1.Pod ) ([]* v1.Node , framework.NodeToStatusMap , error ) {
475
462
var filtered []* v1.Node
476
- failedPredicateMap := FailedPredicateMap {}
477
463
filteredNodesStatuses := framework.NodeToStatusMap {}
478
464
479
465
if ! g .framework .HasFilterPlugins () {
@@ -496,7 +482,7 @@ func (g *genericScheduler) findNodesThatFit(ctx context.Context, state *framewor
496
482
// We check the nodes starting from where we left off in the previous scheduling cycle,
497
483
// this is to make sure all nodes have the same chance of being examined across pods.
498
484
nodeInfo := g .nodeInfoSnapshot .NodeInfoList [(g .nextStartNodeIndex + i )% allNodes ]
499
- fits , _ , status , err := g .podFitsOnNode (ctx , state , pod , nodeInfo )
485
+ fits , status , err := g .podFitsOnNode (ctx , state , pod , nodeInfo )
500
486
if err != nil {
501
487
errCh .SendErrorWithCancel (err , cancel )
502
488
return
@@ -521,12 +507,12 @@ func (g *genericScheduler) findNodesThatFit(ctx context.Context, state *framewor
521
507
// Stops searching for more nodes once the configured number of feasible nodes
522
508
// are found.
523
509
workqueue .ParallelizeUntil (ctx , 16 , allNodes , checkNode )
524
- processedNodes := int (filteredLen ) + len (filteredNodesStatuses ) + len ( failedPredicateMap )
510
+ processedNodes := int (filteredLen ) + len (filteredNodesStatuses )
525
511
g .nextStartNodeIndex = (g .nextStartNodeIndex + processedNodes ) % allNodes
526
512
527
513
filtered = filtered [:filteredLen ]
528
514
if err := errCh .ReceiveError (); err != nil {
529
- return []* v1.Node {}, FailedPredicateMap {}, framework.NodeToStatusMap {}, err
515
+ return []* v1.Node {}, framework.NodeToStatusMap {}, err
530
516
}
531
517
}
532
518
@@ -543,23 +529,23 @@ func (g *genericScheduler) findNodesThatFit(ctx context.Context, state *framewor
543
529
continue
544
530
}
545
531
546
- return []* v1.Node {}, FailedPredicateMap {}, framework.NodeToStatusMap {}, err
532
+ return []* v1.Node {}, framework.NodeToStatusMap {}, err
547
533
}
548
534
549
- // TODO(Huang-Wei): refactor this to fill 'filteredNodesStatuses' instead of 'failedPredicateMap'.
550
535
for failedNodeName , failedMsg := range failedMap {
551
- if _ , found := failedPredicateMap [failedNodeName ]; ! found {
552
- failedPredicateMap [failedNodeName ] = []predicates.PredicateFailureReason {}
536
+ if _ , found := filteredNodesStatuses [failedNodeName ]; ! found {
537
+ filteredNodesStatuses [failedNodeName ] = framework .NewStatus (framework .Unschedulable , failedMsg )
538
+ } else {
539
+ filteredNodesStatuses [failedNodeName ].AppendReason (failedMsg )
553
540
}
554
- failedPredicateMap [failedNodeName ] = append (failedPredicateMap [failedNodeName ], predicates .NewPredicateFailureError (extender .Name (), failedMsg ))
555
541
}
556
542
filtered = filteredList
557
543
if len (filtered ) == 0 {
558
544
break
559
545
}
560
546
}
561
547
}
562
- return filtered , failedPredicateMap , filteredNodesStatuses , nil
548
+ return filtered , filteredNodesStatuses , nil
563
549
}
564
550
565
551
// addNominatedPods adds pods with equal or greater priority which are nominated
@@ -606,8 +592,7 @@ func (g *genericScheduler) podFitsOnNode(
606
592
state * framework.CycleState ,
607
593
pod * v1.Pod ,
608
594
info * schedulernodeinfo.NodeInfo ,
609
- ) (bool , []predicates.PredicateFailureReason , * framework.Status , error ) {
610
- var failedPredicates []predicates.PredicateFailureReason
595
+ ) (bool , * framework.Status , error ) {
611
596
var status * framework.Status
612
597
613
598
podsAdded := false
@@ -636,19 +621,19 @@ func (g *genericScheduler) podFitsOnNode(
636
621
var err error
637
622
podsAdded , stateToUse , nodeInfoToUse , err = g .addNominatedPods (ctx , pod , state , info )
638
623
if err != nil {
639
- return false , []predicates. PredicateFailureReason {}, nil , err
624
+ return false , nil , err
640
625
}
641
- } else if ! podsAdded || len ( failedPredicates ) != 0 || ! status .IsSuccess () {
626
+ } else if ! podsAdded || ! status .IsSuccess () {
642
627
break
643
628
}
644
629
645
630
status = g .framework .RunFilterPlugins (ctx , stateToUse , pod , nodeInfoToUse )
646
631
if ! status .IsSuccess () && ! status .IsUnschedulable () {
647
- return false , failedPredicates , status , status .AsError ()
632
+ return false , status , status .AsError ()
648
633
}
649
634
}
650
635
651
- return len ( failedPredicates ) == 0 && status .IsSuccess (), failedPredicates , status , nil
636
+ return status .IsSuccess (), status , nil
652
637
}
653
638
654
639
// prioritizeNodes prioritizes the nodes by running the score plugins,
@@ -1011,7 +996,7 @@ func (g *genericScheduler) selectVictimsOnNode(
1011
996
// inter-pod affinity to one or more victims, but we have decided not to
1012
997
// support this case for performance reasons. Having affinity to lower
1013
998
// priority pods is not a recommended configuration anyway.
1014
- if fits , _ , _ , err := g .podFitsOnNode (ctx , state , pod , nodeInfo ); ! fits {
999
+ if fits , _ , err := g .podFitsOnNode (ctx , state , pod , nodeInfo ); ! fits {
1015
1000
if err != nil {
1016
1001
klog .Warningf ("Encountered error while selecting victims on node %v: %v" , nodeInfo .Node ().Name , err )
1017
1002
}
@@ -1029,7 +1014,7 @@ func (g *genericScheduler) selectVictimsOnNode(
1029
1014
if err := addPod (p ); err != nil {
1030
1015
return false , err
1031
1016
}
1032
- fits , _ , _ , _ := g .podFitsOnNode (ctx , state , pod , nodeInfo )
1017
+ fits , _ , _ := g .podFitsOnNode (ctx , state , pod , nodeInfo )
1033
1018
if ! fits {
1034
1019
if err := removePod (p ); err != nil {
1035
1020
return false , err
@@ -1060,22 +1045,15 @@ func (g *genericScheduler) selectVictimsOnNode(
1060
1045
// nodesWherePreemptionMightHelp returns a list of nodes with failed predicates
1061
1046
// that may be satisfied by removing pods from the node.
1062
1047
func nodesWherePreemptionMightHelp (nodeNameToInfo map [string ]* schedulernodeinfo.NodeInfo , fitErr * FitError ) []* v1.Node {
1063
- potentialNodes := []* v1.Node {}
1048
+ var potentialNodes []* v1.Node
1064
1049
for name , node := range nodeNameToInfo {
1050
+ // We reply on the status by each plugin - 'Unschedulable' or 'UnschedulableAndUnresolvable'
1051
+ // to determine whether preemption may help or not on the node.
1065
1052
if fitErr .FilteredNodesStatuses [name ].Code () == framework .UnschedulableAndUnresolvable {
1066
1053
continue
1067
1054
}
1068
- failedPredicates := fitErr .FailedPredicates [name ]
1069
-
1070
- // If we assume that scheduler looks at all nodes and populates the failedPredicateMap
1071
- // (which is the case today), the !found case should never happen, but we'd prefer
1072
- // to rely less on such assumptions in the code when checking does not impose
1073
- // significant overhead.
1074
- // Also, we currently assume all failures returned by extender as resolvable.
1075
- if ! predicates .UnresolvablePredicateExists (failedPredicates ) {
1076
- klog .V (3 ).Infof ("Node %v is a potential node for preemption." , name )
1077
- potentialNodes = append (potentialNodes , node .Node ())
1078
- }
1055
+ klog .V (3 ).Infof ("Node %v is a potential node for preemption." , name )
1056
+ potentialNodes = append (potentialNodes , node .Node ())
1079
1057
}
1080
1058
return potentialNodes
1081
1059
}
0 commit comments