From fefba224b688ddbf4a0d21e60fc410afa4db8eb9 Mon Sep 17 00:00:00 2001 From: googs1025 Date: Fri, 13 Dec 2024 09:37:22 +0800 Subject: [PATCH] bug(preemption): fix SelectVictimsOnNode method consistent with default scheduler --- pkg/capacityscheduling/capacity_scheduling.go | 7 +++++++ pkg/preemptiontoleration/preemption_toleration.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/capacityscheduling/capacity_scheduling.go b/pkg/capacityscheduling/capacity_scheduling.go index 1eb0ed8db..75f235f53 100644 --- a/pkg/capacityscheduling/capacity_scheduling.go +++ b/pkg/capacityscheduling/capacity_scheduling.go @@ -620,6 +620,8 @@ func (p *preemptor) SelectVictimsOnNode( var victims []*v1.Pod numViolatingVictim := 0 + // Sort potentialVictims by pod priority from high to low, which ensures to + // reprieve higher priority pods first. sort.Slice(potentialVictims, func(i, j int) bool { return schedutil.MoreImportantPod(potentialVictims[i].Pod, potentialVictims[j].Pod) }) @@ -666,6 +668,11 @@ func (p *preemptor) SelectVictimsOnNode( return nil, 0, framework.AsStatus(err) } } + + // Sort victims after reprieving pods to keep the pods in the victims sorted in order of priority from high to low. + if len(violatingVictims) != 0 && len(nonViolatingVictims) != 0 { + sort.Slice(victims, func(i, j int) bool { return schedutil.MoreImportantPod(victims[i], victims[j]) }) + } return victims, numViolatingVictim, framework.NewStatus(framework.Success) } diff --git a/pkg/preemptiontoleration/preemption_toleration.go b/pkg/preemptiontoleration/preemption_toleration.go index 7ab7767d1..bf3ebd2e7 100644 --- a/pkg/preemptiontoleration/preemption_toleration.go +++ b/pkg/preemptiontoleration/preemption_toleration.go @@ -250,6 +250,8 @@ func (pl *PreemptionToleration) SelectVictimsOnNode( } var victims []*v1.Pod numViolatingVictim := 0 + // Sort potentialVictims by pod priority from high to low, which ensures to + // reprieve higher priority pods first. sort.Slice(potentialVictims, func(i, j int) bool { return util.MoreImportantPod(potentialVictims[i].Pod, potentialVictims[j].Pod) }) // Try to reprieve as many pods as possible. We first try to reprieve the PDB // violating victims and then other non-violating ones. In both cases, we start @@ -284,6 +286,11 @@ func (pl *PreemptionToleration) SelectVictimsOnNode( return nil, 0, framework.AsStatus(err) } } + + // Sort victims after reprieving pods to keep the pods in the victims sorted in order of priority from high to low. + if len(violatingVictims) != 0 && len(nonViolatingVictims) != 0 { + sort.Slice(victims, func(i, j int) bool { return util.MoreImportantPod(victims[i], victims[j]) }) + } return victims, numViolatingVictim, framework.NewStatus(framework.Success) }