Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/03/10 17:20:46 (14 years ago)
Author:
kgrading
Message:

#828 added various improvements to the plugin cache manager, the execution engine, the transaction handling on the serverside and the server console

File:
1 edited

Legend:

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

    r4042 r4140  
    22using System.Collections.Generic;
    33using System.Linq;
     4using System.Runtime.CompilerServices;
    45using System.Text;
    56using HeuristicLab.PluginInfrastructure;
     
    910using HeuristicLab.Tracing;
    1011using System.IO;
     12using HeuristicLab.PluginInfrastructure.Manager;
    1113
    1214namespace HeuristicLab.Hive.Client.Core {
     15
     16 
     17
    1318  public class PluginCache {
    1419
    1520    private static PluginCache instance = null;
     21
     22    public const string PLUGIN_REPO = @"plugins\";
     23
     24    private List<PluginDescription> cachedPlugins = new List<PluginDescription>();
     25
     26    private PluginManager pm = new PluginManager(PLUGIN_REPO);
     27 
    1628    public static PluginCache Instance {
    1729      get {
     
    2234    }
    2335   
    24     private List<CachedHivePluginInfoDto> pluginCache;
    25    
    2636
    27     public PluginCache() {
    28       pluginCache = new List<CachedHivePluginInfoDto>();
    29     }
    30    
    31     public void AddPlugin(CachedHivePluginInfoDto plugin) {
    32       pluginCache.Add(plugin);   
     37    public PluginCache() {     
     38      DoUpdateRun();
    3339    }
    3440
    35     public List<CachedHivePluginInfoDto> GetPlugins(List<HivePluginInfoDto> requests) {
     41    private void DoUpdateRun() {
     42      pm.DiscoverAndCheckPlugins();
     43      cachedPlugins = new List<PluginDescription>(pm.Plugins);
     44    }
     45
     46
     47    [MethodImpl(MethodImplOptions.Synchronized)]
     48    public bool CopyPluginsForJob(List<HivePluginInfoDto> requests, Guid jobId) {
     49
     50      String targetDir = PLUGIN_REPO + jobId.ToString() + "\\";
     51
     52      if(Directory.Exists(targetDir)) {
     53        Directory.Delete(targetDir, true);
     54      }
     55
     56      DirectoryInfo di = Directory.CreateDirectory(targetDir);
     57
     58      foreach (HivePluginInfoDto requestedPlugin in requests) {
     59        PluginDescription pd =
     60          cachedPlugins.Where(
     61            cp =>
     62            cp.Name == requestedPlugin.Name &&
     63            cp.Version.Major == requestedPlugin.Version.Major &&
     64            cp.Version.Minor == requestedPlugin.Version.Minor &&
     65            cp.Version.Revision >= requestedPlugin.Version.Revision).
     66            SingleOrDefault();
     67        if (pd == null) {
     68          return false;
     69        }
     70
     71        foreach(IPluginFile ipf in pd.Files) {
     72          File.Copy(ipf.Name, targetDir + ipf.Name.Split('\\').Last());
     73        }
     74      }
     75      return true;                                                                                                       
     76    }
     77
     78    [MethodImpl(MethodImplOptions.Synchronized)]
     79    internal void PreparePlugins(List<HivePluginInfoDto> requiredPlugins) {
    3680      Logger.Debug("Fetching plugins for job");
    37       List<CachedHivePluginInfoDto> neededPlugins = new List<CachedHivePluginInfoDto>();
     81      List<HivePluginInfoDto> localPlugins = new List<HivePluginInfoDto>();
     82      List<HivePluginInfoDto> neededPlugins = new List<HivePluginInfoDto>();
    3883      List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>();
    3984      bool found = false;
    40            
    41       foreach (HivePluginInfoDto info in requests) {
     85
     86      foreach (HivePluginInfoDto info in requiredPlugins) {
    4287        //we MAY run in problems here - if there is a plugin twice in requests, there may be added two different versions of the plugin
    43         foreach (CachedHivePluginInfoDto cache in pluginCache) {
    44           if (info.Name.Equals(cache.Name) && info.Version.Equals(cache.Version) && info.BuildDate <= cache.BuildDate) {
     88        foreach (PluginDescription cachedPlugin in cachedPlugins) {
     89          if (info.Name.Equals(cachedPlugin.Name)) {
    4590            Logger.Debug("Found plugin " + info.Name + ", " + info.Version);
    46             neededPlugins.Add(cache);
     91            localPlugins.Add(new HivePluginInfoDto() { BuildDate = DateTime.Now, Id = new Guid(), Name = info.Name, Version = info.Version, Update =  true});
     92            neededPlugins.Add(info);
    4793            found = true;
     94
    4895            break;
    4996          }
    5097        }
    51         if (!found)
    52           Logger.Debug("Found NOT found " + info.Name + ", " + info.Version);
     98        if (!found) {
     99          Logger.Debug("Plugin NOT found " + info.Name + ", " + info.Version);
    53100          missingPlugins.Add(info);
     101        }
    54102        found = false;
    55103      }
    56104
    57       Logger.Debug("Requesting missing plugins");
    58       List<CachedHivePluginInfoDto> receivedPlugins = WcfService.Instance.RequestPlugins(missingPlugins);
    59       Logger.Debug("Requested missing plugins");
     105      Logger.Debug("First run - Update the plugins in the cache");
    60106
    61       if (receivedPlugins != null) {
    62         neededPlugins.AddRange(receivedPlugins);
    63         pluginCache.AddRange(receivedPlugins);
    64       } else
    65         Logger.Error("Fetching of the plugins failed!");
     107      localPlugins.AddRange(missingPlugins);
    66108
    67       return neededPlugins;
     109      List<CachedHivePluginInfoDto> updateablePlugins = WcfService.Instance.RequestPlugins(localPlugins);     
     110
     111      foreach (CachedHivePluginInfoDto updateablePlugin in updateablePlugins) {
     112        PluginDescription pd =
     113          cachedPlugins.Where(cachedPlugin => cachedPlugin.Name.Equals(updateablePlugin.Name)).SingleOrDefault();
     114
     115        if (pd != null) {
     116          Logger.Debug("deleting old files");
     117          foreach (IPluginFile ipf in pd.Files) {
     118            File.Delete(ipf.Name);
     119          }
     120        }
     121
     122        Logger.Debug("deleted old files");
     123        Logger.Debug("creating new files");
     124
     125       
     126
     127        foreach (HivePluginFile pf in updateablePlugin.PluginFiles) {
     128          File.WriteAllBytes(PLUGIN_REPO + pf.Name.Split('\\').Last(), pf.BinaryFile);
     129        }
     130
     131        Logger.Debug("created new files");
     132        DoUpdateRun();
     133      }
    68134    }
    69135
    70 
    71     internal void PreparePlugins(List<HivePluginInfoDto> requiredPlugins) {
    72       List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>();
    73       foreach (HivePluginInfoDto requiredPlugin in requiredPlugins) {
    74         if(ApplicationManager.Manager.Plugins.Count(ipd => ipd.Version.Major == requiredPlugin.Version.Major && ipd.Version.Minor >= requiredPlugin.Version.Minor) == 0) {
    75           missingPlugins.Add(requiredPlugin);             
    76         }
     136    internal void DeletePluginsForJob(Guid id) {
     137      try {
     138        Logger.Debug("unloading...");
     139        Directory.Delete(Path.Combine(PLUGIN_REPO, id.ToString()), true);
     140      } catch (Exception ex) {
     141        Logger.Debug("failed while unloading " + id + " with exception " + ex);
    77142      }
    78 
    79       Logger.Debug("Requesting missing plugins");
    80       List<CachedHivePluginInfoDto> receivedPlugins = WcfService.Instance.RequestPlugins(missingPlugins);
    81       Logger.Debug("Requested missing plugins");
    82 
    83       foreach (CachedHivePluginInfoDto receivedPlugin in receivedPlugins) {
    84         foreach (HivePluginFile hpf in receivedPlugin.PluginFiles) {
    85           Logger.Info("writing file " + hpf.Name);
    86           File.WriteAllBytes("C:\\temp\\" + hpf.Name.Split('\\').Last(), hpf.BinaryFile);
    87         }       
    88       }
    89 
    90143    }
    91144  }
Note: See TracChangeset for help on using the changeset viewer.