From a003c3ea087b4e3243e06680746e6f552feb207d Mon Sep 17 00:00:00 2001 From: Philip Lin Date: Wed, 18 Dec 2019 10:21:22 -0800 Subject: [PATCH] ConfigureServices don't allow async; otherwise it runs into a race condition. (#2157) Resolve dependency injection issue in WebHost ConfigureServices method; which should be implemented synchronously. --- .../Controllers/TestOperationResultController.cs | 14 +++++++------- test/modules/TestResultCoordinator/Startup.cs | 15 +++++++++++---- .../storage/TestOperationResultStorage.cs | 8 +------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/test/modules/TestResultCoordinator/Controllers/TestOperationResultController.cs b/test/modules/TestResultCoordinator/Controllers/TestOperationResultController.cs index e00497361da..046172946fd 100644 --- a/test/modules/TestResultCoordinator/Controllers/TestOperationResultController.cs +++ b/test/modules/TestResultCoordinator/Controllers/TestOperationResultController.cs @@ -17,13 +17,13 @@ namespace TestResultCoordinator.Controllers public class TestOperationResultController : Controller { static readonly ILogger Logger = ModuleUtil.CreateLogger(nameof(TestOperationResultController)); - // readonly ITestOperationResultStorage storage; - // TODO: uncomment this when dependency injection is fixed - // public TestOperationResultController(ITestOperationResultStorage storage) - // { - // this.storage = Preconditions.CheckNotNull(storage); - // } + readonly ITestOperationResultStorage storage; + + public TestOperationResultController(ITestOperationResultStorage storage) + { + this.storage = Preconditions.CheckNotNull(storage); + } // POST api/TestOperationResult [HttpPost] @@ -31,7 +31,7 @@ public async Task PostAsync(TestOperationResult result) { try { - bool success = await TestOperationResultStorage.Instance.AddResultAsync(result); + bool success = await this.storage.AddResultAsync(result); Logger.LogDebug($"Received test result: {result.Source}, {result.Type}, {success}"); return success ? this.StatusCode((int)HttpStatusCode.NoContent) : this.StatusCode((int)HttpStatusCode.BadRequest); } diff --git a/test/modules/TestResultCoordinator/Startup.cs b/test/modules/TestResultCoordinator/Startup.cs index 5ffa14772b7..e0b44b21e78 100644 --- a/test/modules/TestResultCoordinator/Startup.cs +++ b/test/modules/TestResultCoordinator/Startup.cs @@ -27,9 +27,12 @@ public Startup(IConfiguration configuration) public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. - public async void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { + Logger.LogInformation("Calling Startup.ConfigureServices"); + services.AddMvc(); + IStoreProvider storeProvider; try { @@ -49,11 +52,15 @@ public async void ConfigureServices(IServiceCollection services) storeProvider = new StoreProvider(new InMemoryDbStoreProvider()); } - services.AddSingleton(await TestOperationResultStorage.Create( - storeProvider, - Settings.Current.ResultSources)); + services.AddSingleton( + TestOperationResultStorage.Create( + storeProvider, + Settings.Current.ResultSources).Result); + services.AddHostedService(); services.AddHostedService(); + + Logger.LogInformation("Calling Startup.ConfigureServices Completed."); } // TODO: Remove warning disable for Obsolete when project is moved to dotnetcore 3.0 diff --git a/test/modules/TestResultCoordinator/storage/TestOperationResultStorage.cs b/test/modules/TestResultCoordinator/storage/TestOperationResultStorage.cs index 7e0fd426dc4..c6fc729dc58 100644 --- a/test/modules/TestResultCoordinator/storage/TestOperationResultStorage.cs +++ b/test/modules/TestResultCoordinator/storage/TestOperationResultStorage.cs @@ -14,9 +14,6 @@ public class TestOperationResultStorage : ITestOperationResultStorage static readonly ILogger Logger = Microsoft.Azure.Devices.Edge.ModuleUtil.ModuleUtil.CreateLogger(nameof(TestOperationResultStorage)); private Dictionary> resultStores; - // HACK: unblock testing due to controller dependency injection issue - internal static ITestOperationResultStorage Instance { get; private set; } - public static async Task Create(IStoreProvider storeProvider, List resultSources) { Preconditions.CheckNotNull(storeProvider, nameof(storeProvider)); @@ -26,10 +23,7 @@ public static async Task Create(IStoreProvider store resultSourcesToStores.Add(resultSource, await storeProvider.GetSequentialStore(resultSource)); } - var testOperationResultStorage = new TestOperationResultStorage(resultSourcesToStores); - Instance = testOperationResultStorage; - - return testOperationResultStorage; + return new TestOperationResultStorage(resultSourcesToStores); } private TestOperationResultStorage(Dictionary> resultStores)