Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive.Azure/HeuristicLab.Clients.Hive/3.3/HiveJobs/HiveTask.cs @ 7215

Last change on this file since 7215 was 7215, checked in by spimming, 12 years ago

#1680:

  • merged changes from trunk into branch

' removed pre-build event for multiple app.configs

File size: 19.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.ComponentModel;
25using System.Drawing;
26using System.Linq;
27using System.Threading;
28using HeuristicLab.Collections;
29using HeuristicLab.Common;
30using HeuristicLab.Core;
31using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
32using HeuristicLab.PluginInfrastructure;
33
34namespace HeuristicLab.Clients.Hive {
35
36  [Item("Hive Task", "Represents a hive task.")]
37  [StorableClass]
38  public class HiveTask : NamedItem, IItemTree<HiveTask> {
39    protected static object locker = new object();
40    protected ReaderWriterLockSlim childHiveTasksLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
41
42    public override Image ItemImage {
43      get {
44        if (task.Id == Guid.Empty) { // not yet uploaded
45          return HeuristicLab.Common.Resources.VSImageLibrary.Event;
46        } else {
47          if (task.State == TaskState.Waiting) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutablePrepared;
48          else if (task.State == TaskState.Calculating) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStarted;
49          else if (task.State == TaskState.Transferring) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStarted;
50          else if (task.State == TaskState.Paused) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutablePaused;
51          else if (task.State == TaskState.Aborted) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStopped;
52          else if (task.State == TaskState.Failed) return HeuristicLab.Common.Resources.VSImageLibrary.Error;
53          else if (task.State == TaskState.Finished) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStopped;
54          else return HeuristicLab.Common.Resources.VSImageLibrary.Event;
55        }
56      }
57    }
58
59    [Storable]
60    protected Task task;
61    public Task Task {
62      get { return task; }
63      set {
64        if (task != value) {
65          DeregisterJobEvents();
66          task = value;
67          RegisterJobEvents();
68          IsFinishedTaskDownloaded = false;
69          OnTaskChanged();
70          OnToStringChanged();
71          OnItemImageChanged();
72        }
73      }
74    }
75
76    [Storable]
77    protected ItemTask itemTask;
78    public ItemTask ItemTask {
79      get { return itemTask; }
80      set {
81        if (itemTask != null && syncTasksWithOptimizers) {
82          this.childHiveTasks.Clear();
83        }
84        if (itemTask != value) {
85          DergisterItemTaskEvents();
86          itemTask = value;
87          RegisterItemTaskEvents();
88          OnItemTaskChanged();
89          IsFinishedTaskDownloaded = true;
90        }
91      }
92    }
93
94    // task downloaded since last status change
95    [Storable]
96    private bool isFinishedTaskDownloaded = false;
97    public bool IsFinishedTaskDownloaded {
98      get { return isFinishedTaskDownloaded; }
99      set {
100        if (value != isFinishedTaskDownloaded) {
101          this.isFinishedTaskDownloaded = value;
102          OnIsFinishedJobDownloadedChanged();
103        }
104      }
105    }
106
107    public bool IsDownloading { get; set; }
108
109    // if true, all control buttons should be enabled. otherwise disabled
110    private bool isControllable = true;
111    public bool IsControllable {
112      get { return isControllable; }
113      set {
114        if (value != isControllable) {
115          isControllable = value;
116          OnIsControllableChanged();
117          childHiveTasksLock.EnterReadLock();
118          try {
119            foreach (var hiveJob in childHiveTasks) {
120              hiveJob.IsControllable = value;
121            }
122          } finally {
123            childHiveTasksLock.ExitReadLock();
124          }
125        }
126      }
127    }
128
129    [Storable]
130    protected ItemList<HiveTask> childHiveTasks;
131    public virtual ReadOnlyItemList<HiveTask> ChildHiveTasks {
132      get {
133        childHiveTasksLock.EnterReadLock();
134        try {
135          return childHiveTasks.AsReadOnly();
136        } finally { childHiveTasksLock.ExitReadLock(); }
137      }
138    }
139
140    [Storable]
141    protected bool syncTasksWithOptimizers = true;
142
143    public StateLogList StateLog {
144      get {
145        var list = new StateLogList(this.task.StateLog);
146        list.ForEach(s => { s.TaskName = itemTask.Name; });
147        return list;
148      }
149    }
150
151    public StateLogListList ChildStateLogList {
152      get { return new StateLogListList(this.childHiveTasks.Select(x => x.StateLog)); }
153    }
154
155    #region Constructors and Cloning
156    [StorableConstructor]
157    protected HiveTask(bool deserializing) { }
158
159    public HiveTask() {
160      this.Task = new Task() { CoresNeeded = 1, MemoryNeeded = 128 };
161      task.State = TaskState.Offline;
162      this.childHiveTasks = new ItemList<HiveTask>();
163      syncTasksWithOptimizers = true;
164      RegisterChildHiveJobEvents();
165    }
166
167    public HiveTask(ItemTask itemJob, bool autoCreateChildHiveJobs)
168      : this() {
169      this.syncTasksWithOptimizers = autoCreateChildHiveJobs;
170      this.ItemTask = itemJob;
171      this.syncTasksWithOptimizers = true;
172    }
173
174    public HiveTask(Task job, TaskData taskData, bool autoCreateChildHiveTasks) {
175      this.syncTasksWithOptimizers = autoCreateChildHiveTasks;
176      this.Task = job;
177      try {
178        this.ItemTask = PersistenceUtil.Deserialize<ItemTask>(taskData.Data);
179      }
180      catch {
181        this.ItemTask = null;
182      }
183      this.childHiveTasks = new ItemList<HiveTask>();
184      this.syncTasksWithOptimizers = true;
185      RegisterChildHiveJobEvents();
186    }
187
188    protected HiveTask(HiveTask original, Cloner cloner)
189      : base(original, cloner) {
190      this.Task = cloner.Clone(original.task);
191      this.ItemTask = cloner.Clone(original.ItemTask);
192      original.childHiveTasksLock.EnterReadLock();
193      try {
194        this.childHiveTasks = cloner.Clone(original.childHiveTasks);
195      } finally { original.childHiveTasksLock.ExitReadLock(); }
196      this.syncTasksWithOptimizers = original.syncTasksWithOptimizers;
197      this.isFinishedTaskDownloaded = original.isFinishedTaskDownloaded;
198    }
199    public override IDeepCloneable Clone(Cloner cloner) {
200      return new HiveTask(this, cloner);
201    }
202    #endregion
203
204    protected virtual void UpdateChildHiveTasks() { }
205
206    protected virtual void RegisterItemTaskEvents() {
207      if (ItemTask != null) {
208        ItemTask.ComputeInParallelChanged += new EventHandler(ItemJob_ComputeInParallelChanged);
209        ItemTask.ToStringChanged += new EventHandler(ItemJob_ToStringChanged);
210      }
211    }
212    protected virtual void DergisterItemTaskEvents() {
213      if (ItemTask != null) {
214        ItemTask.ComputeInParallelChanged -= new EventHandler(ItemJob_ComputeInParallelChanged);
215        ItemTask.ToStringChanged -= new EventHandler(ItemJob_ToStringChanged);
216      }
217    }
218
219    protected virtual void RegisterChildHiveJobEvents() {
220      this.childHiveTasks.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsAdded);
221      this.childHiveTasks.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsRemoved);
222      this.childHiveTasks.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnCollectionReset);
223    }
224    protected virtual void DeregisterChildHiveJobEvents() {
225      this.childHiveTasks.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsAdded);
226      this.childHiveTasks.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsRemoved);
227      this.childHiveTasks.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnCollectionReset);
228    }
229
230    protected virtual void ItemJob_ToStringChanged(object sender, EventArgs e) {
231      this.OnToStringChanged();
232    }
233
234    protected virtual void ItemJob_ComputeInParallelChanged(object sender, EventArgs e) {
235      if (ItemTask != null && syncTasksWithOptimizers) {
236        this.UpdateChildHiveTasks();
237      }
238    }
239
240    public virtual void AddChildHiveTask(HiveTask hiveTask) {
241      childHiveTasksLock.EnterWriteLock();
242      try {
243        this.childHiveTasks.Add(hiveTask);
244      } finally { childHiveTasksLock.ExitWriteLock(); }
245    }
246
247    public override string ToString() {
248      if (itemTask != null && itemTask.Item != null) {
249        return itemTask.ToString();
250      } else {
251        return Task.Id.ToString();
252      }
253    }
254
255    public virtual void UpdateFromLightweightJob(LightweightTask lightweightJob) {
256      if (lightweightJob != null) {
257        task.Id = lightweightJob.Id;
258        task.ParentTaskId = lightweightJob.ParentTaskId;
259        task.ExecutionTime = lightweightJob.ExecutionTime;
260        task.State = lightweightJob.State;
261        task.StateLog = new List<StateLog>(lightweightJob.StateLog);
262        task.Command = lightweightJob.Command;
263
264        OnTaskStateChanged();
265        OnToStringChanged();
266        OnItemImageChanged();
267        OnStateLogChanged();
268      }
269    }
270
271    /// <summary>
272    /// Creates a TaskData object containing the Task and the IJob-Object as byte[]
273    /// </summary>
274    /// <param name="withoutChildOptimizers">
275    ///   if true the Child-Optimizers will not be serialized (if the task contains an Experiment)
276    /// </param>
277    public virtual TaskData GetAsTaskData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
278      plugins = new List<IPluginDescription>();
279      if (this.itemTask == null)
280        return null;
281
282      IEnumerable<Type> usedTypes;
283      byte[] taskByteArray = PersistenceUtil.Serialize(this.ItemTask, out usedTypes);
284      TaskData taskData = new TaskData() { TaskId = task.Id, Data = taskByteArray };
285      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
286      return taskData;
287    }
288
289    #region Event Handler
290    public event EventHandler TaskChanged;
291    private void OnTaskChanged() {
292      EventHandler handler = TaskChanged;
293      if (handler != null) handler(this, EventArgs.Empty);
294    }
295
296    public event EventHandler TaskStateChanged;
297    private void OnTaskStateChanged() {
298      EventHandler handler = TaskStateChanged;
299      if (handler != null) handler(this, EventArgs.Empty);
300    }
301
302    public event EventHandler ItemTaskChanged;
303    private void OnItemTaskChanged() {
304      ItemJob_ComputeInParallelChanged(this, EventArgs.Empty);
305      var handler = ItemTaskChanged;
306      if (handler != null) handler(this, EventArgs.Empty);
307    }
308
309    public event EventHandler IsFinishedJobDownloadedChanged;
310    private void OnIsFinishedJobDownloadedChanged() {
311      var handler = IsFinishedJobDownloadedChanged;
312      if (handler != null) handler(this, EventArgs.Empty);
313    }
314
315    public event EventHandler StateLogChanged;
316    private void OnStateLogChanged() {
317      var handler = StateLogChanged;
318      if (handler != null) handler(this, EventArgs.Empty);
319    }
320
321    public event EventHandler IsControllableChanged;
322    private void OnIsControllableChanged() {
323      var handler = IsControllableChanged;
324      if (handler != null) handler(this, EventArgs.Empty);
325    }
326
327    private void RegisterJobEvents() {
328      if (task != null)
329        task.PropertyChanged += new PropertyChangedEventHandler(job_PropertyChanged);
330    }
331
332    private void DeregisterJobEvents() {
333      if (task != null)
334        task.PropertyChanged += new PropertyChangedEventHandler(job_PropertyChanged);
335    }
336
337    private void job_PropertyChanged(object sender, PropertyChangedEventArgs e) {
338      if (e.PropertyName == "State") {
339        IsFinishedTaskDownloaded = false;
340      }
341      if (e.PropertyName == "Priority" && Task != null) {
342        foreach (var task in childHiveTasks) {
343          task.Task.Priority = Task.Priority;
344        }
345      }
346    }
347    #endregion
348
349    /// <summary>
350    /// Returns a list of HiveTasks including this and all its child-jobs recursively
351    /// </summary>
352    public IEnumerable<HiveTask> GetAllHiveTasks() {
353      childHiveTasksLock.EnterReadLock();
354      try {
355        var jobs = new List<HiveTask>();
356        jobs.Add(this);
357        foreach (HiveTask child in this.childHiveTasks) {
358          jobs.AddRange(child.GetAllHiveTasks());
359        }
360        return jobs;
361      } finally { childHiveTasksLock.ExitReadLock(); }
362    }
363
364    public HiveTask GetParentByJobId(Guid taskId) {
365      childHiveTasksLock.EnterReadLock();
366      try {
367        if (this.ChildHiveTasks.SingleOrDefault(j => j.task.Id == taskId) != null)
368          return this;
369        foreach (HiveTask child in this.childHiveTasks) {
370          HiveTask result = child.GetParentByJobId(taskId);
371          if (result != null)
372            return result;
373        }
374        return null;
375      } finally { childHiveTasksLock.ExitWriteLock(); }
376    }
377
378    /// <summary>
379    /// Searches for an HiveTask object with the correct taskId recursively
380    /// </summary>
381    public HiveTask GetHiveTaskByTaskId(Guid jobId) {
382      if (this.Task.Id == jobId) {
383        return this;
384      } else {
385        childHiveTasksLock.EnterReadLock();
386        try {
387          foreach (HiveTask child in this.childHiveTasks) {
388            HiveTask result = child.GetHiveTaskByTaskId(jobId);
389            if (result != null)
390              return result;
391          }
392        } finally { childHiveTasksLock.ExitReadLock(); }
393      }
394      return null;
395    }
396
397    public void RemoveByTaskId(Guid jobId) {
398      childHiveTasksLock.EnterWriteLock();
399      try {
400        IEnumerable<HiveTask> jobs = childHiveTasks.Where(j => j.Task.Id == jobId).ToList();
401        foreach (HiveTask j in jobs) {
402          this.childHiveTasks.Remove(j);
403        }
404        foreach (HiveTask child in childHiveTasks) {
405          child.RemoveByTaskId(jobId);
406        }
407      } finally { childHiveTasksLock.ExitWriteLock(); }
408    }
409
410    public IEnumerable<IItemTree<HiveTask>> GetChildItems() {
411      return this.ChildHiveTasks;
412    }
413
414    #region INotifyObservableCollectionItemsChanged<IItemTree> Members
415
416    public event CollectionItemsChangedEventHandler<IItemTree<HiveTask>> CollectionReset;
417    private void OnCollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveTask>> e) {
418      foreach (var item in e.Items) {
419        item.Value.StateLogChanged -= new EventHandler(ChildHiveJob_StateLogChanged);
420      }
421      var handler = CollectionReset;
422      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
423    }
424
425    public event CollectionItemsChangedEventHandler<IItemTree<HiveTask>> ItemsAdded;
426    private void OnItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveTask>> e) {
427      foreach (var item in e.Items) {
428        item.Value.StateLogChanged += new EventHandler(ChildHiveJob_StateLogChanged);
429        item.Value.IsControllable = this.IsControllable;
430      }
431      var handler = ItemsAdded;
432      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
433    }
434
435    public event CollectionItemsChangedEventHandler<IItemTree<HiveTask>> ItemsRemoved;
436    private void OnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveTask>> e) {
437      foreach (var item in e.Items) {
438        item.Value.StateLogChanged -= new EventHandler(ChildHiveJob_StateLogChanged);
439      }
440      var handler = ItemsRemoved;
441      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
442    }
443
444    private static CollectionItemsChangedEventArgs<IItemTree<HiveTask>> ToCollectionItemsChangedEventArgs(CollectionItemsChangedEventArgs<IndexedItem<HiveTask>> e) {
445      return new CollectionItemsChangedEventArgs<IItemTree<HiveTask>>(e.Items.Select(x => x.Value), e.OldItems == null ? null : e.OldItems.Select(x => x.Value));
446    }
447
448    private void ChildHiveJob_StateLogChanged(object sender, EventArgs e) {
449      OnStateLogChanged();
450    }
451    #endregion
452
453    public void Pause() {
454      if (this.Task.IsParentTask) {
455        childHiveTasksLock.EnterReadLock();
456        try {
457          foreach (var child in childHiveTasks) {
458            HiveServiceLocator.Instance.CallHiveService(s => s.PauseTask(child.task.Id));
459          }
460        } finally { childHiveTasksLock.ExitReadLock(); }
461      } else {
462        HiveServiceLocator.Instance.CallHiveService(s => s.PauseTask(this.task.Id));
463      }
464    }
465
466    public void Stop() {
467      if (this.Task.IsParentTask) {
468        childHiveTasksLock.EnterReadLock();
469        try {
470          foreach (var child in childHiveTasks) {
471            HiveServiceLocator.Instance.CallHiveService(s => s.StopTask(child.task.Id));
472          }
473        } finally { childHiveTasksLock.ExitReadLock(); }
474      } else {
475        HiveServiceLocator.Instance.CallHiveService(s => s.StopTask(this.task.Id));
476      }
477    }
478
479    public void Restart() {
480      HiveServiceLocator.Instance.CallHiveService(service => {
481        TaskData taskData = new TaskData();
482        taskData.TaskId = this.task.Id;
483        taskData.Data = PersistenceUtil.Serialize(this.itemTask);
484        service.UpdateTaskData(this.Task, taskData);
485        service.RestartTask(this.task.Id);
486        Task task = service.GetTask(this.task.Id);
487        this.task.LastTaskDataUpdate = task.LastTaskDataUpdate;
488      });
489    }
490
491    public ICollection<IItemTreeNodeAction<HiveTask>> Actions {
492      get {
493        return new List<IItemTreeNodeAction<HiveTask>>();
494      }
495    }
496
497    public virtual void IntegrateChild(ItemTask task, Guid childTaskId) { }
498
499    /// <summary>
500    /// Delete ItemTask
501    /// </summary>
502    public virtual void ClearData() {
503      this.ItemTask.Item = null;
504    }
505  }
506
507  [Item("Hive Task", "Represents a hive task.")]
508  [StorableClass]
509  public class HiveTask<T> : HiveTask where T : ItemTask {
510
511    public new T ItemTask {
512      get { return (T)base.ItemTask; }
513      internal set { base.ItemTask = value; }
514    }
515
516    #region Constructors and Cloning
517    public HiveTask() : base() { }
518    [StorableConstructor]
519    protected HiveTask(bool deserializing) { }
520    public HiveTask(T itemJob) : base(itemJob, true) { }
521    protected HiveTask(HiveTask<T> original, Cloner cloner)
522      : base(original, cloner) {
523    }
524    public override IDeepCloneable Clone(Cloner cloner) {
525      return new HiveTask<T>(this, cloner);
526    }
527    #endregion
528  }
529}
Note: See TracBrowser for help on using the repository browser.