From 1c16b10aa049ee3b0b85a60167d3f61d20495083 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Mon, 30 May 2011 17:37:51 -0700 Subject: [PATCH] Run extension harvesting code in parallel task Extension harvesting is a mix of independent operations requiring file i/o and cpu usage, so they are good candidate for parellelization. Also make module harvesting in ~/Core a separate folder instance. --HG-- branch : 1.x --- .../Environment/Extensions/ExtensionManager.cs | 9 +++++++-- .../Extensions/Folders/CoreModuleFolders.cs | 18 ++++++++++++++++++ src/Orchard/Environment/OrchardStarter.cs | 4 +++- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/Orchard/Environment/Extensions/Folders/CoreModuleFolders.cs diff --git a/src/Orchard/Environment/Extensions/ExtensionManager.cs b/src/Orchard/Environment/Extensions/ExtensionManager.cs index d16c0b8f6..28b8b60af 100644 --- a/src/Orchard/Environment/Extensions/ExtensionManager.cs +++ b/src/Orchard/Environment/Extensions/ExtensionManager.cs @@ -41,11 +41,16 @@ namespace Orchard.Environment.Extensions { } public IEnumerable AvailableExtensions() { - return _folders.SelectMany(folder => folder.AvailableExtensions()); + return _cacheManager.Get("AvailableExtensions", ctx => + _folders + .AsParallel() // Execute in parallel for each folder + .SelectMany(folder => folder.AvailableExtensions()) + .ToList() // Force execution inside the cache entry + ); } public IEnumerable AvailableFeatures() { - return _cacheManager.Get("...", ctx => + return _cacheManager.Get("AvailableFeatures", ctx => AvailableExtensions().SelectMany(ext => ext.Features).OrderByDependenciesAndPriorities(HasDependency, GetPriority).ToReadOnlyCollection()); } diff --git a/src/Orchard/Environment/Extensions/Folders/CoreModuleFolders.cs b/src/Orchard/Environment/Extensions/Folders/CoreModuleFolders.cs new file mode 100644 index 000000000..8ad897916 --- /dev/null +++ b/src/Orchard/Environment/Extensions/Folders/CoreModuleFolders.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using Orchard.Environment.Extensions.Models; + +namespace Orchard.Environment.Extensions.Folders { + public class CoreModuleFolders : IExtensionFolders { + private readonly IEnumerable _paths; + private readonly IExtensionHarvester _extensionHarvester; + + public CoreModuleFolders(IEnumerable paths, IExtensionHarvester extensionHarvester) { + _paths = paths; + _extensionHarvester = extensionHarvester; + } + + public IEnumerable AvailableExtensions() { + return _extensionHarvester.HarvestExtensions(_paths, DefaultExtensionTypes.Module, "Module.txt", false/*isManifestOptional*/); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index 46b6d7ab1..12e3ec101 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -84,7 +84,9 @@ namespace Orchard.Environment { { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance() - .WithParameter(new NamedParameter("paths", new[] { "~/Core", "~/Modules" })); + .WithParameter(new NamedParameter("paths", new[] { "~/Modules" })); + builder.RegisterType().As().SingleInstance() + .WithParameter(new NamedParameter("paths", new[] { "~/Core" })); builder.RegisterType().As().SingleInstance() .WithParameter(new NamedParameter("paths", new[] { "~/Themes" }));