Changeset 8707 for branches/HiveTaskScheduler/HeuristicLab.Services.Hive/3.3/Scheduler/RoundRobinTaskScheduler.cs
- Timestamp:
- 09/28/12 10:49:02 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HiveTaskScheduler/HeuristicLab.Services.Hive/3.3/Scheduler/RoundRobinTaskScheduler.cs
r8687 r8707 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 23 24 using System.Linq; … … 31 32 32 33 public IEnumerable<Task> Schedule(IEnumerable<Task> tasks, int count = 1) { 33 var userPriorities = dao.GetUserPriorities(x => true).ToArray(); 34 if (!tasks.Any()) return Enumerable.Empty<Task>(); 35 36 var userPriorities = dao.GetUserPriorities(x => true).OrderBy(x => x.DateEnqueued).ToArray(); 34 37 35 38 var jobs = new List<Job>(); 36 39 foreach (var userPriority in userPriorities) { 37 40 var closureUserPriority = userPriority; 38 jobs.AddRange(dao.GetJobs(x => x.OwnerUserId == closureUserPriority. UserId));41 jobs.AddRange(dao.GetJobs(x => x.OwnerUserId == closureUserPriority.Id)); 39 42 } 40 43 … … 43 46 job => job.Id, 44 47 (task, job) => new { Task = task, Job = job }) 45 .ToDictionary(k => k, v => false); 48 .OrderByDescending(x => x.Task.Priority) 49 .ToList(); 46 50 47 51 var scheduledTasks = new List<Task>(); 48 52 int priorityIndex = 0; 53 49 54 if (count == 0 || count > taskJobRelations.Count) count = taskJobRelations.Count; 55 50 56 for (int i = 0; i < count; i++) { 51 var defaultEntry = taskJobRelations.First( x => !x.Value); // search first task which is not included yet52 var priorityEntries = taskJobRelations.Where(x => !x.Value && x.Key.Job.OwnerUserId == userPriorities[priorityIndex].UserId).ToArray(); // search for tasks with desired user priority53 while (!priorityEntries.Any() && priorityIndex < priorityEntries.Length)54 priorityEntries = taskJobRelations.Where(x => !x.Value && x.Key.Job.OwnerUserId == userPriorities[++priorityIndex].UserId).ToArray();57 var defaultEntry = taskJobRelations.First(); // search first task which is not included yet 58 var priorityEntries = taskJobRelations.Where(x => x.Job.OwnerUserId == userPriorities[priorityIndex].Id).ToArray(); // search for tasks with desired user priority 59 while (!priorityEntries.Any() && ++priorityIndex < userPriorities.Length) 60 priorityEntries = taskJobRelations.Where(x => x.Job.OwnerUserId == userPriorities[priorityIndex].Id).ToArray(); 55 61 if (priorityEntries.Any()) { // tasks with desired user priority found 56 var priorityEntry = priorityEntries.OrderByDescending(x => x. Key.Task.Priority).ThenBy(x => x.Key.Task.DateCreated).First();57 if (defaultEntry. Key.Task.Priority <= priorityEntry.Key.Task.Priority) {58 taskJobRelations [priorityEntry.Key] = true;59 scheduledTasks.Add(priorityEntry. Key.Task);62 var priorityEntry = priorityEntries.OrderByDescending(x => x.Task.Priority).ThenBy(x => x.Job.DateCreated).First(); 63 if (defaultEntry.Task.Priority <= priorityEntry.Task.Priority) { 64 taskJobRelations.Remove(priorityEntry); 65 scheduledTasks.Add(priorityEntry.Task); 60 66 priorityIndex++; 61 } else { // there are other tasks with higher priorit y62 taskJobRelations [defaultEntry.Key] = true;63 scheduledTasks.Add(defaultEntry. Key.Task);67 } else { // there are other tasks with higher priorities 68 taskJobRelations.Remove(defaultEntry); 69 scheduledTasks.Add(defaultEntry.Task); 64 70 } 65 71 } else { 66 taskJobRelations [defaultEntry.Key] = true;67 scheduledTasks.Add(defaultEntry. Key.Task);72 taskJobRelations.Remove(defaultEntry); 73 scheduledTasks.Add(defaultEntry.Task); 68 74 } 69 75 } 70 76 71 // dequeue and enqueue priorities [0, priorityIndex), i.e. {4,3,6,2,5,1} and priorityIndex = 3 -> {2,5,1,4,3,6} 72 // i don't know how to solve this yet ... (race conditions, locking?) 77 // requeue user priorities 78 if (priorityIndex < userPriorities.Length) 79 for (int i = 0; i < priorityIndex; i++) { 80 userPriorities[i].DateEnqueued = DateTime.Now; 81 dao.EnqueueUserPriority(userPriorities[i]); 82 } 73 83 74 84 return scheduledTasks;
Note: See TracChangeset
for help on using the changeset viewer.