Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/LifecycleManager.cs @ 5597

Last change on this file since 5597 was 5593, checked in by cneumuel, 14 years ago

#1233

  • changed the way lifecycle methods are called. The new service method TriggerLifecycle checks when the latest cleanup was made and performs one (if necessary). This can also be called by an external program (like a windows task)
  • robustified logging
File size: 2.4 KB
Line 
1using System;
2using System.Linq;
3using HeuristicLab.Services.Hive.Common;
4using HeuristicLab.Services.Hive.Common.DataTransfer;
5
6namespace HeuristicLab.Services.Hive {
7  /// <summary>
8  /// This class offers methods for cleaning up offline slaves and jobs
9  /// </summary>
10  public class LifecycleManager : ILifecycleManager {
11    private DataAccess.IHiveDao dao {
12      get { return ServiceLocator.Instance.HiveDao; }
13    }
14    private HeuristicLab.Services.Hive.DataAccess.TransactionManager trans {
15      get { return ServiceLocator.Instance.TransactionManager; }
16    }
17    private IAuthorizationManager auth {
18      get { return ServiceLocator.Instance.AuthorizationManager; }
19    }
20    private ILogger log {
21      get { return LogFactory.GetLogger(this.GetType().Namespace); }
22    }
23
24    public void Cleanup() {
25      log.Log("LifecycleManager.Cleanup()");
26      SetTimeoutSlavesOffline();
27      FinishParentJobs();
28    }
29
30    /// <summary>
31    /// Searches for slaves which are timed out, puts them and their jobs offline
32    /// </summary>
33    private void SetTimeoutSlavesOffline() {
34      var slaves = dao.GetSlaves(x => x.SlaveState != SlaveState.Offline);
35      foreach (Slave slave in slaves) {
36        if (!slave.LastHeartbeat.HasValue || (DateTime.Now - slave.LastHeartbeat.Value).TotalSeconds > ApplicationConstants.HeartbeatTimeout) {
37          slave.SlaveState = SlaveState.Offline;
38          SetJobsWaiting(slave.Id);
39          dao.UpdateSlave(slave);
40        }
41      }
42    }
43
44    /// <summary>
45    /// Looks for parent jobs which have FinishWhenChildJobsFinished and set their state to finished
46    /// </summary>
47    private void FinishParentJobs() {
48      var parentJobsToFinish = dao.GetParentJobs(dao.GetResources(x => true).Select(x => x.Id), 0, true);
49      foreach (var job in parentJobsToFinish) {
50        job.SetState(JobState.Finished);
51        dao.UpdateJob(job);
52      }
53    }
54
55    private void SetJobsWaiting(Guid slaveId) {
56      var jobs = dao.GetJobs(x => x.State == JobState.Calculating).Where(x => x.StateLog.Last().SlaveId == slaveId);
57      foreach (var j in jobs) {
58        j.StateLog.Add(new StateLog() {
59          State = JobState.Waiting,
60          JobId = j.Id,
61          DateTime = DateTime.Now,
62          Exception = "Slave timed out"
63        });
64        dao.UpdateJob(j);
65      }
66    }
67
68  }
69}
Note: See TracBrowser for help on using the repository browser.