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
This commit is contained in:
Renaud Paquay
2011-05-30 17:37:51 -07:00
parent 750493c447
commit 1c16b10aa0
3 changed files with 28 additions and 3 deletions

View File

@@ -41,11 +41,16 @@ namespace Orchard.Environment.Extensions {
}
public IEnumerable<ExtensionDescriptor> 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<FeatureDescriptor> AvailableFeatures() {
return _cacheManager.Get("...", ctx =>
return _cacheManager.Get("AvailableFeatures", ctx =>
AvailableExtensions().SelectMany(ext => ext.Features).OrderByDependenciesAndPriorities(HasDependency, GetPriority).ToReadOnlyCollection());
}

View File

@@ -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<string> _paths;
private readonly IExtensionHarvester _extensionHarvester;
public CoreModuleFolders(IEnumerable<string> paths, IExtensionHarvester extensionHarvester) {
_paths = paths;
_extensionHarvester = extensionHarvester;
}
public IEnumerable<ExtensionDescriptor> AvailableExtensions() {
return _extensionHarvester.HarvestExtensions(_paths, DefaultExtensionTypes.Module, "Module.txt", false/*isManifestOptional*/);
}
}
}

View File

@@ -84,7 +84,9 @@ namespace Orchard.Environment {
{
builder.RegisterType<ExtensionHarvester>().As<IExtensionHarvester>().SingleInstance();
builder.RegisterType<ModuleFolders>().As<IExtensionFolders>().SingleInstance()
.WithParameter(new NamedParameter("paths", new[] { "~/Core", "~/Modules" }));
.WithParameter(new NamedParameter("paths", new[] { "~/Modules" }));
builder.RegisterType<CoreModuleFolders>().As<IExtensionFolders>().SingleInstance()
.WithParameter(new NamedParameter("paths", new[] { "~/Core" }));
builder.RegisterType<ThemeFolders>().As<IExtensionFolders>().SingleInstance()
.WithParameter(new NamedParameter("paths", new[] { "~/Themes" }));