@@ -19,23 +19,24 @@ package flavorassigner
1919import (
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.
3434type 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
4142type FlavorAssignmentAttempts []FlavorAssignmentAttempt
@@ -58,16 +59,18 @@ func (fa *FlavorAssignmentAttempts) AddNoFitFlavorAttempt(flavor kueue.ResourceF
5859
5960func (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 }
0 commit comments