Changeset 1830


Ignore:
Timestamp:
05/15/09 14:25:36 (12 years ago)
Author:
kgrading
Message:

removed handle on appdomains before unloading, made the whole core more stable for concurrency errors (#467)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs

    r1812 r1830  
    114114        //Server requests to abort a job
    115115        case MessageContainer.MessageType.AbortJob:
    116           engines[container.JobId].Abort();
     116          if(engines.ContainsKey(container.JobId))
     117            engines[container.JobId].Abort();
     118          else
     119            Logging.Instance.Error(this.ToString(), "AbortJob: Engine doesn't exist");
    117120          break;
    118121        //Job has been successfully aborted
     
    120123          //todo: thread this
    121124          Debug.WriteLine("Job aborted, he's dead");
    122           lock (engines) {
    123             AppDomain.Unload(appDomains[container.JobId]);
    124             appDomains.Remove(container.JobId);
    125             engines.Remove(container.JobId);
    126             jobs.Remove(container.JobId);
     125          lock (engines) {           
     126            Guid jobId = new Guid(container.JobId.ToString());
     127            if(engines.ContainsKey(jobId)) {
     128              appDomains[jobId].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
     129              AppDomain.Unload(appDomains[jobId]);
     130              appDomains.Remove(jobId);
     131              engines.Remove(jobId);
     132              jobs.Remove(jobId);
     133              GC.Collect();
     134            } else
     135              Logging.Instance.Error(this.ToString(), "JobAbort: Engine doesn't exist");
    127136          }
    128137          break;
    129138        //Request a Snapshot from the Execution Engine
    130139        case MessageContainer.MessageType.RequestSnapshot:
    131           engines[container.JobId].RequestSnapshot();
     140          if (engines.ContainsKey(container.JobId))
     141            engines[container.JobId].RequestSnapshot();
     142          else
     143            Logging.Instance.Error(this.ToString(), "RequestSnapshot: Engine doesn't exist");
    132144          break;
    133145        //Snapshot is ready and can be sent back to the Server
     
    149161        case MessageContainer.MessageType.Shutdown:
    150162          lock (engines) {
    151             foreach (KeyValuePair<Guid, AppDomain> kvp in appDomains)
     163            foreach (KeyValuePair<Guid, AppDomain> kvp in appDomains) {
     164              appDomains[kvp.Key].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
    152165              AppDomain.Unload(kvp.Value);
     166            }
    153167          }
    154168          abortRequested = true;
     
    165179      Guid jId = (Guid)jobId;     
    166180      try {
     181        if (!engines.ContainsKey(jId)) {
     182          Logging.Instance.Error(this.ToString(), "GetFinishedJob: Engine doesn't exist");
     183          return;
     184        }
     185       
    167186        byte[] sJob = engines[jId].GetFinishedJob();
    168187
     
    174193            null,
    175194            true);
    176         } else {         
     195        } else {
    177196          JobStorageManager.PersistObjectToDisc(wcfService.ServerIP, wcfService.ServerPort, jId, sJob);
    178197          lock (engines) {
     198            appDomains[jId].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
    179199            AppDomain.Unload(appDomains[jId]);
    180200            appDomains.Remove(jId);
     
    248268      lock(engines) {
    249269        try {
     270          appDomains[e.Result.JobId].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
    250271          AppDomain.Unload(appDomains[e.Result.JobId]);
    251272          appDomains.Remove(e.Result.JobId);
     
    278299      Logging.Instance.Info(this.ToString(), "ServerChanged has been called");
    279300      lock (engines) {
    280         foreach (KeyValuePair<Guid, AppDomain> entries in appDomains)
     301        foreach (KeyValuePair<Guid, AppDomain> entries in appDomains) {
     302          appDomains[entries.Key].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
    281303          AppDomain.Unload(appDomains[entries.Key]);
     304        }
    282305        appDomains = new Dictionary<Guid, AppDomain>();
    283306        engines = new Dictionary<Guid, Executor>();
Note: See TracChangeset for help on using the changeset viewer.