From d7b355d3f4469bdbe1a838dbe9bad18edb1a1394 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Fri, 20 Oct 2023 20:46:01 +0800 Subject: [PATCH] fix(scheduler): improve scheduler prefer and avoid tags strategy (#18372) --- pkg/scheduler/core/context.go | 2 +- pkg/scheduler/core/types.go | 41 +++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/pkg/scheduler/core/context.go b/pkg/scheduler/core/context.go index 42679ec865..85a8e55dc2 100644 --- a/pkg/scheduler/core/context.go +++ b/pkg/scheduler/core/context.go @@ -636,7 +636,7 @@ func (u *Unit) setScore(id string, val score.SScore, prefer tristate.TriState) { scoreObj.ScoreBucket.SetScore(val, prefer) - log.V(10).Infof("SetScore: %q -> %s", id, val.String()) + log.V(10).Infof("SetScore: %q -> %s, prefer: %s", id, val.String(), prefer) } func (u *Unit) SetScore(id string, val score.SScore) { diff --git a/pkg/scheduler/core/types.go b/pkg/scheduler/core/types.go index 053077339c..c7b6833bff 100644 --- a/pkg/scheduler/core/types.go +++ b/pkg/scheduler/core/types.go @@ -157,15 +157,9 @@ func (h HostPriorityList) Len() int { return len(h) } -func (h HostPriorityList) Less(i, j int) bool { +func (h HostPriorityList) compareNormalScore(i, j int) bool { s1 := h[i].Score.ScoreBucket s2 := h[j].Score.ScoreBucket - preferScorei, preferScorej := s1.PreferScore()-s1.AvoidScore(), s2.PreferScore()-s1.AvoidScore() - - if preferScorei != preferScorej { - return preferScorei < preferScorej - } - normalScorei, normalScorej := s1.NormalScore(), s2.NormalScore() if normalScorei == normalScorej { return h[i].Host < h[j].Host @@ -173,6 +167,39 @@ func (h HostPriorityList) Less(i, j int) bool { return normalScorei < normalScorej } +func (h HostPriorityList) Less(i, j int) bool { + si := h[i].Score.ScoreBucket + sj := h[j].Score.ScoreBucket + + if si.PreferScore() > 0 || sj.PreferScore() > 0 { + if si.PreferScore() != 0 && sj.PreferScore() != 0 { + // both have prefer tags + return h.compareNormalScore(i, j) + } + if si.PreferScore() <= 0 { + return true + } + if sj.PreferScore() <= 0 { + return false + } + } + + if si.AvoidScore() > 0 || sj.AvoidScore() > 0 { + if si.AvoidScore() != 0 && sj.AvoidScore() != 0 { + // both have avoid tags + return h.compareNormalScore(i, j) + } + if si.AvoidScore() > 0 { + return true + } + if sj.AvoidScore() > 0 { + return false + } + } + + return h.compareNormalScore(i, j) +} + func (h HostPriorityList) Swap(i, j int) { h[i], h[j] = h[j], h[i] }