11package schedules
22
33import (
4+ "slices"
45 "sort"
56 "strconv"
67 "time"
@@ -23,13 +24,13 @@ type SchedulerAlgorithm interface {
2324
2425type SchedulerAlgorithmManager struct {
2526 filteredSchedulerAlgorithms map [string ]SchedulerAlgorithm
26- schuduledSchedulerAlgorithms map [string ]SchedulerAlgorithm
27+ scheduledSchedulerAlgorithms map [string ]SchedulerAlgorithm
2728 dispatchPaused bool
2829}
2930
3031func (am * SchedulerAlgorithmManager ) Init () {
3132 am .filteredSchedulerAlgorithms = make (map [string ]SchedulerAlgorithm )
32- am .schuduledSchedulerAlgorithms = make (map [string ]SchedulerAlgorithm )
33+ am .scheduledSchedulerAlgorithms = make (map [string ]SchedulerAlgorithm )
3334 am .dispatchPaused = false
3435 // Register filter and schedule algorithms
3536 am .RegisterFilterAlgorithm (& DependsSchedulerAlgorithm {})
@@ -38,33 +39,33 @@ func (am *SchedulerAlgorithmManager) Init() {
3839 am .RegisterSchedulerAlgorithm (& PriorityElderSchedulerAlgorithm {})
3940}
4041
41- func (am * SchedulerAlgorithmManager ) RegisterSchedulerAlgorithm (SchedulerAlgorithm SchedulerAlgorithm ) {
42- if SchedulerAlgorithm == nil {
42+ func (am * SchedulerAlgorithmManager ) RegisterSchedulerAlgorithm (schedulerAlgorithm SchedulerAlgorithm ) {
43+ if schedulerAlgorithm == nil {
4344 return
4445 }
45- name := SchedulerAlgorithm .Name ()
46- if _ , exists := am .schuduledSchedulerAlgorithms [name ]; exists {
46+ name := schedulerAlgorithm .Name ()
47+ if _ , exists := am .scheduledSchedulerAlgorithms [name ]; exists {
4748 return // SchedulerAlgorithm already registered
4849 }
4950
5051 // only support one scheduling algorithm for now
51- if len (am .schuduledSchedulerAlgorithms ) > 0 {
52+ if len (am .scheduledSchedulerAlgorithms ) > 0 {
5253 return // Only one scheduling algorithm can be registered
5354 }
54- SchedulerAlgorithm .Init ()
55- am .schuduledSchedulerAlgorithms [name ] = SchedulerAlgorithm
55+ schedulerAlgorithm .Init ()
56+ am .scheduledSchedulerAlgorithms [name ] = schedulerAlgorithm
5657}
5758
58- func (am * SchedulerAlgorithmManager ) RegisterFilterAlgorithm (FilterAlgorithm SchedulerAlgorithm ) {
59- if FilterAlgorithm == nil {
59+ func (am * SchedulerAlgorithmManager ) RegisterFilterAlgorithm (filterAlgorithm SchedulerAlgorithm ) {
60+ if filterAlgorithm == nil {
6061 return
6162 }
62- name := FilterAlgorithm .Name ()
63+ name := filterAlgorithm .Name ()
6364 if _ , exists := am .filteredSchedulerAlgorithms [name ]; exists {
6465 return // SchedulerAlgorithm already registered
6566 }
66- FilterAlgorithm .Init ()
67- am .filteredSchedulerAlgorithms [name ] = FilterAlgorithm
67+ filterAlgorithm .Init ()
68+ am .filteredSchedulerAlgorithms [name ] = filterAlgorithm
6869}
6970
7071func (am * SchedulerAlgorithmManager ) IsDispatchPaused () bool {
@@ -98,7 +99,7 @@ func (am *SchedulerAlgorithmManager) ScheduleNextTasks(allTasks []*structure.Tas
9899
99100 // only support one scheduling algorithm for now
100101 // get first algorithm
101- for _ , algorithm := range am .schuduledSchedulerAlgorithms {
102+ for _ , algorithm := range am .scheduledSchedulerAlgorithms {
102103 tasks , err := algorithm .ScheduleNextTasks (filteredTasks , taskToWorkerGroupMap , idleWorkerGroups , concurrentWorkerGroups , softSchedule )
103104 if err != nil {
104105 return nil , err
@@ -268,7 +269,12 @@ func (p *PriorityElderSchedulerAlgorithm) CalculateTaskEmergency(task *structure
268269 priorityCost := priorityParam * int64 (task .Priority )
269270 // step 3: resource cost
270271 graph := structure .GraphManager .GetGraphByName (task .SpaceName , task .GraphName )
271- resourceCost := resourceParam / max (1 , graph .VertexCount + graph .EdgeCount ) // Avoid division by zero, ensure at least 1
272+ resourceCost := int64 (0 )
273+ if graph == nil {
274+ resourceCost = resourceParam // if graph not found, use max resource cost
275+ } else {
276+ resourceCost = resourceParam / max (1 , graph .VertexCount + graph .EdgeCount ) // Avoid division by zero, ensure at least 1
277+ }
272278 // step 4: some random value
273279 randomValue := int64 (randomValueParam ) // Placeholder for any random value logic
274280 if printValue {
@@ -282,13 +288,19 @@ func (p *PriorityElderSchedulerAlgorithm) ScheduleNextTasks(allTasks []*structur
282288 return nil , nil // No tasks to schedule
283289 }
284290
291+ // calculate emergency value for each task
292+ taskEmergencies := make (map [int32 ]int64 )
293+ for _ , task := range allTasks {
294+ taskEmergencies [task .ID ] = p .CalculateTaskEmergency (task , taskToWorkerGroupMap , false )
295+ }
296+
285297 // Sort tasks by priority (higher priority first)
286298 sort .Slice (allTasks , func (i , j int ) bool {
287- return p . CalculateTaskEmergency ( allTasks [i ], taskToWorkerGroupMap , false ) > p . CalculateTaskEmergency ( allTasks [j ], taskToWorkerGroupMap , false )
299+ return taskEmergencies [ allTasks [i ]. ID ] > taskEmergencies [ allTasks [j ]. ID ]
288300 })
289301
290302 for _ , task := range allTasks {
291- logrus .Debugf ("Task %d: Emergency Value: %d" , task .ID , p . CalculateTaskEmergency ( task , taskToWorkerGroupMap , true ) )
303+ logrus .Debugf ("Task %d: Emergency Value: %d" , task .ID , taskEmergencies [ task . ID ] )
292304 }
293305
294306 for _ , task := range allTasks {
@@ -427,19 +439,17 @@ func (d *DependsSchedulerAlgorithm) ScheduleNextTasks(allTasks []*structure.Task
427439 // Check if all dependencies are satisfied
428440 allDepsSatisfied := true
429441 for _ , dep := range depends {
430- if depTask , exists := allTaskIDs [dep ]; ! exists || depTask .State != structure .TaskStateWaiting {
442+ if depTask , exists := allTaskIDs [dep ]; exists && depTask .State != structure .TaskStateComplete {
431443 allDepsSatisfied = false
432444 break
433445 }
434446 }
435447 if allDepsSatisfied {
436448 if group , exists := taskToWorkerGroupMap [task .ID ]; exists && group != "" {
437449 // only support idle worker groups for now
438- for _ , idleGroup := range idleWorkerGroups {
439- if group == idleGroup {
440- logrus .Debugf ("Task %d is assigned to worker group %s" , task .ID , group )
441- return []* structure.TaskInfo {task }, nil // Return the first task that can be scheduled
442- }
450+ if slices .Contains (idleWorkerGroups , group ) {
451+ logrus .Debugf ("Task %d is assigned to worker group %s" , task .ID , group )
452+ return []* structure.TaskInfo {task }, nil // Return the first task that can be scheduled
443453 }
444454 }
445455 }
0 commit comments