in pkg/scheduler/plugins/task-topology/manager.go [266:305]
func (jm *JobManager) buildBucket(taskWithOrder []*api.TaskInfo) {
nodeBucketMapping := make(map[string]*Bucket)
for _, task := range taskWithOrder {
klog.V(5).Infof("jobID %s task with order task %s/%s", jm.jobID, task.Namespace, task.Name)
var selectedBucket *Bucket
maxAffinity := math.MinInt32
taskName := getTaskName(task)
if task.NodeName != "" {
// generate bucket by node
maxAffinity = 0
selectedBucket = nodeBucketMapping[task.NodeName]
} else {
for _, bucket := range jm.buckets {
bucketPodAff := jm.checkTaskSetAffinity(taskName, bucket.taskNameSet, false)
// choose the best fit affinity, or balance resource between bucket
if bucketPodAff > maxAffinity {
maxAffinity = bucketPodAff
selectedBucket = bucket
} else if bucketPodAff == maxAffinity && selectedBucket != nil &&
bucket.reqScore < selectedBucket.reqScore {
selectedBucket = bucket
}
}
}
if maxAffinity < 0 || selectedBucket == nil {
selectedBucket = jm.NewBucket()
if task.NodeName != "" {
nodeBucketMapping[task.NodeName] = selectedBucket
}
}
jm.AddTaskToBucket(selectedBucket.index, taskName, task)
}
}