- Timestamp:
- 08/13/15 15:22:51 (9 years ago)
- Location:
- branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveJanitor.cs
r12789 r12858 55 55 56 56 public void RunCleanup() { 57 var pm = PersistenceManager; 57 58 while (!stop) { 58 59 try { 59 60 LogFactory.GetLogger(typeof(HiveJanitor).Namespace).Log("HiveJanitor: starting cleanup."); 60 61 bool cleanup = false; 61 using (var pm = PersistenceManager) { 62 63 64 65 66 67 68 69 70 71 72 } 62 63 var lifecycleDao = pm.LifecycleDao; 64 pm.UseTransaction(() => { 65 var lifecycle = lifecycleDao.GetLastLifecycle(); 66 if (lifecycle == null 67 || DateTime.Now - lifecycle.LastCleanup > HeuristicLab.Services.Hive.Properties.Settings.Default.CleanupInterval) { 68 lifecycleDao.UpdateLifecycle(); 69 cleanup = true; 70 } 71 pm.SubmitChanges(); 72 }, true); 73 73 74 if (cleanup) { 74 75 EventManager.Cleanup(); -
branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs
r12691 r12858 52 52 public void AuthorizeForTask(Guid taskId, DT.Permission requiredPermission) { 53 53 if (ServiceLocator.Instance.RoleVerifier.IsInRole(HiveRoles.Slave)) return; // slave-users can access all tasks 54 using (var pm = PersistenceManager) { 55 var taskDao = pm.TaskDao; 56 pm.UseTransaction(() => { 57 var task = taskDao.GetById(taskId); 58 if (task == null) throw new SecurityException(NOT_AUTHORIZED); 59 AuthorizeJob(pm, task.JobId, requiredPermission); 60 }); 61 } 54 var pm = PersistenceManager; 55 var taskDao = pm.TaskDao; 56 pm.UseTransaction(() => { 57 var task = taskDao.GetById(taskId); 58 if (task == null) throw new SecurityException(NOT_AUTHORIZED); 59 AuthorizeJob(pm, task.JobId, requiredPermission); 60 }); 62 61 } 63 62 64 63 public void AuthorizeForJob(Guid jobId, DT.Permission requiredPermission) { 65 using (var pm = PersistenceManager) { 66 pm.UseTransaction(() => { 67 AuthorizeJob(pm, jobId, requiredPermission); 68 }); 69 } 64 var pm = PersistenceManager; 65 pm.UseTransaction(() => { 66 AuthorizeJob(pm, jobId, requiredPermission); 67 }); 70 68 } 71 69 72 70 public void AuthorizeForResourceAdministration(Guid resourceId) { 73 using (var pm = PersistenceManager) { 74 var resourceDao = pm.ResourceDao; 75 pm.UseTransaction(() => { 76 var resource = resourceDao.GetById(resourceId); 77 if (resource == null) throw new SecurityException(NOT_AUTHORIZED); 78 if (resource.OwnerUserId != UserManager.CurrentUserId 79 && !RoleVerifier.IsInRole(HiveRoles.Administrator)) { 80 throw new SecurityException(NOT_AUTHORIZED); 81 } 82 }); 83 } 71 var pm = PersistenceManager; 72 var resourceDao = pm.ResourceDao; 73 pm.UseTransaction(() => { 74 var resource = resourceDao.GetById(resourceId); 75 if (resource == null) throw new SecurityException(NOT_AUTHORIZED); 76 if (resource.OwnerUserId != UserManager.CurrentUserId 77 && !RoleVerifier.IsInRole(HiveRoles.Administrator)) { 78 throw new SecurityException(NOT_AUTHORIZED); 79 } 80 }); 84 81 } 85 82 -
branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/NewEventManager.cs
r12853 r12858 31 31 get { return ServiceLocator.Instance.PersistenceManager; } 32 32 } 33 private IAuthorizationManager AuthorizationManager {34 get { return ServiceLocator.Instance.AuthorizationManager; }35 }36 private ILogger Log {37 get { return LogFactory.GetLogger(this.GetType().Namespace); }38 }39 33 40 34 public void Cleanup() { 41 using (var pm = PersistenceManager) {42 43 44 45 46 47 48 35 var pm = PersistenceManager; 36 // same transactions as the old EventManager 37 pm.UseTransaction(() => { 38 SetTimeoutSlavesOffline(pm); 39 SetTimeoutTasksWaiting(pm); 40 DeleteObsoleteSlaves(pm); 41 pm.SubmitChanges(); 42 }); 49 43 50 pm.UseTransaction(() => { 51 FinishParentTasks(pm); 52 pm.SubmitChanges(); 53 }); 54 } 44 pm.UseTransaction(() => { 45 FinishParentTasks(pm); 46 pm.SubmitChanges(); 47 }); 55 48 } 56 49 -
branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/NewHeartbeatManager.cs
r12773 r12858 47 47 public List<MessageContainer> ProcessHeartbeat(Heartbeat heartbeat) { 48 48 List<MessageContainer> actions = new List<MessageContainer>(); 49 using (var pm = PersistenceManager) { 50 var slaveDao = pm.SlaveDao; 51 var taskDao = pm.TaskDao; 52 var slave = pm.UseTransaction(() => slaveDao.GetById(heartbeat.SlaveId)); 53 if (slave == null) { 54 actions.Add(new MessageContainer(MessageContainer.MessageType.SayHello)); 55 } else { 56 if (heartbeat.HbInterval != slave.HbInterval) { 57 actions.Add(new MessageContainer(MessageContainer.MessageType.NewHBInterval)); 58 } 59 if (slaveDao.SlaveHasToShutdownComputer(slave.ResourceId)) { 60 actions.Add(new MessageContainer(MessageContainer.MessageType.ShutdownComputer)); 61 } 62 // update slave data 63 slave.FreeCores = heartbeat.FreeCores; 64 slave.FreeMemory = heartbeat.FreeMemory; 65 slave.CpuUtilization = heartbeat.CpuUtilization; 66 slave.SlaveState = (heartbeat.JobProgress != null && heartbeat.JobProgress.Count > 0) 67 ? DA.SlaveState.Calculating 68 : DA.SlaveState.Idle; 69 slave.LastHeartbeat = DateTime.Now; 70 pm.UseTransaction(() => { 71 slave.IsAllowedToCalculate = slaveDao.SlaveIsAllowedToCalculate(slave.ResourceId); 72 pm.SubmitChanges(); 73 }); 74 75 // update task data 76 actions.AddRange(UpdateTasks(pm, heartbeat, slave.IsAllowedToCalculate)); 77 78 // assign new task 79 if (heartbeat.AssignJob && slave.IsAllowedToCalculate && heartbeat.FreeCores > 0) { 80 bool mutexAquired = false; 81 var mutex = new Mutex(false, MutexName); 82 try { 83 mutexAquired = mutex.WaitOne(Properties.Settings.Default.SchedulingPatience); 84 if (mutexAquired) { 85 var waitingTasks = pm.UseTransaction(() => taskDao.GetWaitingTasks(slave) 86 .Select(x => new TaskInfoForScheduler { 87 TaskId = x.TaskId, 88 JobId = x.JobId, 89 Priority = x.Priority 90 }) 91 .ToList() 92 ); 93 var availableTasks = TaskScheduler.Schedule(waitingTasks); 94 if (availableTasks.Any()) { 95 var task = availableTasks.First(); 96 AssignTask(pm, slave, task.TaskId); 97 actions.Add(new MessageContainer(MessageContainer.MessageType.CalculateTask, task.TaskId)); 98 } 99 } else { 100 LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling could not be aquired."); 49 var pm = PersistenceManager; 50 var slaveDao = pm.SlaveDao; 51 var taskDao = pm.TaskDao; 52 var slave = pm.UseTransaction(() => slaveDao.GetById(heartbeat.SlaveId)); 53 if (slave == null) { 54 actions.Add(new MessageContainer(MessageContainer.MessageType.SayHello)); 55 } else { 56 if (heartbeat.HbInterval != slave.HbInterval) { 57 actions.Add(new MessageContainer(MessageContainer.MessageType.NewHBInterval)); 58 } 59 if (slaveDao.SlaveHasToShutdownComputer(slave.ResourceId)) { 60 actions.Add(new MessageContainer(MessageContainer.MessageType.ShutdownComputer)); 61 } 62 // update slave data 63 slave.FreeCores = heartbeat.FreeCores; 64 slave.FreeMemory = heartbeat.FreeMemory; 65 slave.CpuUtilization = heartbeat.CpuUtilization; 66 slave.SlaveState = (heartbeat.JobProgress != null && heartbeat.JobProgress.Count > 0) 67 ? DA.SlaveState.Calculating 68 : DA.SlaveState.Idle; 69 slave.LastHeartbeat = DateTime.Now; 70 pm.UseTransaction(() => { 71 slave.IsAllowedToCalculate = slaveDao.SlaveIsAllowedToCalculate(slave.ResourceId); 72 pm.SubmitChanges(); 73 }); 74 75 // update task data 76 actions.AddRange(UpdateTasks(pm, heartbeat, slave.IsAllowedToCalculate)); 77 78 // assign new task 79 if (heartbeat.AssignJob && slave.IsAllowedToCalculate && heartbeat.FreeCores > 0) { 80 bool mutexAquired = false; 81 var mutex = new Mutex(false, MutexName); 82 try { 83 mutexAquired = mutex.WaitOne(Properties.Settings.Default.SchedulingPatience); 84 if (mutexAquired) { 85 var waitingTasks = pm.UseTransaction(() => taskDao.GetWaitingTasks(slave) 86 .Select(x => new TaskInfoForScheduler { 87 TaskId = x.TaskId, 88 JobId = x.JobId, 89 Priority = x.Priority 90 }) 91 .ToList() 92 ); 93 var availableTasks = TaskScheduler.Schedule(waitingTasks).ToArray(); 94 if (availableTasks.Any()) { 95 var task = availableTasks.First(); 96 AssignTask(pm, slave, task.TaskId); 97 actions.Add(new MessageContainer(MessageContainer.MessageType.CalculateTask, task.TaskId)); 101 98 } 99 } else { 100 LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling could not be aquired."); 102 101 } 103 catch (AbandonedMutexException) {104 LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling has been abandoned.");105 }106 catch (Exception ex) {107 LogFactory.GetLogger(this.GetType().Namespace).Log(string.Format("HeartbeatManager threw an exception in ProcessHeartbeat: {0}", ex));108 }109 finally {110 if (mutexAquired) mutex.ReleaseMutex();111 }102 } 103 catch (AbandonedMutexException) { 104 LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling has been abandoned."); 105 } 106 catch (Exception ex) { 107 LogFactory.GetLogger(this.GetType().Namespace).Log(string.Format("HeartbeatManager threw an exception in ProcessHeartbeat: {0}", ex)); 108 } 109 finally { 110 if (mutexAquired) mutex.ReleaseMutex(); 112 111 } 113 112 } -
branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Scheduler/NewRoundRobinTaskScheduler.cs
r12691 r12858 35 35 if (!tasks.Any()) return Enumerable.Empty<TaskInfoForScheduler>(); 36 36 37 using (var pm = PersistenceManager) {38 39 37 var pm = PersistenceManager; 38 var userPriorityDao = pm.UserPriorityDao; 39 var jobDao = pm.JobDao; 40 40 41 42 43 44 41 var userPriorities = pm.UseTransaction(() => userPriorityDao.GetAll() 42 .OrderBy(x => x.DateEnqueued) 43 .ToArray() 44 ); 45 45 46 47 48 49 50 51 52 53 54 55 56 46 var userIds = userPriorities.Select(x => x.UserId).ToList(); 47 var jobs = pm.UseTransaction(() => { 48 return jobDao.GetAll() 49 .Where(x => userIds.Contains(x.OwnerUserId)) 50 .Select(x => new { 51 Id = x.JobId, 52 DateCreated = x.DateCreated, 53 OwnerUserId = x.OwnerUserId 54 }) 55 .ToList(); 56 }); 57 57 58 59 60 61 62 63 58 var taskJobRelations = tasks.Join(jobs, 59 task => task.JobId, 60 job => job.Id, 61 (task, job) => new { Task = task, JobInfo = job }) 62 .OrderByDescending(x => x.Task.Priority) 63 .ToList(); 64 64 65 66 65 var scheduledTasks = new List<TaskInfoForScheduler>(); 66 int priorityIndex = 0; 67 67 68 68 if (count == 0 || count > taskJobRelations.Count) count = taskJobRelations.Count; 69 69 70 for (int i = 0; i < count; i++) { 71 var defaultEntry = taskJobRelations.First(); // search first task which is not included yet 72 var priorityEntries = taskJobRelations.Where(x => x.JobInfo.OwnerUserId == userPriorities[priorityIndex].UserId).ToArray(); // search for tasks with desired user priority 73 while (!priorityEntries.Any() && priorityIndex < userPriorities.Length - 1) { 70 for (int i = 0; i < count; i++) { 71 var defaultEntry = taskJobRelations.First(); // search first task which is not included yet 72 var priorityEntries = taskJobRelations.Where(x => x.JobInfo.OwnerUserId == userPriorities[priorityIndex].UserId).ToArray(); // search for tasks with desired user priority 73 while (!priorityEntries.Any() && priorityIndex < userPriorities.Length - 1) { 74 priorityIndex++; 75 priorityEntries = taskJobRelations.Where(x => x.JobInfo.OwnerUserId == userPriorities[priorityIndex].UserId).ToArray(); 76 } 77 if (priorityEntries.Any()) { // tasks with desired user priority found 78 var priorityEntry = priorityEntries.OrderByDescending(x => x.Task.Priority).ThenBy(x => x.JobInfo.DateCreated).First(); 79 if (defaultEntry.Task.Priority <= priorityEntry.Task.Priority) { 80 taskJobRelations.Remove(priorityEntry); 81 scheduledTasks.Add(priorityEntry.Task); 82 UpdateUserPriority(pm, userPriorities[priorityIndex]); 74 83 priorityIndex++; 75 priorityEntries = taskJobRelations.Where(x => x.JobInfo.OwnerUserId == userPriorities[priorityIndex].UserId).ToArray(); 76 } 77 if (priorityEntries.Any()) { // tasks with desired user priority found 78 var priorityEntry = priorityEntries.OrderByDescending(x => x.Task.Priority).ThenBy(x => x.JobInfo.DateCreated).First(); 79 if (defaultEntry.Task.Priority <= priorityEntry.Task.Priority) { 80 taskJobRelations.Remove(priorityEntry); 81 scheduledTasks.Add(priorityEntry.Task); 82 UpdateUserPriority(pm, userPriorities[priorityIndex]); 83 priorityIndex++; 84 } else { // there are other tasks with higher priorities 85 taskJobRelations.Remove(defaultEntry); 86 scheduledTasks.Add(defaultEntry.Task); 87 } 88 } else { 84 } else { // there are other tasks with higher priorities 89 85 taskJobRelations.Remove(defaultEntry); 90 86 scheduledTasks.Add(defaultEntry.Task); 91 87 } 92 if (priorityIndex >= (userPriorities.Length - 1)) priorityIndex = 0; 88 } else { 89 taskJobRelations.Remove(defaultEntry); 90 scheduledTasks.Add(defaultEntry.Task); 93 91 } 94 return scheduledTasks;92 if (priorityIndex >= (userPriorities.Length - 1)) priorityIndex = 0; 95 93 } 94 return scheduledTasks; 95 96 96 } 97 97
Note: See TracChangeset
for help on using the changeset viewer.