diff --git a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs index 19173d3a..04dc1ba7 100644 --- a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs +++ b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs @@ -23,9 +23,11 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using Gigya.Microdot.Hosting.HttpService; using Gigya.Microdot.Interfaces.Logging; using Ninject; +using Ninject.Extensions.Factory; using Orleans; using Orleans.Core; using Orleans.Runtime; @@ -64,17 +66,27 @@ public void Warmup() { try { - foreach (Type parameterType in serviceClass.GetConstructors().SelectMany(ctor => ctor.GetParameters().Select(p => p.ParameterType)).Distinct()) + foreach (ConstructorInfo ctorInfo in serviceClass.GetConstructors()) { - try + //IGrainIdentity and IGrainRuntime are used in the constructor intended for tests + //We don't need to warm up it + if (ctorInfo.GetParameters().Any(p => p.ParameterType == typeof(IGrainIdentity) || p.ParameterType == typeof(IGrainRuntime))) { - _kernel.Get(parameterType); + continue; } - catch //No exception handling needed. We try to warmup all constructor types. In case of failure, write the warning for non orleans types and go to the next type + + foreach (Type parameterType in ctorInfo.GetParameters().Select(p => p.ParameterType).Distinct()) { - if (!_orleansInternalTypes.Contains(parameterType)) + try + { + _kernel.Get(parameterType); + } + catch //No exception handling needed. We try to warmup all constructor types. In case of failure, write the warning for non orleans types and go to the next type { - failedWarmupWarn.Add($"Type {parameterType} of grain {serviceClass}"); + if (!_orleansInternalTypes.Contains(parameterType)) + { + failedWarmupWarn.Add($"Type {parameterType} of grain {serviceClass}"); + } } } } diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj index ef27e896..ad8dc836 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj @@ -47,6 +47,7 @@ + diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Microservice/WarmupTestService/TestGrain.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Microservice/WarmupTestService/TestGrain.cs new file mode 100644 index 00000000..3e8d7890 --- /dev/null +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Microservice/WarmupTestService/TestGrain.cs @@ -0,0 +1,36 @@ +using System; +using NUnit.Framework; +using Orleans; +using Orleans.Core; +using Orleans.Runtime; + +namespace Gigya.Microdot.Orleans.Hosting.UnitTests.Microservice.WarmupTestService +{ + public class TestGrain : Grain, IGrainWithIntegerKey + { + public TestGrain(IGrainIdentity grainIdentity, IGrainRuntime graintRuntime, TestType t, int i) : base(grainIdentity, graintRuntime) + {} + } + + public class UsualGrain : Grain, IGrainWithIntegerKey + { + public UsualGrain(UsualType u) + {} + } + + public class TestType + { + public TestType() + { + Assert.Fail("Should not warm up grain constructor for testing"); + } + } + + public class UsualType + { + public UsualType() + { + Console.WriteLine("UsualGrain is warmed as expected"); + } + } +} diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/WarmupTests.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/WarmupTests.cs index 97a7c885..1399db0d 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/WarmupTests.cs +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/WarmupTests.cs @@ -1,8 +1,14 @@ using System.Diagnostics; +using System.Reflection; using System.Threading.Tasks; +using Gigya.Microdot.Fakes; +using Gigya.Microdot.Hosting.HttpService; +using Gigya.Microdot.Ninject; using Gigya.Microdot.Orleans.Hosting.UnitTests.Microservice.CalculatorService; using Gigya.Microdot.Orleans.Hosting.UnitTests.Microservice.WarmupTestService; +using Gigya.Microdot.Orleans.Ninject.Host; using Gigya.Microdot.Testing.Service; +using Gigya.Microdot.Testing.Shared; using Ninject; using NUnit.Framework; @@ -41,5 +47,20 @@ public async Task VerifyWarmupBeforeSiloStart() Task.Run(() => host.Run()); await host.WaitForHostDisposed(); } + + [Test] + public async Task ShouldNotWarmupGrainTestingConstructor() + { + TestingKernel kernel = new TestingKernel(k => + { + k.Rebind().ToSelf(); + k.Rebind().ToSelf(); + k.Rebind().To().InSingletonScope(); + k.Rebind().To().InSingletonScope(); + }); + + IWarmup grainsWarmup = kernel.Get(); + grainsWarmup.Warmup(); + } } }