Skip to content

Commit 0b3b6aa

Browse files
authored
feat: include more detailed preemption information in flavor attempt (#8024)
events
1 parent e3636b4 commit 0b3b6aa

File tree

5 files changed

+265
-102
lines changed

5 files changed

+265
-102
lines changed

pkg/scheduler/flavorassigner/flavor_assigner_attempts.go

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,24 @@ package flavorassigner
1919
import (
2020
"fmt"
2121
"slices"
22-
"sort"
2322
"strings"
2423

2524
corev1 "k8s.io/api/core/v1"
2625
"k8s.io/apimachinery/pkg/util/sets"
2726

2827
kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
2928
schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
29+
preemptioncommon "sigs.k8s.io/kueue/pkg/scheduler/preemption/common"
3030
)
3131

3232
// FlavorAssignmentAttempt captures one attempted flavor and its worst-case outcome
3333
// across the requested resources.
3434
type FlavorAssignmentAttempt struct {
35-
Flavor kueue.ResourceFlavorReference
36-
Mode FlavorAssignmentMode
37-
Borrow int
38-
Reasons []string
35+
Flavor kueue.ResourceFlavorReference
36+
Mode FlavorAssignmentMode
37+
Borrow int
38+
PreemptionPossibility *preemptioncommon.PreemptionPossibility
39+
Reasons []string
3940
}
4041

4142
type FlavorAssignmentAttempts []FlavorAssignmentAttempt
@@ -58,16 +59,18 @@ func (fa *FlavorAssignmentAttempts) AddNoFitFlavorAttempt(flavor kueue.ResourceF
5859

5960
func (fa *FlavorAssignmentAttempts) AddRepresentativeModeFlavorAttempt(
6061
flavor kueue.ResourceFlavorReference,
61-
mode FlavorAssignmentMode,
62+
preemptionMode preemptionMode,
6263
maxBorrow int, reasons []string,
6364
) {
65+
flavorAssignmentMode := preemptionMode.flavorAssignmentMode()
6466
flavorAttempt := FlavorAssignmentAttempt{
65-
Flavor: flavor,
66-
Mode: mode,
67-
Borrow: maxBorrow,
67+
Flavor: flavor,
68+
Mode: flavorAssignmentMode,
69+
PreemptionPossibility: preemptionMode.preemptionPossibility(),
70+
Borrow: maxBorrow,
6871
}
6972
if len(reasons) > 0 {
70-
sort.Strings(reasons)
73+
slices.Sort(reasons)
7174
flavorAttempt.Reasons = append(flavorAttempt.Reasons, reasons...)
7275
}
7376
*fa = append(*fa, flavorAttempt)
@@ -100,7 +103,7 @@ func mergeFlavorAttemptsForResource(
100103
at.Mode = NoFit
101104
}
102105
at.Reasons = mergeUnique(at.Reasons, []string{msg})
103-
sort.Strings(at.Reasons)
106+
slices.Sort(at.Reasons)
104107
dst[flv] = at
105108
}
106109
}
@@ -116,24 +119,31 @@ func mergeFlavorAttempts(dst map[kueue.ResourceFlavorReference]FlavorAssignmentA
116119
maxBorrow := existing.Borrow
117120
maxBorrow = max(at.Borrow, maxBorrow)
118121

122+
existingPreemption := existing.PreemptionPossibility
123+
if at.PreemptionPossibility != nil && (existingPreemption == nil || *at.PreemptionPossibility < *existingPreemption) {
124+
existingPreemption = at.PreemptionPossibility
125+
}
126+
119127
reasons := mergeUnique(existing.Reasons, at.Reasons)
120-
sort.Strings(reasons)
128+
slices.Sort(reasons)
121129
dst[at.Flavor] = FlavorAssignmentAttempt{
122-
Flavor: at.Flavor,
123-
Mode: worst,
124-
Borrow: maxBorrow,
125-
Reasons: reasons,
130+
Flavor: at.Flavor,
131+
Mode: worst,
132+
Borrow: maxBorrow,
133+
PreemptionPossibility: existingPreemption,
134+
Reasons: reasons,
126135
}
127136
continue
128137
}
129138

130139
cp := FlavorAssignmentAttempt{
131-
Flavor: at.Flavor,
132-
Mode: at.Mode,
133-
Borrow: at.Borrow,
134-
Reasons: mergeUnique(nil, at.Reasons),
140+
Flavor: at.Flavor,
141+
Mode: at.Mode,
142+
Borrow: at.Borrow,
143+
PreemptionPossibility: at.PreemptionPossibility,
144+
Reasons: mergeUnique(nil, at.Reasons),
135145
}
136-
sort.Strings(cp.Reasons)
146+
slices.Sort(cp.Reasons)
137147
dst[at.Flavor] = cp
138148
}
139149
}
@@ -186,7 +196,11 @@ func FormatFlavorAssignmentAttemptsForEvents(a Assignment) string {
186196
}
187197
attemptsBuilder.WriteString(string(att.Flavor))
188198
attemptsBuilder.WriteString("(")
189-
attemptsBuilder.WriteString(att.Mode.String())
199+
if att.PreemptionPossibility == nil {
200+
attemptsBuilder.WriteString(att.Mode.String())
201+
} else {
202+
attemptsBuilder.WriteString(fmt.Sprintf("preemptionMode=%s", att.PreemptionPossibility))
203+
}
190204
if att.Borrow > 0 {
191205
attemptsBuilder.WriteString(fmt.Sprintf(";borrow=%d", att.Borrow))
192206
}

pkg/scheduler/flavorassigner/flavorassigner.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,21 @@ func fromPreemptionPossibility(preemptionPossibility preemptioncommon.Preemption
429429
panic(fmt.Sprintf("illegal PreemptionPossibility: %d", preemptionPossibility))
430430
}
431431

432+
func (mode preemptionMode) preemptionPossibility() *preemptioncommon.PreemptionPossibility {
433+
switch mode {
434+
case noPreemptionCandidates:
435+
return ptr.To(preemptioncommon.NoCandidates)
436+
case preempt:
437+
return ptr.To(preemptioncommon.Preempt)
438+
case reclaim:
439+
return ptr.To(preemptioncommon.Reclaim)
440+
case fit, noFit:
441+
return nil
442+
default:
443+
panic(fmt.Sprintf("illegal preemptionMode: %d", mode))
444+
}
445+
}
446+
432447
func (mode preemptionMode) flavorAssignmentMode() FlavorAssignmentMode {
433448
switch mode {
434449
case noFit:
@@ -795,7 +810,7 @@ func (a *FlavorAssigner) findFlavorForPodSets(
795810
}
796811
}
797812

798-
consideredFlavors.AddRepresentativeModeFlavorAttempt(fName, representativeMode.preemptionMode.flavorAssignmentMode(), maxBorrow, flavorQuotaReasons)
813+
consideredFlavors.AddRepresentativeModeFlavorAttempt(fName, representativeMode.preemptionMode, maxBorrow, flavorQuotaReasons)
799814

800815
if features.Enabled(features.FlavorFungibility) {
801816
if !shouldTryNextFlavor(representativeMode, a.cq.FlavorFungibility) {

0 commit comments

Comments
 (0)