From 256b1313b27e64ba507783b0f37f6e6f4bc0c3a3 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 10 Sep 2015 22:45:29 +0100 Subject: [PATCH] Added control over standalone environment creation without affecting shell state. Setting the shell state to "Running" just to create the correct work context scope works, but in theory, requests could come in and be served from a "running" shell while the setup recipe is still being executed. --- .../Orchard.Setup/Services/SetupService.cs | 9 ++------ src/Orchard/Commands/CommandHostAgent.cs | 22 ++++++++---------- src/Orchard/Environment/DefaultOrchardHost.cs | 23 +++++++++---------- src/Orchard/Environment/IOrchardHost.cs | 2 +- .../StandaloneEnvironmentOptions.cs | 7 ++++++ src/Orchard/Orchard.Framework.csproj | 1 + 6 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 src/Orchard/Environment/StandaloneEnvironmentOptions.cs diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs index 5d91a9faf..94bf7d83a 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs @@ -164,10 +164,7 @@ namespace Orchard.Setup.Services { // Creating a standalone environment. // in theory this environment can be used to resolve any normal components by interface, and those // components will exist entirely in isolation - no crossover between the safemode container currently in effect. - - // Set shell state to "Running" so that the proper shell context is created. - shellSettings.State = TenantState.Running; - using (var environment = _orchardHost.CreateStandaloneEnvironment(shellSettings)) { + using (var environment = _orchardHost.CreateStandaloneEnvironment(shellSettings, StandaloneEnvironmentOptions.RunningEnvironment)) { try { executionId = CreateTenantData(context, environment); } @@ -176,9 +173,7 @@ namespace Orchard.Setup.Services { throw; } } - - // Reset shell state to "Initializing" so that subsequent HTTP requests are responded to with "Service Unavailable" while Orchard is setting up. - shellSettings.State = _shellSettings.State = TenantState.Initializing; + _shellSettingsManager.SaveSettings(shellSettings); return executionId; diff --git a/src/Orchard/Commands/CommandHostAgent.cs b/src/Orchard/Commands/CommandHostAgent.cs index 6c7a955aa..3aa473751 100644 --- a/src/Orchard/Commands/CommandHostAgent.cs +++ b/src/Orchard/Commands/CommandHostAgent.cs @@ -184,13 +184,12 @@ namespace Orchard.Commands { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] private IContainer CreateHostContainer() { var hostContainer = OrchardStarter.CreateHostContainer(ContainerRegistrations); - var host = hostContainer.Resolve(); + host.Initialize(); return hostContainer; } - private IWorkContextScope CreateStandaloneEnvironment(string tenant) { var host = _hostContainer.Resolve(); var tenantManager = _hostContainer.Resolve(); @@ -207,13 +206,12 @@ namespace Orchard.Commands { return env; } else { - // In case of an unitiliazed site (no default settings yet), we create a default settings instance. + // In case of an uninitialized site (no default settings yet), we create a default settings instance. var settings = new ShellSettings { Name = ShellSettings.DefaultName, State = TenantState.Uninitialized }; return host.CreateStandaloneEnvironment(settings); } } - protected void ContainerRegistrations(ContainerBuilder builder) { MvcSingletons(builder); @@ -225,14 +223,14 @@ namespace Orchard.Commands { private CommandHostShellContainerRegistrations CreateShellRegistrations() { return new CommandHostShellContainerRegistrations { Registrations = shellBuilder => { - shellBuilder.RegisterType() - .As() - .As() - .InstancePerMatchingLifetimeScope("shell"); - shellBuilder.RegisterType() - .As() - .InstancePerLifetimeScope(); - } + shellBuilder.RegisterType() + .As() + .As() + .InstancePerMatchingLifetimeScope("shell"); + shellBuilder.RegisterType() + .As() + .InstancePerLifetimeScope(); + } }; } diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index 46e5bf97a..3dd4ad23c 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -90,13 +90,13 @@ namespace Orchard.Environment { EndRequest(); } - IWorkContextScope IOrchardHost.CreateStandaloneEnvironment(ShellSettings shellSettings) { + IWorkContextScope IOrchardHost.CreateStandaloneEnvironment(ShellSettings shellSettings, StandaloneEnvironmentOptions options) { Logger.Debug("Creating standalone environment for tenant {0}", shellSettings.Name); MonitorExtensions(); BuildCurrent(); - var shellContext = CreateShellContext(shellSettings); + var shellContext = CreateShellContext(shellSettings, options); var workContext = shellContext.LifetimeScope.CreateWorkContextScope(); return new StandaloneEnvironmentWorkContextScopeWrapper(workContext, shellContext); } @@ -141,7 +141,7 @@ namespace Orchard.Environment { if (allSettings.Any()) { Parallel.ForEach(allSettings, settings => { try { - var context = CreateShellContext(settings); + var context = CreateShellContext(settings, StandaloneEnvironmentOptions.None); ActivateShell(context); } catch (Exception e) { @@ -190,15 +190,14 @@ namespace Orchard.Environment { /// /// Creates a shell context based on shell settings. /// - private ShellContext CreateShellContext(ShellSettings settings) { - switch (settings.State) { - case TenantState.Uninitialized: - Logger.Debug("Creating shell context for tenant {0} setup.", settings.Name); - return _shellContextFactory.CreateSetupContext(settings); - default: - Logger.Debug("Creating shell context for tenant {0}.", settings.Name); - return _shellContextFactory.CreateShellContext(settings); + private ShellContext CreateShellContext(ShellSettings settings, StandaloneEnvironmentOptions options) { + if (settings.State != TenantState.Uninitialized || options.Running) { + Logger.Debug("Creating shell context for tenant {0}.", settings.Name); + return _shellContextFactory.CreateShellContext(settings); } + + Logger.Debug("Creating shell context for tenant {0} setup.", settings.Name); + return _shellContextFactory.CreateSetupContext(settings); } private void SetupExtensions() { @@ -285,7 +284,7 @@ namespace Orchard.Environment { // is this is a new tenant ? or is it a tenant waiting for setup ? if (shellContext == null || settings.State == TenantState.Uninitialized) { // create the Shell - var context = CreateShellContext(settings); + var context = CreateShellContext(settings, StandaloneEnvironmentOptions.None); // activate the Shell ActivateShell(context); diff --git a/src/Orchard/Environment/IOrchardHost.cs b/src/Orchard/Environment/IOrchardHost.cs index aee8940e2..6d43af029 100644 --- a/src/Orchard/Environment/IOrchardHost.cs +++ b/src/Orchard/Environment/IOrchardHost.cs @@ -31,6 +31,6 @@ namespace Orchard.Environment { /// Can be used to build an temporary self-contained instance of a shell's configured code. /// Services may be resolved from within this instance to configure and initialize its storage. /// - IWorkContextScope CreateStandaloneEnvironment(ShellSettings shellSettings); + IWorkContextScope CreateStandaloneEnvironment(ShellSettings shellSettings, StandaloneEnvironmentOptions options = null); } } diff --git a/src/Orchard/Environment/StandaloneEnvironmentOptions.cs b/src/Orchard/Environment/StandaloneEnvironmentOptions.cs new file mode 100644 index 000000000..71f075dd1 --- /dev/null +++ b/src/Orchard/Environment/StandaloneEnvironmentOptions.cs @@ -0,0 +1,7 @@ +namespace Orchard.Environment { + public class StandaloneEnvironmentOptions { + public static readonly StandaloneEnvironmentOptions None = new StandaloneEnvironmentOptions(); + public static readonly StandaloneEnvironmentOptions RunningEnvironment = new StandaloneEnvironmentOptions {Running = true}; + public bool Running { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index f47c1dafd..1bf807962 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -155,6 +155,7 @@ +