17
17
package allocate
18
18
19
19
import (
20
- "sort"
21
20
"time"
22
21
23
22
"k8s.io/klog/v2"
@@ -34,7 +33,6 @@ type Action struct {
34
33
session * framework.Session
35
34
// configured flag for error cache
36
35
enablePredicateErrorCache bool
37
- hyperNodesTiers []int
38
36
39
37
// hyperNodeScoresByJob stores job total score for all available hyperNodes, this is used for accumulate
40
38
// all nodes' scores in each available hyperNode only when job has hard network topology constrains
@@ -45,7 +43,6 @@ type Action struct {
45
43
func New () * Action {
46
44
return & Action {
47
45
enablePredicateErrorCache : true , // default to enable it
48
- hyperNodesTiers : []int {},
49
46
hyperNodeScoresByJob : make (map [string ]map [string ]float64 ),
50
47
}
51
48
}
@@ -61,26 +58,11 @@ func (alloc *Action) parseArguments(ssn *framework.Session) {
61
58
arguments .GetBool (& alloc .enablePredicateErrorCache , conf .EnablePredicateErrCacheKey )
62
59
}
63
60
64
- func (alloc * Action ) parseHyperNodesTiers (ssn * framework.Session ) {
65
- if ssn .HyperNodesSetByTier == nil || len (ssn .HyperNodesSetByTier ) == 0 {
66
- return
67
- }
68
-
69
- // sort to guarantee the traverse order is from down to top.
70
- var tiers []int
71
- for tier := range ssn .HyperNodesSetByTier {
72
- tiers = append (tiers , tier )
73
- }
74
- sort .Ints (tiers )
75
- alloc .hyperNodesTiers = tiers
76
- }
77
-
78
61
func (alloc * Action ) Execute (ssn * framework.Session ) {
79
62
klog .V (5 ).Infof ("Enter Allocate ..." )
80
63
defer klog .V (5 ).Infof ("Leaving Allocate ..." )
81
64
82
65
alloc .parseArguments (ssn )
83
- alloc .parseHyperNodesTiers (ssn )
84
66
85
67
// the allocation for pod may have many stages
86
68
// 1. pick a queue named Q (using ssn.QueueOrderFn)
@@ -241,7 +223,7 @@ func (alloc *Action) allocateResourceForTasksWithTopology(tasks *util.PriorityQu
241
223
jobAllocatedHyperNode := job .PodGroup .Annotations [api .JobAllocatedHyperNode ]
242
224
243
225
// Find a suitable hyperNode in one tier from down to top everytime to ensure that the selected hyperNode spans the least tier.
244
- for _ , tier := range alloc . hyperNodesTiers {
226
+ for _ , tier := range ssn . HyperNodesTiers {
245
227
if tier > highestAllowedTier {
246
228
klog .V (4 ).ErrorS (nil , "Skip search for higher tier cause highest allowed tier reached" , "jobName" , job .UID , "highestAllowedTier" , highestAllowedTier , "tier" , tier )
247
229
break
@@ -375,6 +357,8 @@ func (alloc *Action) allocateResourcesForTasks(tasks *util.PriorityQueue, job *a
375
357
ssn := alloc .session
376
358
stmt := framework .NewStatement (ssn )
377
359
ph := util .NewPredicateHelper ()
360
+ jobAllocatedHyperNode := job .PodGroup .Annotations [api .JobAllocatedHyperNode ]
361
+ jobAllocatedNewHyperNode := jobAllocatedHyperNode
378
362
379
363
for ! tasks .Empty () {
380
364
task := tasks .Pop ().(* api.TaskInfo )
@@ -414,11 +398,21 @@ func (alloc *Action) allocateResourcesForTasks(tasks *util.PriorityQueue, job *a
414
398
}
415
399
}
416
400
401
+ task .JobAllocatedHyperNode = jobAllocatedNewHyperNode
417
402
bestNode , highestScore := alloc .prioritizeNodes (ssn , task , predicateNodes )
418
403
if bestNode == nil {
419
404
continue
420
405
}
421
-
406
+ if hyperNode == "" {
407
+ hyperNode = util .FindHyperNodeForNode (bestNode .Name , ssn .RealNodesList , ssn .HyperNodesTiers , ssn .HyperNodesSetByTier )
408
+ if hyperNode != "" {
409
+ if jobAllocatedNewHyperNode == "" {
410
+ jobAllocatedNewHyperNode = hyperNode
411
+ } else {
412
+ jobAllocatedNewHyperNode = ssn .HyperNodes .GetLCAHyperNode (hyperNode , jobAllocatedNewHyperNode )
413
+ }
414
+ }
415
+ }
422
416
alloc .sumNodeScoresInHyperNode (string (job .UID ), hyperNode , highestScore )
423
417
alloc .allocateResourcesForTask (stmt , task , bestNode , job )
424
418
@@ -429,6 +423,9 @@ func (alloc *Action) allocateResourcesForTasks(tasks *util.PriorityQueue, job *a
429
423
430
424
if ssn .JobReady (job ) {
431
425
klog .V (3 ).InfoS ("Job ready, return statement" , "jobName" , job .UID )
426
+ if jobAllocatedNewHyperNode != "" && jobAllocatedNewHyperNode != jobAllocatedHyperNode {
427
+ job .PodGroup .GetAnnotations ()[api .JobAllocatedHyperNode ] = jobAllocatedNewHyperNode
428
+ }
432
429
return stmt
433
430
} else {
434
431
if ! ssn .JobPipelined (job ) {
0 commit comments