Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/21/11 17:35:42 (13 years ago)
Author:
cneumuel
Message:

#1233

  • fixed handling of StateLog in DataLayer
  • extended unit tests
  • changed style of service calls to OKB-like style (using delegates)
  • added possibility that parent jobs can be finished immediately when child jobs are finished
Location:
branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HiveService.cs

    r5511 r5526  
    3131
    3232    #region Job Methods
    33     //[PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
    34     //[PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     33    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     34    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    3535    public Guid AddJob(Job job, JobData jobData, IEnumerable<Guid> resourceIds) {
    3636      using (trans.OpenTransaction()) {
     
    5151    }
    5252
     53    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     54    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    5355    public Guid AddChildJob(Guid parentJobId, Job job, JobData jobData) {
    5456      using (trans.OpenTransaction()) {
     
    5860    }
    5961
     62    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     63    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     64    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    6065    public Job GetJob(Guid jobId) {
    6166      return dao.GetJob(jobId);
    6267    }
    6368
     69    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     70    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    6471    public IEnumerable<Job> GetJobs() {
    6572      return dao.GetJobs(x => true);
    6673    }
    6774
     75    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     76    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    6877    public IEnumerable<LightweightJob> GetLightweightJobs(IEnumerable<Guid> jobIds) {
    6978      return dao.GetJobs(x => jobIds.Contains(x.JobId)).Select(x => new LightweightJob(x)).ToArray();
    7079    }
    7180
     81    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     82    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    7283    public IEnumerable<LightweightJob> GetLightweightChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
    7384      return GetChildJobs(parentJobId, recursive, includeParent).Select(x => new LightweightJob(x)).ToArray();
    7485    }
    7586
     87    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     88    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     89    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    7690    public JobData GetJobData(Guid jobId) {
    7791      return dao.GetJobData(jobId);
    7892    }
    7993
     94    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     95    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     96    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    8097    public void UpdateJob(Job job) {
    8198      using (trans.OpenTransaction()) {
     
    84101    }
    85102
     103    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     104    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     105    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    86106    public void UpdateJobData(Job job, JobData jobData) {
    87107      using (trans.OpenTransaction()) {
     
    92112    }
    93113
     114    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     115    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     116    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    94117    public void DeleteJob(Guid jobId) {
    95118      using (trans.OpenTransaction()) {
     
    98121    }
    99122
     123    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     124    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     125    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    100126    public void DeleteChildJobs(Guid parentJobId) {
    101127      using (trans.OpenTransaction()) {
     
    111137
    112138    #region Job Control Methods
     139    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     140    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     141    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    113142    public void StopJob(Guid jobId) {
    114143      using (trans.OpenTransaction()) {
     
    116145      }
    117146    }
     147
     148    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     149    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     150    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    118151    public void PauseJob(Guid jobId) {
    119152      using (trans.OpenTransaction()) {
     
    124157
    125158    #region HiveExperiment Methods
    126 
     159    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     160    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    127161    public HiveExperiment GetHiveExperiment(Guid id) {
    128162      return dao.GetHiveExperiments(x =>
     
    132166    }
    133167
     168    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     169    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    134170    public IEnumerable<HiveExperiment> GetHiveExperiments() {
    135171      return dao.GetHiveExperiments(x => x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0);
    136172    }
    137173
     174    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     175    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    138176    public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
    139177      using (trans.OpenTransaction()) {
     
    144182    }
    145183
     184    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     185    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    146186    public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
    147187      using (trans.OpenTransaction()) {
     
    150190    }
    151191
     192    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     193    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    152194    public void DeleteHiveExperiment(Guid hiveExperimentId) {
    153195      using (trans.OpenTransaction()) {
     
    159201
    160202    #region Login Methods
     203    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    161204    public void Hello(Slave slaveInfo) {
    162205      using (trans.OpenTransaction()) {
     
    171214    }
    172215
     216    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    173217    public void GoodBye(Guid slaveId) {
    174218      using (trans.OpenTransaction()) {
     
    183227
    184228    #region Heartbeat Methods
     229    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    185230    public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
    186231      using (trans.OpenTransaction()) {
     
    191236
    192237    #region Plugin Methods
     238    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     239    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    193240    public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
    194241      using (trans.OpenTransaction()) {
     
    203250      }
    204251    }
     252
     253    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     254    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     255    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    205256    public IEnumerable<Plugin> GetPlugins() {
    206257      return dao.GetPlugins(x => true);
    207258    }
    208259
     260    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     261    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
     262    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
    209263    public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
    210264      List<PluginData> pluginDatas = new List<PluginData>();
     
    226280
    227281    #region Slave Methods
     282    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     283    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    228284    public Guid AddSlave(Slave slave) {
    229285      using (trans.OpenTransaction()) {
     
    232288    }
    233289
     290    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     291    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    234292    public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
    235293      using (trans.OpenTransaction()) {
     
    238296    }
    239297
     298    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     299    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    240300    public Slave GetSlave(Guid slaveId) {
    241301      return dao.GetSlave(slaveId);
     
    246306    }
    247307
     308    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     309    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    248310    public IEnumerable<Slave> GetSlaves() {
    249311      return dao.GetSlaves(x => true);
    250312    }
    251313
     314    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     315    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    252316    public IEnumerable<SlaveGroup> GetSlaveGroups() {
    253317      return dao.GetSlaveGroups(x => true);
    254318    }
    255319
     320    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     321    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    256322    public void UpdateSlave(Slave slave) {
    257323      using (trans.OpenTransaction()) {
     
    260326    }
    261327
     328    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     329    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    262330    public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
    263331      using (trans.OpenTransaction()) {
     
    266334    }
    267335
     336    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     337    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    268338    public void DeleteSlave(Guid slaveId) {
    269339      using (trans.OpenTransaction()) {
     
    272342    }
    273343
     344    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     345    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    274346    public void DeleteSlaveGroup(Guid slaveGroupId) {
    275347      using (trans.OpenTransaction()) {
     
    278350    }
    279351
     352    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     353    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    280354    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
    281355      using (trans.OpenTransaction()) {
     
    286360    }
    287361
     362    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     363    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    288364    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
    289365      using (trans.OpenTransaction()) {
     
    294370    }
    295371
     372    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     373    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
    296374    public Guid GetResourceId(string resourceName) {
    297375      using (trans.OpenTransaction()) {
     
    325403
    326404    #endregion
    327 
    328 
    329405  }
    330406}
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/LifecycleManager.cs

    r5511 r5526  
    3636    public void Start() {
    3737      if (ExecutionState == Core.ExecutionState.Stopped) {
     38        // kick off the event immediately
     39        timer_Tick(this, EventArgs.Empty);
     40
     41        // start the timer
    3842        this.timer.Interval = (int)new TimeSpan(0, 0, 30).TotalMilliseconds;
    3943        this.timer.Start();
     
    5458      lock (locker) {
    5559        using (trans.OpenTransaction()) {
    56           var slaves = dao.GetSlaves(x => x.SlaveState != SlaveState.Offline);
    57           foreach (Slave slave in slaves) {
    58             if (!slave.LastHeartbeat.HasValue || (DateTime.Now - slave.LastHeartbeat.Value).TotalSeconds > ApplicationConstants.HeartbeatTimeout) {
    59               slave.SlaveState = SlaveState.Offline;
    60               AbortJobs(slave.Id);
    61               dao.UpdateSlave(slave);
    62             }
    63           }
     60          SetTimeoutSlavesOffline();
     61          FinishParentJobs();
    6462        }
    6563      }
    6664    }
    6765
    68     private void AbortJobs(Guid slaveId) {
    69       var jobs = dao.GetJobs(x => x.StateLogs.Last().SlaveId == slaveId);
     66    /// <summary>
     67    /// Searches for slaves which are timed out, puts them and their jobs offline
     68    /// </summary>
     69    private void SetTimeoutSlavesOffline() {
     70      var slaves = dao.GetSlaves(x => x.SlaveState != SlaveState.Offline);
     71      foreach (Slave slave in slaves) {
     72        if (!slave.LastHeartbeat.HasValue || (DateTime.Now - slave.LastHeartbeat.Value).TotalSeconds > ApplicationConstants.HeartbeatTimeout) {
     73          slave.SlaveState = SlaveState.Offline;
     74          SetJobsWaiting(slave.Id);
     75          dao.UpdateSlave(slave);
     76        }
     77      }
     78    }
     79
     80    /// <summary>
     81    /// Looks for parent jobs which have FinishWhenChildJobsFinished and set their state to finished
     82    /// </summary>
     83    private void FinishParentJobs() {
     84      var parentJobsToFinish = dao.GetParentJobs(dao.GetResources(x => true).Select(x => x.Id), 0, true);
     85      foreach (var job in parentJobsToFinish) {
     86        job.SetState(JobState.Finished);
     87        dao.UpdateJob(job);
     88      }
     89    }
     90
     91    private void SetJobsWaiting(Guid slaveId) {
     92      var jobs = dao.GetJobs(x => x.State == JobState.Calculating).Where(x => x.StateLog.Last().SlaveId == slaveId);
    7093      foreach (var j in jobs) {
    7194        j.StateLog.Add(new StateLog() {
    72           UserId = auth.UserId,
    7395          State = JobState.Waiting,
    7496          JobId = j.Id,
Note: See TracChangeset for help on using the changeset viewer.