Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/27/11 15:20:23 (13 years ago)
Author:
cneumuel
Message:

#1233

  • finished experiment sharing
  • added role for executing privileged jobs
  • refreshing experiments in experimentManager does not delete already downloaded jobs
  • moved some properties from HiveExperiment into RefreshableHiveExperiment
File:
1 edited

Legend:

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

    r6463 r6479  
    6666      set { alreadyUploadedPlugins = value; }
    6767    }
     68
     69    private bool isAllowedPrivileged;
     70    public bool IsAllowedPrivileged {
     71      get { return isAllowedPrivileged; }
     72      set { isAllowedPrivileged = value; }
     73    }
    6874    #endregion
    6975
     
    7581
    7682      try {
     83        this.IsAllowedPrivileged = ServiceLocator.Instance.CallHiveService((s) => s.IsAllowedPrivileged());
     84
     85        var oldExperiments = hiveExperiments ?? new ItemCollection<RefreshableHiveExperiment>();
    7786        hiveExperiments = new HiveItemCollection<RefreshableHiveExperiment>();
    78         var he = ServiceLocator.Instance.CallHiveService<IEnumerable<HiveExperiment>>(s => s.GetHiveExperiments());
    79         hiveExperiments.AddRange(he.Select(x => new RefreshableHiveExperiment(x)).OrderBy(x => x.HiveExperiment.Name));
     87        var experimentsLoaded = ServiceLocator.Instance.CallHiveService<IEnumerable<HiveExperiment>>(s => s.GetHiveExperiments());
     88
     89        foreach (var he in experimentsLoaded) {
     90          var hiveExperiment = oldExperiments.SingleOrDefault(x => x.Id == he.Id);
     91          if (hiveExperiment == null) {
     92            // new
     93            hiveExperiments.Add(new RefreshableHiveExperiment(he) { IsAllowedPrivileged = this.isAllowedPrivileged });
     94          } else {
     95            // update
     96            hiveExperiment.HiveExperiment = he;
     97            hiveExperiment.IsAllowedPrivileged = this.isAllowedPrivileged;
     98            hiveExperiments.Add(hiveExperiment);
     99          }
     100        }
     101        // remove those which were not in the list of loaded hiveexperiments
     102        foreach (var experiment in oldExperiments) {
     103          if (experiment.Id == Guid.Empty) {
     104            // experiment not uploaded... keep
     105            hiveExperiments.Add(experiment);
     106          } else {
     107            experiment.RefreshAutomatically = false; // stop results polling
     108          }
     109        }
    80110      }
    81111      catch {
     
    175205      HiveClient.StoreAsync(
    176206        new Action<Exception>((Exception ex) => {
    177           refreshableHiveExperiment.HiveExperiment.ExecutionState = ExecutionState.Prepared;
     207          refreshableHiveExperiment.ExecutionState = ExecutionState.Prepared;
    178208          exceptionCallback(ex);
    179209        }), refreshableHiveExperiment, cancellationToken);
    180       refreshableHiveExperiment.HiveExperiment.ExecutionState = ExecutionState.Started;
    181     }
    182 
    183     public static void PauseExperiment(HiveExperiment hiveExperiment) {
     210      refreshableHiveExperiment.ExecutionState = ExecutionState.Started;
     211    }
     212
     213    public static void PauseExperiment(RefreshableHiveExperiment refreshableHiveExperiment) {
    184214      ServiceLocator.Instance.CallHiveService(service => {
    185         foreach (HiveJob job in hiveExperiment.GetAllHiveJobs()) {
     215        foreach (HiveJob job in refreshableHiveExperiment.GetAllHiveJobs()) {
    186216          if (job.Job.State != JobState.Finished && job.Job.State != JobState.Aborted && job.Job.State != JobState.Failed)
    187217            service.PauseJob(job.Job.Id);
    188218        }
    189219      });
    190       hiveExperiment.ExecutionState = ExecutionState.Paused;
    191     }
    192 
    193     public static void StopExperiment(HiveExperiment hiveExperiment) {
     220      refreshableHiveExperiment.ExecutionState = ExecutionState.Paused;
     221    }
     222
     223    public static void StopExperiment(RefreshableHiveExperiment refreshableHiveExperiment) {
    194224      ServiceLocator.Instance.CallHiveService(service => {
    195         foreach (HiveJob job in hiveExperiment.GetAllHiveJobs()) {
     225        foreach (HiveJob job in refreshableHiveExperiment.GetAllHiveJobs()) {
    196226          if (job.Job.State != JobState.Finished && job.Job.State != JobState.Aborted && job.Job.State != JobState.Failed)
    197227            service.StopJob(job.Job.Id);
     
    207237    private void UploadExperiment(RefreshableHiveExperiment refreshableHiveExperiment, CancellationToken cancellationToken) {
    208238      try {
    209         refreshableHiveExperiment.HiveExperiment.Progress = new Progress("Connecting to server...");
    210         refreshableHiveExperiment.HiveExperiment.IsProgressing = true;
     239        refreshableHiveExperiment.Progress = new Progress("Connecting to server...");
     240        refreshableHiveExperiment.IsProgressing = true;
    211241
    212242        IEnumerable<string> resourceNames = ToResourceNameList(refreshableHiveExperiment.HiveExperiment.ResourceNames);
     
    220250        }
    221251
    222         foreach (OptimizerHiveJob hiveJob in refreshableHiveExperiment.HiveExperiment.HiveJobs.OfType<OptimizerHiveJob>()) {
     252        foreach (OptimizerHiveJob hiveJob in refreshableHiveExperiment.HiveJobs.OfType<OptimizerHiveJob>()) {
    223253          hiveJob.SetIndexInParentOptimizerList(null);
    224254        }
    225255
    226256        // upload HiveExperiment
    227         refreshableHiveExperiment.HiveExperiment.Progress.Status = "Uploading HiveExperiment...";
     257        refreshableHiveExperiment.Progress.Status = "Uploading HiveExperiment...";
    228258        refreshableHiveExperiment.HiveExperiment.Id = ServiceLocator.Instance.CallHiveService((s) => s.AddHiveExperiment(refreshableHiveExperiment.HiveExperiment));
    229         cancellationToken.ThrowIfCancellationRequested();
    230 
    231         int totalJobCount = refreshableHiveExperiment.HiveExperiment.GetAllHiveJobs().Count();
     259        refreshableHiveExperiment.HiveExperiment = ServiceLocator.Instance.CallHiveService((s) => s.GetHiveExperiment(refreshableHiveExperiment.HiveExperiment.Id)); // update owner and permissions
     260        cancellationToken.ThrowIfCancellationRequested();
     261
     262        int totalJobCount = refreshableHiveExperiment.GetAllHiveJobs().Count();
    232263        int[] jobCount = new int[1]; // use a reference type (int-array) instead of value type (int) in order to pass the value via a delegate to task-parallel-library
    233264        cancellationToken.ThrowIfCancellationRequested();
    234265
    235266        // upload plugins
    236         refreshableHiveExperiment.HiveExperiment.Progress.Status = "Uploading plugins...";
     267        refreshableHiveExperiment.Progress.Status = "Uploading plugins...";
    237268        this.OnlinePlugins = ServiceLocator.Instance.CallHiveService((s) => s.GetPlugins());
    238269        this.AlreadyUploadedPlugins = new List<Plugin>();
     
    244275
    245276        // upload jobs
    246         refreshableHiveExperiment.HiveExperiment.Progress.Status = "Uploading jobs...";
     277        refreshableHiveExperiment.Progress.Status = "Uploading jobs...";
    247278
    248279        var tasks = new List<Task>();
    249         foreach (HiveJob hiveJob in refreshableHiveExperiment.HiveExperiment.HiveJobs) {
     280        foreach (HiveJob hiveJob in refreshableHiveExperiment.HiveJobs) {
    250281          tasks.Add(Task.Factory.StartNew((hj) => {
    251             UploadJobWithChildren(refreshableHiveExperiment.HiveExperiment.Progress, (HiveJob)hj, null, resourceIds, jobCount, totalJobCount, configFilePlugin.Id, refreshableHiveExperiment.HiveExperiment.Id, refreshableHiveExperiment.Log, refreshableHiveExperiment.HiveExperiment.IsPrivileged, cancellationToken);
     282            UploadJobWithChildren(refreshableHiveExperiment.Progress, (HiveJob)hj, null, resourceIds, jobCount, totalJobCount, configFilePlugin.Id, refreshableHiveExperiment.HiveExperiment.Id, refreshableHiveExperiment.Log, refreshableHiveExperiment.HiveExperiment.IsPrivileged, cancellationToken);
    252283          }, hiveJob)
    253284          .ContinueWith((x) => refreshableHiveExperiment.Log.LogException(x.Exception), TaskContinuationOptions.OnlyOnFaulted));
     
    259290          if (!ae.InnerExceptions.All(e => e is TaskCanceledException)) throw ae; // for some reason the WaitAll throws a AggregateException containg a TaskCanceledException. i don't know where it comes from, however the tasks all finish properly, so for now just ignore it
    260291        }
     292        refreshableHiveExperiment.HiveExperiment.Modified = false;
    261293      }
    262294      finally {
    263         refreshableHiveExperiment.HiveExperiment.IsProgressing = false;
     295        refreshableHiveExperiment.IsProgressing = false;
    264296      }
    265297    }
     
    364396      }
    365397      finally {
    366         if(!semaphoreReleased) jobUploadSemaphore.Release();
     398        if (!semaphoreReleased) jobUploadSemaphore.Release();
    367399      }
    368400    }
     
    370402
    371403    #region Download Experiment
    372     public static void LoadExperiment(HiveExperiment hiveExperiment) {
    373       hiveExperiment.Progress = new Progress();
     404    public static void LoadExperiment(RefreshableHiveExperiment refreshableHiveExperiment) {
     405      var hiveExperiment = refreshableHiveExperiment.HiveExperiment;
     406      refreshableHiveExperiment.Progress = new Progress();
     407
    374408      try {
    375         hiveExperiment.IsProgressing = true;
     409        refreshableHiveExperiment.IsProgressing = true;
    376410        int totalJobCount = 0;
    377411        IEnumerable<LightweightJob> allJobs;
    378412
    379         hiveExperiment.Progress.Status = "Connecting to Server...";
     413        refreshableHiveExperiment.Progress.Status = "Connecting to Server...";
    380414        // fetch all Job objects to create the full tree of tree of HiveJob objects
    381         hiveExperiment.Progress.Status = "Downloading list of jobs...";
     415        refreshableHiveExperiment.Progress.Status = "Downloading list of jobs...";
    382416        allJobs = ServiceLocator.Instance.CallHiveService(s => s.GetLightweightExperimentJobs(hiveExperiment.Id));
    383417        totalJobCount = allJobs.Count();
     
    387421
    388422        while (!downloader.IsFinished) {
    389           hiveExperiment.Progress.ProgressValue = downloader.FinishedCount / (double)totalJobCount;
    390           hiveExperiment.Progress.Status = string.Format("Downloading/deserializing jobs... ({0}/{1} finished)", downloader.FinishedCount, totalJobCount);
     423          refreshableHiveExperiment.Progress.ProgressValue = downloader.FinishedCount / (double)totalJobCount;
     424          refreshableHiveExperiment.Progress.Status = string.Format("Downloading/deserializing jobs... ({0}/{1} finished)", downloader.FinishedCount, totalJobCount);
    391425          Thread.Sleep(500);
    392426
     
    397431        IDictionary<Guid, HiveJob> allHiveJobs = downloader.Results;
    398432
    399         hiveExperiment.HiveJobs = new ItemCollection<HiveJob>(allHiveJobs.Values.Where(x => !x.Job.ParentJobId.HasValue));
    400 
    401         if (hiveExperiment.IsFinished()) {
    402           hiveExperiment.ExecutionState = Core.ExecutionState.Stopped;
     433        refreshableHiveExperiment.HiveJobs = new ItemCollection<HiveJob>(allHiveJobs.Values.Where(x => !x.Job.ParentJobId.HasValue));
     434
     435        if (refreshableHiveExperiment.IsFinished()) {
     436          refreshableHiveExperiment.ExecutionState = Core.ExecutionState.Stopped;
    403437        } else {
    404           hiveExperiment.ExecutionState = Core.ExecutionState.Started;
     438          refreshableHiveExperiment.ExecutionState = Core.ExecutionState.Started;
    405439        }
    406440
    407441        // build child-job tree
    408         foreach (HiveJob hiveJob in hiveExperiment.HiveJobs) {
     442        foreach (HiveJob hiveJob in refreshableHiveExperiment.HiveJobs) {
    409443          BuildHiveJobTree(hiveJob, allJobs, allHiveJobs);
    410444        }
    411445
    412         hiveExperiment.OnLoaded();
     446        refreshableHiveExperiment.OnLoaded();
    413447      }
    414448      finally {
    415         hiveExperiment.IsProgressing = false;
     449        refreshableHiveExperiment.IsProgressing = false;
    416450      }
    417451    }
Note: See TracChangeset for help on using the changeset viewer.