From b977b58d096537cc07bed1c5cf3ce9080d2ac92d Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Mon, 15 Nov 2021 12:11:58 -0800 Subject: [PATCH 1/8] patch fix --- .../src/HostFactoryResolver.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs index d860312da271cf..2e3843b278ede9 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs @@ -22,7 +22,7 @@ internal sealed class HostFactoryResolver public const string CreateHostBuilder = nameof(CreateHostBuilder); // The amount of time we wait for the diagnostic source events to fire - private static readonly TimeSpan s_defaultWaitTimeout = Debugger.IsAttached ? Timeout.InfiniteTimeSpan : TimeSpan.FromSeconds(5); + private static readonly TimeSpan s_defaultWaitTimeout = Debugger.IsAttached ? Timeout.InfiniteTimeSpan : TimeSpan.FromMinutes(1); public static Func? ResolveWebHostFactory(Assembly assembly) { From 7535772c3c6df6a018e3b69ec656a426f6dca579 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Mon, 15 Nov 2021 15:16:10 -0800 Subject: [PATCH 2/8] improve messaging --- .../src/HostFactoryResolver.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs index 2e3843b278ede9..becb1bc39824d3 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs @@ -229,7 +229,7 @@ public object CreateHost() // Try to set an exception if the entry point returns gracefully, this will force // build to throw - _hostTcs.TrySetException(new InvalidOperationException("Unable to build IHost")); + _hostTcs.TrySetException(new InvalidOperationException("The entry point exited without ever building an IHost.")); } catch (TargetInvocationException tie) when (tie.InnerException is StopTheHostException) { @@ -268,7 +268,7 @@ public object CreateHost() // Wait before throwing an exception if (!_hostTcs.Task.Wait(_waitTimeout)) { - throw new InvalidOperationException("Unable to build IHost"); + throw new InvalidOperationException($"Timed out waiting for the entry point to build the IHost after {s_defaultWaitTimeout}."); } } catch (AggregateException) when (_hostTcs.Task.IsCompleted) From 5c4a8c9064ec394324543c79c53e8d56b9e1e2e6 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Mon, 15 Nov 2021 16:31:53 -0800 Subject: [PATCH 3/8] Adds env var options for setting timeout --- .../src/HostFactoryResolver.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs index becb1bc39824d3..ad412650a876df 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs @@ -20,9 +20,25 @@ internal sealed class HostFactoryResolver public const string BuildWebHost = nameof(BuildWebHost); public const string CreateWebHostBuilder = nameof(CreateWebHostBuilder); public const string CreateHostBuilder = nameof(CreateHostBuilder); + private const string TimeoutEnvironmentKey = "DOTNET_HOST_FACTORY_RESOLVER_DEFAULT_TIMEOUT_IN_SECONDS"; // The amount of time we wait for the diagnostic source events to fire - private static readonly TimeSpan s_defaultWaitTimeout = Debugger.IsAttached ? Timeout.InfiniteTimeSpan : TimeSpan.FromMinutes(1); + private static readonly TimeSpan s_defaultWaitTimeout = SetupDefaultTimout(); + + private static TimeSpan SetupDefaultTimout() + { + if (Debugger.IsAttached) + { + return Timeout.InfiniteTimeSpan; + } + + if (uint.TryParse(Environment.GetEnvironmentVariable(TimeoutEnvironmentKey), out uint timeoutInSeconds)) + { + return TimeSpan.FromSeconds((int)timeoutInSeconds); + } + + return TimeSpan.FromSeconds(30); + } public static Func? ResolveWebHostFactory(Assembly assembly) { From 26d3bb87fcfd30114dc40bf450a3583447d46931 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Mon, 15 Nov 2021 17:36:30 -0800 Subject: [PATCH 4/8] Add test for timeout --- .../tests/HostFactoryResolverTests.cs | 10 ++++++++++ ...soft.Extensions.HostFactoryResolver.Tests.csproj | 1 + .../tests/TopLevelStatementsTestsTimeout/Program.cs | 10 ++++++++++ .../TopLevelStatementsTestsTimeout.csproj | 13 +++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs create mode 100644 src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/TopLevelStatementsTestsTimeout.csproj diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs index 0e353f7f8cb708..61c99c8ac521fd 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs @@ -253,6 +253,16 @@ public void TopLevelStatements() Assert.IsAssignableFrom(factory(Array.Empty())); } + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsThreadingSupported))] + public void TopLevelStatementsTestsTimeout() + { + var assembly = Assembly.Load("TopLevelStatementsTestsTimeout"); + var factory = HostFactoryResolver.ResolveServiceProviderFactory(assembly, waitTimeout: null); // will use default timeout + + Assert.NotNull(factory); + Assert.Throws(() => factory(Array.Empty())); + } + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsThreadingSupported))] public void ApplicationNameSetFromAgrument() { diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/Microsoft.Extensions.HostFactoryResolver.Tests.csproj b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/Microsoft.Extensions.HostFactoryResolver.Tests.csproj index 795e830ee2e605..61edd76da9ceb2 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/Microsoft.Extensions.HostFactoryResolver.Tests.csproj +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/Microsoft.Extensions.HostFactoryResolver.Tests.csproj @@ -28,6 +28,7 @@ + diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs new file mode 100644 index 00000000000000..12b77f223cf046 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs @@ -0,0 +1,10 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Threading; +using Microsoft.Extensions.Hosting; + +var hostBuilder = new HostBuilder(); +Thread.Sleep(TimeSpan.FromMinutes(2)); +hostBuilder.Build(); \ No newline at end of file diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/TopLevelStatementsTestsTimeout.csproj b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/TopLevelStatementsTestsTimeout.csproj new file mode 100644 index 00000000000000..1d8d76f900ada1 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/TopLevelStatementsTestsTimeout.csproj @@ -0,0 +1,13 @@ + + + + $(NetCoreAppCurrent);$(NetFrameworkMinimum) + true + Exe + + + + + + + From aacc7e1d4ef6dafed6d72732a9b5d0d822df3b43 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Mon, 15 Nov 2021 17:50:58 -0800 Subject: [PATCH 5/8] Update src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs Co-authored-by: Stephen Halter --- .../src/HostFactoryResolver.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs index ad412650a876df..0f590a7e9a869c 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs @@ -284,7 +284,7 @@ public object CreateHost() // Wait before throwing an exception if (!_hostTcs.Task.Wait(_waitTimeout)) { - throw new InvalidOperationException($"Timed out waiting for the entry point to build the IHost after {s_defaultWaitTimeout}."); + throw new InvalidOperationException($"Timed out waiting for the entry point to build the IHost after {s_defaultWaitTimeout}. This timeout can be modified using the '{TimeoutEnvironmentKey}' environment variable."); } } catch (AggregateException) when (_hostTcs.Task.IsCompleted) From 8aae991f71c7df41fa68a8b46d7b6ce4a3b27c53 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Tue, 16 Nov 2021 10:32:28 -0800 Subject: [PATCH 6/8] PR feedback - increased the timeout length --- .../src/HostFactoryResolver.cs | 2 +- .../tests/TopLevelStatementsTestsTimeout/Program.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs index 0f590a7e9a869c..ec4335d5f5343b 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs @@ -37,7 +37,7 @@ private static TimeSpan SetupDefaultTimout() return TimeSpan.FromSeconds((int)timeoutInSeconds); } - return TimeSpan.FromSeconds(30); + return TimeSpan.FromMinutes(5); } public static Func? ResolveWebHostFactory(Assembly assembly) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs index 12b77f223cf046..55c4d1dab67376 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs @@ -6,5 +6,5 @@ using Microsoft.Extensions.Hosting; var hostBuilder = new HostBuilder(); -Thread.Sleep(TimeSpan.FromMinutes(2)); +Thread.Sleep(TimeSpan.FromMinutes(6)); hostBuilder.Build(); \ No newline at end of file From 8326cfab0455df6d4f6745f9cd14d43fc870fcac Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Tue, 16 Nov 2021 11:12:58 -0800 Subject: [PATCH 7/8] Update src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs --- .../tests/HostFactoryResolverTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs index 61c99c8ac521fd..d6cf530c94e93a 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs @@ -257,7 +257,7 @@ public void TopLevelStatements() public void TopLevelStatementsTestsTimeout() { var assembly = Assembly.Load("TopLevelStatementsTestsTimeout"); - var factory = HostFactoryResolver.ResolveServiceProviderFactory(assembly, waitTimeout: null); // will use default timeout + var factory = HostFactoryResolver.ResolveServiceProviderFactory(assembly, s_WaitTimeout); Assert.NotNull(factory); Assert.Throws(() => factory(Array.Empty())); From 0b2f1890c08245ab000522aecf5cf9f50e621d3f Mon Sep 17 00:00:00 2001 From: Maryam Ariyan Date: Tue, 16 Nov 2021 11:13:04 -0800 Subject: [PATCH 8/8] Update src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs --- .../tests/TopLevelStatementsTestsTimeout/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs index 55c4d1dab67376..f4c01882987e12 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/TopLevelStatementsTestsTimeout/Program.cs @@ -6,5 +6,5 @@ using Microsoft.Extensions.Hosting; var hostBuilder = new HostBuilder(); -Thread.Sleep(TimeSpan.FromMinutes(6)); +Thread.Sleep(TimeSpan.FromSeconds(30)); hostBuilder.Build(); \ No newline at end of file