in pkg/scheduler/plugins/task-topology/topology.go [63:133]
func (p *taskTopologyPlugin) TaskOrderFn(l interface{}, r interface{}) int {
lv, ok := l.(*api.TaskInfo)
if !ok {
klog.Errorf("Object is not a taskinfo")
}
rv, ok := r.(*api.TaskInfo)
if !ok {
klog.Errorf("Object is not a taskinfo")
}
lvJobManager := p.managers[lv.Job]
rvJobManager := p.managers[rv.Job]
var lvBucket, rvBucket *Bucket
if lvJobManager != nil {
lvBucket = lvJobManager.GetBucket(lv)
} else {
klog.V(4).Infof("No job manager for job <ID: %s>, do not return task order.", lv.Job)
return 0
}
if rvJobManager != nil {
rvBucket = rvJobManager.GetBucket(rv)
} else {
klog.V(4).Infof("No job manager for job <ID: %s>, do not return task order.", rv.Job)
return 0
}
// the one have bucket would always prior to another
lvInBucket := lvBucket != nil
rvInBucket := rvBucket != nil
if lvInBucket != rvInBucket {
if lvInBucket {
return -1
}
return 1
}
// comparison between job is not the duty of this plugin
if lv.Job != rv.Job {
return 0
}
// task out of bucket have no order
if !lvInBucket && !rvInBucket {
return 0
}
// the big bucket should prior to small one
lvHasTask := len(lvBucket.tasks)
rvHasTask := len(rvBucket.tasks)
if lvHasTask != rvHasTask {
if lvHasTask > rvHasTask {
return -1
}
return 1
}
lvBucketIndex := lvBucket.index
rvBucketIndex := rvBucket.index
// in the same bucket, the affinityOrder is ok
if lvBucketIndex == rvBucketIndex {
affinityOrder := lvJobManager.taskAffinityOrder(lv, rv)
return -affinityOrder
}
// the old bucket should prior to young one
if lvBucketIndex < rvBucketIndex {
return -1
}
return 1
}