Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/08/11 00:04:16 (13 years ago)
Author:
cneumuel
Message:

#1233

  • locking for childHiveJobs in OptimizerHiveJob avoid multi threaded access issues
  • added IsPrivileged to gui
  • minor changes
Location:
branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveClient.cs

    r6373 r6381  
    225225
    226226          foreach (HiveJob hiveJob in refreshableHiveExperiment.HiveExperiment.HiveJobs) {
    227             UploadJobWithChildren(refreshableHiveExperiment.HiveExperiment.Progress, service, hiveJob, null, resourceIds, ref jobCount, totalJobCount, configFilePlugin.Id, refreshableHiveExperiment.HiveExperiment.UseLocalPlugins, refreshableHiveExperiment.HiveExperiment.Id, refreshableHiveExperiment.Log);
     227            UploadJobWithChildren(refreshableHiveExperiment.HiveExperiment.Progress, service, hiveJob, null, resourceIds, ref jobCount, totalJobCount, configFilePlugin.Id, refreshableHiveExperiment.HiveExperiment.UseLocalPlugins, refreshableHiveExperiment.HiveExperiment.Id, refreshableHiveExperiment.Log, refreshableHiveExperiment.HiveExperiment.IsPrivileged);
    228228          }
    229229
     
    257257    /// <param name="parentHiveJob">shall be null if its the root job</param>
    258258    /// <param name="groups"></param>
    259     private void UploadJobWithChildren(IProgress progress, IHiveService service, HiveJob hiveJob, HiveJob parentHiveJob, IEnumerable<Guid> groups, ref int jobCount, int totalJobCount, Guid configPluginId, bool useLocalPlugins, Guid hiveExperimentId, ILog log) {
     259    private void UploadJobWithChildren(IProgress progress, IHiveService service, HiveJob hiveJob, HiveJob parentHiveJob, IEnumerable<Guid> groups, ref int jobCount, int totalJobCount, Guid configPluginId, bool useLocalPlugins, Guid hiveExperimentId, ILog log, bool isPrivileged) {
    260260      jobCount++;
    261261      progress.Status = string.Format("Serializing job {0} of {1}", jobCount, totalJobCount);
     
    263263      List<IPluginDescription> plugins;
    264264
    265       if (hiveJob.ItemJob.ComputeInParallel &&
    266         (hiveJob.ItemJob.Item is Optimization.Experiment || hiveJob.ItemJob.Item is Optimization.BatchRun)) {
     265      if (hiveJob.ItemJob.ComputeInParallel && (hiveJob.ItemJob.Item is Optimization.Experiment || hiveJob.ItemJob.Item is Optimization.BatchRun)) {
    267266        hiveJob.Job.IsParentJob = true;
    268267        hiveJob.Job.FinishWhenChildJobsFinished = true;
     
    279278      hiveJob.Job.PluginsNeededIds.Add(configPluginId);
    280279      hiveJob.Job.HiveExperimentId = hiveExperimentId;
     280      hiveJob.Job.IsPrivileged = isPrivileged;
    281281
    282282      progress.Status = string.Format("Uploading job {0} of {1} ({2} kb, {3} objects)", jobCount, totalJobCount, jobData.Data.Count() / 1024, hiveJob.ItemJob.GetObjectGraphObjects().Count());
     
    293293
    294294      foreach (HiveJob child in hiveJob.ChildHiveJobs) {
    295         UploadJobWithChildren(progress, service, child, hiveJob, groups, ref jobCount, totalJobCount, configPluginId, useLocalPlugins, hiveExperimentId, log);
     295        UploadJobWithChildren(progress, service, child, hiveJob, groups, ref jobCount, totalJobCount, configPluginId, useLocalPlugins, hiveExperimentId, log, isPrivileged);
    296296      }
    297297    }
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/EngineHiveJob.cs

    r6373 r6381  
    5656
    5757      // clone operation and remove unnecessary scopes; don't do this earlier to avoid memory problems
    58       lock (locker) {
     58      //lock (locker) {
    5959        ((IAtomicOperation)ItemJob.InitialOperation).Scope.Parent = parentScopeClone;
    6060        ItemJob.InitialOperation = (IOperation)ItemJob.InitialOperation.Clone();
    6161        ((IAtomicOperation)ItemJob.InitialOperation).Scope.ClearParentScopes();
    6262        jobData.Data = PersistenceUtil.Serialize(ItemJob, out usedTypes);
    63       }
     63      //}
    6464
    6565      // add type objects from object graph to work around ticket #1527
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/HiveJob.cs

    r6373 r6381  
    2525using System.Drawing;
    2626using System.Linq;
     27using System.Threading;
    2728using HeuristicLab.Collections;
    2829using HeuristicLab.Common;
     
    3738  public class HiveJob : NamedItem, IItemTree<HiveJob> {
    3839    protected static object locker = new object();
     40    protected ReaderWriterLockSlim childHiveJobsLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
    3941
    4042    public override Image ItemImage {
     
    109111    protected ItemList<HiveJob> childHiveJobs;
    110112    public virtual ReadOnlyItemList<HiveJob> ChildHiveJobs {
    111       get { return childHiveJobs.AsReadOnly(); }
     113      get {
     114        childHiveJobsLock.EnterReadLock();
     115        try {
     116          return childHiveJobs.AsReadOnly();
     117        }
     118        finally { childHiveJobsLock.ExitReadLock(); }
     119      }
    112120    }
    113121
     
    117125    #region Constructors and Cloning
    118126    public HiveJob() {
    119       this.Job = new Job() {
    120         CoresNeeded = 1,
    121         MemoryNeeded = 0
    122       };
     127      this.Job = new Job() { CoresNeeded = 1, MemoryNeeded = 0 };
    123128      job.State = JobState.Offline;
    124129      this.childHiveJobs = new ItemList<HiveJob>();
     
    152157      this.Job = cloner.Clone(original.job);
    153158      this.ItemJob = cloner.Clone(original.ItemJob);
    154       this.childHiveJobs = cloner.Clone(original.childHiveJobs);
     159      original.childHiveJobsLock.EnterReadLock();
     160      try {
     161        this.childHiveJobs = cloner.Clone(original.childHiveJobs);
     162      }
     163      finally { original.childHiveJobsLock.ExitReadLock(); }
    155164      this.syncJobsWithOptimizers = original.syncJobsWithOptimizers;
    156165      this.isFinishedJobDownloaded = original.isFinishedJobDownloaded;
     
    198207
    199208    public virtual void AddChildHiveJob(HiveJob hiveJob) {
    200       this.childHiveJobs.Add(hiveJob);
     209      childHiveJobsLock.EnterWriteLock();
     210      try {
     211        this.childHiveJobs.Add(hiveJob);
     212      }
     213      finally { childHiveJobsLock.ExitWriteLock(); }
    201214    }
    202215
     
    237250      IEnumerable<Type> usedTypes;
    238251      byte[] jobByteArray = PersistenceUtil.Serialize(this.ItemJob, out usedTypes);
    239 
    240       JobData jobData = new JobData() {
    241         JobId = job.Id,
    242         Data = jobByteArray
    243       };
    244 
     252      JobData jobData = new JobData() { JobId = job.Id, Data = jobByteArray };
    245253      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
    246 
    247254      return jobData;
    248255    }
     
    295302    /// </summary>
    296303    public IEnumerable<HiveJob> GetAllHiveJobs() {
    297       var jobs = new List<HiveJob>();
    298       jobs.Add(this);
    299       foreach (HiveJob child in this.ChildHiveJobs) {
    300         jobs.AddRange(child.GetAllHiveJobs());
    301       }
    302       return jobs;
     304      childHiveJobsLock.EnterReadLock();
     305      try {
     306        var jobs = new List<HiveJob>();
     307        jobs.Add(this);
     308        foreach (HiveJob child in this.childHiveJobs) {
     309          jobs.AddRange(child.GetAllHiveJobs());
     310        }
     311        return jobs;
     312      }
     313      finally { childHiveJobsLock.ExitReadLock(); }
    303314    }
    304315
    305316    public HiveJob GetParentByJobId(Guid jobId) {
    306       if (this.ChildHiveJobs.SingleOrDefault(j => j.job.Id == jobId) != null)
    307         return this;
    308       foreach (HiveJob child in this.childHiveJobs) {
    309         HiveJob result = child.GetParentByJobId(jobId);
    310         if (result != null)
    311           return result;
    312       }
    313       return null;
     317      childHiveJobsLock.EnterReadLock();
     318      try {
     319        if (this.ChildHiveJobs.SingleOrDefault(j => j.job.Id == jobId) != null)
     320          return this;
     321        foreach (HiveJob child in this.childHiveJobs) {
     322          HiveJob result = child.GetParentByJobId(jobId);
     323          if (result != null)
     324            return result;
     325        }
     326        return null;
     327      }
     328      finally { childHiveJobsLock.ExitWriteLock(); }
    314329    }
    315330
     
    321336        return this;
    322337      } else {
    323         foreach (HiveJob child in this.ChildHiveJobs) {
    324           HiveJob result = child.GetHiveJobByJobId(jobId);
    325           if (result != null)
    326             return result;
    327         }
     338        childHiveJobsLock.EnterReadLock();
     339        try {
     340          foreach (HiveJob child in this.childHiveJobs) {
     341            HiveJob result = child.GetHiveJobByJobId(jobId);
     342            if (result != null)
     343              return result;
     344          }
     345        }
     346        finally { childHiveJobsLock.ExitReadLock(); }
    328347      }
    329348      return null;
     
    331350
    332351    public void RemoveByJobId(Guid jobId) {
    333       IEnumerable<HiveJob> jobs = ChildHiveJobs.Where(j => j.Job.Id == jobId).ToList(); // if Guid.Empty needs to be removed, there could be more than one with this jobId
    334       foreach (HiveJob j in jobs) {
    335         this.childHiveJobs.Remove(j);
    336       }
    337       foreach (HiveJob child in ChildHiveJobs) {
    338         child.RemoveByJobId(jobId);
    339       }
     352      childHiveJobsLock.EnterWriteLock();
     353      try {
     354        IEnumerable<HiveJob> jobs = childHiveJobs.Where(j => j.Job.Id == jobId).ToList();
     355        foreach (HiveJob j in jobs) {
     356          this.childHiveJobs.Remove(j);
     357        }
     358        foreach (HiveJob child in childHiveJobs) {
     359          child.RemoveByJobId(jobId);
     360        }
     361      }
     362      finally { childHiveJobsLock.ExitWriteLock(); }
    340363    }
    341364
    342365    public IEnumerable<IItemTree<HiveJob>> GetChildItems() {
    343       return this.childHiveJobs;
     366      return this.ChildHiveJobs;
    344367    }
    345368
     
    371394    public void Pause() {
    372395      if (this.Job.IsParentJob) {
    373         foreach (var child in ChildHiveJobs) {
    374           ServiceLocator.Instance.CallHiveService(s => s.PauseJob(child.job.Id));
    375         }
     396        childHiveJobsLock.EnterReadLock();
     397        try {
     398          foreach (var child in childHiveJobs) {
     399            ServiceLocator.Instance.CallHiveService(s => s.PauseJob(child.job.Id));
     400          }
     401        }
     402        finally { childHiveJobsLock.ExitReadLock(); }
    376403      } else {
    377404        ServiceLocator.Instance.CallHiveService(s => s.PauseJob(this.job.Id));
     
    381408    public void Stop() {
    382409      if (this.Job.IsParentJob) {
    383         foreach (var child in ChildHiveJobs) {
    384           ServiceLocator.Instance.CallHiveService(s => s.StopJob(child.job.Id));
    385         }
     410        childHiveJobsLock.EnterReadLock();
     411        try {
     412          foreach (var child in childHiveJobs) {
     413            ServiceLocator.Instance.CallHiveService(s => s.StopJob(child.job.Id));
     414          }
     415        }
     416        finally { childHiveJobsLock.ExitReadLock(); }
    386417      } else {
    387418        ServiceLocator.Instance.CallHiveService(s => s.StopJob(this.job.Id));
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/OptimizerHiveJob.cs

    r6373 r6381  
    129129    private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
    130130      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
    131         foreach (var item in e.Items) {
    132           if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
    133             this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
    134           }
    135         }
     131        childHiveJobsLock.EnterWriteLock();
     132        try {
     133          foreach (var item in e.Items) {
     134            if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
     135              this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
     136            }
     137          }
     138        }
     139        finally { childHiveJobsLock.ExitWriteLock(); }
    136140      }
    137141    }
    138142    private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
    139143      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
    140         foreach (var item in e.OldItems) {
    141           this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
    142         }
    143         foreach (var item in e.Items) {
    144           if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
    145             this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
    146           }
    147         }
     144        childHiveJobsLock.EnterWriteLock();
     145        try {
     146          foreach (var item in e.OldItems) {
     147            this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
     148          }
     149          foreach (var item in e.Items) {
     150            if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
     151              this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
     152            }
     153          }
     154        }
     155        finally { childHiveJobsLock.ExitWriteLock(); }
    148156      }
    149157    }
    150158    private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
    151159      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
    152         foreach (var item in e.Items) {
    153           this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
    154         }
     160        childHiveJobsLock.EnterWriteLock();
     161        try {
     162          foreach (var item in e.Items) {
     163            this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
     164          }
     165        }
     166        finally { childHiveJobsLock.ExitWriteLock(); }
    155167      }
    156168    }
    157169    private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
    158170      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
    159         foreach (var item in e.Items) {
    160           this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
    161         }
     171        childHiveJobsLock.EnterWriteLock();
     172        try {
     173          foreach (var item in e.Items) {
     174            this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
     175          }
     176        }
     177        finally { childHiveJobsLock.ExitWriteLock(); }
    162178      }
    163179    }
     
    182198
    183199      OptimizerHiveJob child = (OptimizerHiveJob)this.ChildHiveJobs.Single(j => j.Job.Id == childJobId);
    184       if (!optimizerJob.ComputeInParallel) {
    185         child.syncJobsWithOptimizers = false;
    186         child.ItemJob = optimizerJob;
    187         child.syncJobsWithOptimizers = true;
    188       }
     200      childHiveJobsLock.EnterReadLock();
     201      try {
     202        if (!optimizerJob.ComputeInParallel) {
     203          child.syncJobsWithOptimizers = false;
     204          child.ItemJob = optimizerJob;
     205          child.syncJobsWithOptimizers = true;
     206        }
     207      }
     208      finally { childHiveJobsLock.ExitReadLock(); }
    189209      syncJobsWithOptimizers = true;
    190210    }
     
    243263        }
    244264      }
    245       foreach (OptimizerHiveJob child in childHiveJobs) {
    246         child.SetIndexInParentOptimizerList(this);
    247       }
     265      childHiveJobsLock.EnterReadLock();
     266      try {
     267        foreach (OptimizerHiveJob child in childHiveJobs) {
     268          child.SetIndexInParentOptimizerList(this);
     269        }
     270      }
     271      finally { childHiveJobsLock.ExitReadLock(); }
    248272    }
    249273
     
    302326      }
    303327
    304       JobData jobData = new JobData() {
    305         JobId = job.Id,
    306         Data = jobByteArray
    307       };
    308 
     328      JobData jobData = new JobData() { JobId = job.Id, Data = jobByteArray };
    309329      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
    310 
    311330      return jobData;
    312331    }
    313332
    314333    public OptimizerHiveJob GetChildByOptimizerJob(OptimizerJob optimizerJob) {
    315       foreach (OptimizerHiveJob child in ChildHiveJobs) {
    316         if (child.ItemJob == optimizerJob)
    317           return child;
    318       }
    319       return null;
     334      childHiveJobsLock.EnterReadLock();
     335      try {
     336        foreach (OptimizerHiveJob child in childHiveJobs) {
     337          if (child.ItemJob == optimizerJob)
     338            return child;
     339        }
     340        return null;
     341      }
     342      finally { childHiveJobsLock.ExitReadLock(); }
    320343    }
    321344
    322345    public HiveJob<OptimizerJob> GetChildByOptimizer(IOptimizer optimizer) {
    323       foreach (OptimizerHiveJob child in ChildHiveJobs) {
    324         if (child.ItemJob.Item == optimizer)
    325           return child;
    326       }
    327       return null;
     346      childHiveJobsLock.EnterReadLock();
     347      try {
     348        foreach (OptimizerHiveJob child in childHiveJobs) {
     349          if (child.ItemJob.Item == optimizer)
     350            return child;
     351        }
     352        return null;
     353      }
     354      finally { childHiveJobsLock.ExitReadLock(); }
    328355    }
    329356
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/ItemJob.cs

    r6373 r6381  
    3131  [Item("Item Job", "Represents a executable hive job which contains a HeuristicLab Item.")]
    3232  [StorableClass]
    33   public abstract class ItemJob : DeepCloneable, IJob {
     33  public abstract class ItemJob : NamedItem, IJob {
    3434    public virtual bool IsParallelizable {
    3535      get { return true; }
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs

    r6373 r6381  
    8686
    8787    #region IJob Members
    88 
    8988    public override ExecutionState ExecutionState {
    9089      get { return Item.ExecutionState; }
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/RefreshableHiveExperiment.cs

    r6373 r6381  
    395395
    396396    public override string ToString() {
    397       return HiveExperiment.ToString();
     397      return string.Format("{0} {1}", HiveExperiment.DateCreated.ToString("MM.dd.yyyy HH:mm"), HiveExperiment.ToString());
    398398    }
    399399  }
  • branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveExperiment.cs

    r6372 r6381  
    3333      get { return useLocalPlugins; }
    3434      set { useLocalPlugins = value; }
     35    }
     36
     37    private bool isPrivileged;
     38    public bool IsPrivileged {
     39      get { return isPrivileged; }
     40      set { isPrivileged = value; }
    3541    }
    3642
     
    8995      this.ResourceNames = "HEAL";
    9096      this.HiveJobs = new ItemCollection<HiveJob>();
     97      this.DateCreated = DateTime.Now;
    9198    }
    9299
     
    103110      this.UseLocalPlugins = original.UseLocalPlugins;
    104111      this.ExecutionTime = original.ExecutionTime;
     112      this.IsPrivileged = original.IsPrivileged;
    105113    }
    106114    public override IDeepCloneable Clone(Cloner cloner) {
Note: See TracChangeset for help on using the changeset viewer.