diff --git a/pkg/scheduler/framework/session_plugins.go b/pkg/scheduler/framework/session_plugins.go index 150681f03c..94aab076b1 100644 --- a/pkg/scheduler/framework/session_plugins.go +++ b/pkg/scheduler/framework/session_plugins.go @@ -17,6 +17,7 @@ limitations under the License. package framework import ( + "k8s.io/klog/v2" k8sframework "k8s.io/kubernetes/pkg/scheduler/framework" "volcano.sh/apis/pkg/apis/scheduling" @@ -538,12 +539,15 @@ func (ssn *Session) JobOrderFn(l, r interface{}) bool { } } - // If no job order funcs, order job by CreationTimestamp first, then by UID. + // If no job order funcs, order job by CreationTimestamp first, then by Name. lv := l.(*api.JobInfo) rv := r.(*api.JobInfo) if lv.CreationTimestamp.Equal(&rv.CreationTimestamp) { - return lv.UID < rv.UID + // Use the Name of the Job instead of UID to get deterministic order by Job name + klog.V(3).Infof("Creation timestamps are the same for job %v and %v: %v . using name to order", lv.Name, rv.Name, lv.CreationTimestamp) + return lv.Name < rv.Name } + klog.V(3).Infof("Using creationTimestamp to order job priority %v: %v -- %v: %v ", lv.Name, lv.CreationTimestamp, rv.Name, rv.CreationTimestamp) return lv.CreationTimestamp.Before(&rv.CreationTimestamp) } diff --git a/pkg/scheduler/util/scheduler_helper.go b/pkg/scheduler/util/scheduler_helper.go index 64f259ddbb..8363155c22 100644 --- a/pkg/scheduler/util/scheduler_helper.go +++ b/pkg/scheduler/util/scheduler_helper.go @@ -136,6 +136,14 @@ func SortNodes(nodeScores map[float64][]*api.NodeInfo) []*api.NodeInfo { sort.Sort(sort.Reverse(sort.Float64Slice(keys))) for _, key := range keys { nodes := nodeScores[key] + // if the scores are the same, sort the nodes in predictable order using their names + // this is to avoid randomness in scheduling when scores are the same + if len(nodes) > 1 { + sort.Slice(nodes, func(i, j int) bool { + return nodes[i].Name < nodes[j].Name + }) + klog.V(3).Infof("nodes with same score %v found. ordered nodes by name: %v", key, nodes) + } nodesInorder = append(nodesInorder, nodes...) } return nodesInorder