Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/28/12 10:49:02 (12 years ago)
Author:
jkarder
Message:

#1712: added user queue used to schedule tasks

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HiveTaskScheduler/HeuristicLab.Services.Hive/3.3/Scheduler/RoundRobinTaskScheduler.cs

    r8687 r8707  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
    2324using System.Linq;
     
    3132
    3233    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();
    3437
    3538      var jobs = new List<Job>();
    3639      foreach (var userPriority in userPriorities) {
    3740        var closureUserPriority = userPriority;
    38         jobs.AddRange(dao.GetJobs(x => x.OwnerUserId == closureUserPriority.UserId));
     41        jobs.AddRange(dao.GetJobs(x => x.OwnerUserId == closureUserPriority.Id));
    3942      }
    4043
     
    4346        job => job.Id,
    4447        (task, job) => new { Task = task, Job = job })
    45         .ToDictionary(k => k, v => false);
     48        .OrderByDescending(x => x.Task.Priority)
     49        .ToList();
    4650
    4751      var scheduledTasks = new List<Task>();
    4852      int priorityIndex = 0;
     53
    4954      if (count == 0 || count > taskJobRelations.Count) count = taskJobRelations.Count;
     55
    5056      for (int i = 0; i < count; i++) {
    51         var defaultEntry = taskJobRelations.First(x => !x.Value); // search first task which is not included yet
    52         var priorityEntries = taskJobRelations.Where(x => !x.Value && x.Key.Job.OwnerUserId == userPriorities[priorityIndex].UserId).ToArray(); // search for tasks with desired user priority
    53         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();
    5561        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);
    6066            priorityIndex++;
    61           } else { // there are other tasks with higher priority
    62             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);
    6470          }
    6571        } else {
    66           taskJobRelations[defaultEntry.Key] = true;
    67           scheduledTasks.Add(defaultEntry.Key.Task);
     72          taskJobRelations.Remove(defaultEntry);
     73          scheduledTasks.Add(defaultEntry.Task);
    6874        }
    6975      }
    7076
    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        }
    7383
    7484      return scheduledTasks;
Note: See TracChangeset for help on using the changeset viewer.