Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/01/11 15:51:11 (13 years ago)
Author:
cneumuel
Message:

#1233

  • changed the workflow of aquireing a new job from server.
    • if a job is available for calculation, the slave receives the jobId already with the heartbeats. The job is then exclusively assigned to this slave.
  • extended the metainfo for a slave by OperatingSystem and CpuArchitecture
  • enhanced the way plugin-dependencies are discovered by using the types used by XmlGenerator. Now only mimimum amount of plugins are transferred.
  • selection of waiting jobs now consideres assigned slave-group
  • more unit tests for service
  • added unit tests for experiment manager
File:
1 edited

Legend:

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

    r5156 r5404  
    2828using HeuristicLab.Services.Hive.Common.ServiceContracts;
    2929using Microsoft.VisualStudio.TestTools.UnitTesting;
     30using System.Threading;
     31using HeuristicLab.Hive;
     32using HeuristicLab.Services.Hive.Common;
    3033
    3134namespace HeuristicLab.Services.Hive.Tests {
    32   using System.Threading;
    33   using HeuristicLab.Hive;
    34   using HeuristicLab.Services.Hive.Common;
     35
    3536  using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
     37  using System.Diagnostics;
    3638
    3739  [TestClass]
     
    6668        Data = PersistenceUtil.Serialize(new MockJob(500, true))
    6769      };
     70
     71      DT.Plugin plugin1 = new DT.Plugin();
     72      plugin1.Name = "Tests.MyPlugin";
     73      plugin1.Version = new Version("1.0.0.0");
     74      plugin1.UserId = Guid.Empty;
     75      plugin1.IsLocal = true;
     76      plugin1.DateCreated = DateTime.Now;
     77
     78      DT.PluginData pluginData1 = new DT.PluginData();
     79      pluginData1.PluginId = plugin1.Id;
     80      pluginData1.FileName = "Tests.MyPlugin-1.0.dll";
     81      pluginData1.Data = new byte[] { 0, 1, 2, 3, 4, 5 };
     82
     83      job.PluginsNeededIds.Add(plugin1.Id);
    6884
    6985      job.Id = service.AddJob(job, jobData, null);
     
    7793      Assert.AreEqual(JobState.Waiting, jobLoaded.JobState);
    7894      Assert.AreEqual(ServiceLocator.Instance.AuthorizationManager.UserId, job.UserId);
     95      Assert.IsTrue(job.PluginsNeededIds.SequenceEqual(jobLoaded.PluginsNeededIds));
    7996
    8097      DT.JobData jobDataLoaded = service.GetJobData(job.Id);
     
    101118    public void TestHeartbeats() {
    102119      var service = GetLocalService();
     120      // check if group already exists and delete
     121      var existingSlaveGroup = service.GetSlaveGroups().SingleOrDefault(g => g.Name == "TestGroup");
     122      if (existingSlaveGroup != null) {
     123        var slavesToDelete = service.GetSlaves().Where(s => s.ParentResourceId == existingSlaveGroup.Id);
     124        foreach (var slave in slavesToDelete) service.DeleteSlave(slave.Id);
     125        service.DeleteSlaveGroup(existingSlaveGroup.Id);
     126      }
     127
    103128      Guid groupId = service.AddSlaveGroup(new SlaveGroup() { Name = "TestGroup", Description = "Used for unit tests" });
    104129
    105       for (int i = 0; i < 2; i++) {
    106         Job job = new Job() {
    107           CoresNeeded = 1, MemoryNeeded = 0
    108         };
    109         JobData jobData = new JobData() { Data = PersistenceUtil.Serialize(new MockJob(500, false)) };
    110         job.Id = service.AddJob(job, jobData, null);
    111         jobs.Add(job);
    112       }
    113 
     130      // create slaves
    114131      var slaves = new List<DT.Slave>();
    115132      for (int i = 0; i < 1; i++) {
     
    124141          FreeMemory = 3000
    125142        };
     143        // check if slave with this name already exists and delete
     144        var existingSlave = service.GetSlaves().Where(s => s.Name == slave.Name).SingleOrDefault();
     145        if (existingSlave != null) service.DeleteSlave(existingSlave.Id);
     146
    126147        slave.Id = service.AddSlave(slave);
    127148        service.AddResourceToGroup(groupId, slave.Id);
     
    129150      }
    130151
     152      // create jobs with different group, they should not be assigned
     153      existingSlaveGroup = service.GetSlaveGroups().SingleOrDefault(g => g.Name == "DummyGroup");
     154      if (existingSlaveGroup != null) service.DeleteSlaveGroup(existingSlaveGroup.Id);
     155
     156      Guid dummyGroupId = service.AddSlaveGroup(new SlaveGroup() { Name = "DummyGroup", Description = "Used for unit tests; jobs from this group shall not be calculated" });
     157      // create dummy jobs
     158      var dummyJobs = new List<Job>();
     159      for (int i = 0; i < 2; i++) {
     160        Job job = new Job() {
     161          CoresNeeded = 1, MemoryNeeded = 0
     162        };
     163        JobData jobData = new JobData() { Data = PersistenceUtil.Serialize(new MockJob(500, false)) };
     164        job.Id = service.AddJob(job, jobData, new List<Guid> { dummyGroupId });
     165        dummyJobs.Add(job);
     166      }
     167
     168      // create jobs
     169      for (int i = 0; i < 2; i++) {
     170        Job job = new Job() {
     171          CoresNeeded = 1, MemoryNeeded = 0
     172        };
     173        JobData jobData = new JobData() { Data = PersistenceUtil.Serialize(new MockJob(500, false)) };
     174        job.Id = service.AddJob(job, jobData, new List<Guid> { groupId });
     175        jobs.Add(job);
     176      }
     177
     178      // send heartbeats
    131179      foreach (var slave in slaves) {
    132180        new Thread(new ParameterizedThreadStart(RunSlaveThread)).Start(slave);
    133181      }
    134182
    135       // send heartbeats
    136183      IEnumerable<LightweightJob> lightweightJobs;
    137184      do {
     
    146193      }
    147194
    148       // delete group
     195      // delete groups
    149196      service.DeleteSlaveGroup(groupId);
     197      service.DeleteSlaveGroup(dummyGroupId);
    150198
    151199      // delete jobs
    152200      foreach (var job in jobs) {
     201        service.DeleteJob(job.Id);
     202      }
     203
     204      // delete dummy jobs
     205      foreach (var job in dummyJobs) {
    153206        service.DeleteJob(job.Id);
    154207      }
     
    161214        int freeCores = slave.Cores.Value;
    162215
    163         var messages = service.Heartbeat(new Heartbeat() { SlaveId = slave.Id, FreeMemory = 2423, FreeCores = freeCores, JobProgress = new Dictionary<Guid, TimeSpan>() });
    164         if (messages.Count == 0)
    165           return; // no more jobs
    166 
    167         Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.AbortJob).Count() == 0);
    168         Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.SayHello).Count() == 0);
    169         Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.PauseJob).Count() == 0);
    170 
    171         if (messages.Where(x => x.Message == MessageContainer.MessageType.AquireJob).Count() > 0) {
    172           Guid jobId = messages.Where(x => x.Message == MessageContainer.MessageType.AquireJob).SingleOrDefault().JobId;
    173           service.AquireJob(jobId);
    174           Job job = service.GetJob(jobId);
    175           JobData jobData = service.GetJobData(jobId);
    176           IJob deserializedJob = PersistenceUtil.Deserialize<IJob>(jobData.Data);
    177           deserializedJob.Start();
    178           job.JobState = JobState.Finished;
    179           jobs.Where(x => x.Id == jobId).Single().JobState = JobState.Finished;
    180           jobData.Data = PersistenceUtil.Serialize(deserializedJob);
    181           service.UpdateJob(job, jobData);
     216        for (int i = 0; i < 10; i++) {
     217
     218          var messages = service.Heartbeat(new Heartbeat() { SlaveId = slave.Id, FreeMemory = 2423, FreeCores = freeCores, JobProgress = new Dictionary<Guid, TimeSpan>() });
     219          if (messages.Count == 0) {
     220            Debug.WriteLine("No job available");
     221            return; // no more jobs
     222          }
     223
     224          Debug.WriteLine("Messages: {0}", string.Join(", ", messages.Select(m => m.Message)));
     225
     226          Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.AbortJob).Count() == 0);
     227          Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.SayHello).Count() == 0);
     228          Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.PauseJob).Count() == 0);
     229
     230          var calculateJobMessage = messages.Where(x => x.Message == MessageContainer.MessageType.CalculateJob).SingleOrDefault();
     231          if (calculateJobMessage != null) {
     232            if (!jobs.Select(j => j.Id).Contains(calculateJobMessage.JobId))
     233              Assert.Fail("Got job which was not assigned to the slavegroup");
     234
     235            Debug.WriteLine("Job available, calculating");
     236            Job job = service.GetJob(calculateJobMessage.JobId);
     237
     238            JobData jobData = service.GetJobData(job.Id);
     239            IJob deserializedJob = PersistenceUtil.Deserialize<IJob>(jobData.Data);
     240            deserializedJob.Start();
     241            job.JobState = JobState.Finished;
     242            jobs.Where(x => x.Id == job.Id).Single().JobState = JobState.Finished;
     243            jobData.Data = PersistenceUtil.Serialize(deserializedJob);
     244            service.UpdateJob(job, jobData);
     245            Debug.WriteLine("finished calculating");
     246          }
    182247        }
    183248      }
Note: See TracChangeset for help on using the changeset viewer.