public async Task ActivationCollectorShouldCollectIdleActivations() { Initialize(DEFAULT_IDLE_TIMEOUT); const int grainCount = 1000; var fullGrainTypeName = typeof(IdleActivationGcTestGrain1).FullName; List <Task> tasks = new List <Task>(); logger.Info("IdleActivationCollectorShouldCollectIdleActivations: activating {0} grains.", grainCount); for (var i = 0; i < grainCount; ++i) { IIdleActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IIdleActivationGcTestGrain1>(Guid.NewGuid()); tasks.Add(g.Nop()); } await Task.WhenAll(tasks); int activationsCreated = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, fullGrainTypeName); Assert.Equal(grainCount, activationsCreated); logger.Info("IdleActivationCollectorShouldCollectIdleActivations: grains activated; waiting {0} sec (activation GC idle timeout is {1} sec).", WAIT_TIME.TotalSeconds, DEFAULT_IDLE_TIMEOUT.TotalSeconds); await Task.Delay(WAIT_TIME); int activationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, fullGrainTypeName); Assert.Equal(0, activationsNotCollected); }
public async Task ActivationCollectorForceCollection() { Initialize(DEFAULT_IDLE_TIMEOUT); const int grainCount = 1000; var fullGrainTypeName = typeof(IdleActivationGcTestGrain1).FullName; List <Task> tasks = new List <Task>(); logger.Info("ActivationCollectorForceCollection: activating {0} grains.", grainCount); for (var i = 0; i < grainCount; ++i) { IIdleActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IIdleActivationGcTestGrain1>(Guid.NewGuid()); tasks.Add(g.Nop()); } await Task.WhenAll(tasks); await Task.Delay(TimeSpan.FromSeconds(5)); var grain = this.testCluster.GrainFactory.GetGrain <IManagementGrain>(0); await grain.ForceActivationCollection(TimeSpan.FromSeconds(4)); int activationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, fullGrainTypeName); Assert.Equal(0, activationsNotCollected); await grain.ForceActivationCollection(TimeSpan.FromSeconds(4)); }
public async Task ActivationCollectorShouldNotCauseMessageLoss() { await Initialize(DEFAULT_IDLE_TIMEOUT); const int idleGrainCount = 0; const int busyGrainCount = 500; var idleGrainTypeName = RuntimeTypeNameFormatter.Format(typeof(IdleActivationGcTestGrain1)); var busyGrainTypeName = RuntimeTypeNameFormatter.Format(typeof(BusyActivationGcTestGrain1)); const int burstCount = 100; List <Task> tasks0 = new List <Task>(); List <IBusyActivationGcTestGrain1> busyGrains = new List <IBusyActivationGcTestGrain1>(); logger.LogInformation("ActivationCollectorShouldNotCauseMessageLoss: activating {Count} busy grains.", busyGrainCount); for (var i = 0; i < busyGrainCount; ++i) { IBusyActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IBusyActivationGcTestGrain1>(Guid.NewGuid()); busyGrains.Add(g); tasks0.Add(g.Nop()); } await busyGrains[0].EnableBurstOnCollection(burstCount); logger.LogInformation( "ActivationCollectorShouldNotCauseMessageLoss: activating {Count} idle grains.", idleGrainCount); tasks0.Clear(); for (var i = 0; i < idleGrainCount; ++i) { IIdleActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IIdleActivationGcTestGrain1>(Guid.NewGuid()); tasks0.Add(g.Nop()); } await Task.WhenAll(tasks0); int activationsCreated = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, idleGrainTypeName) + await TestUtils.GetActivationCount(this.testCluster.GrainFactory, busyGrainTypeName); Assert.Equal(idleGrainCount + busyGrainCount, activationsCreated); logger.LogInformation( "ActivationCollectorShouldNotCauseMessageLoss: grains activated; waiting {WaitSeconds} sec (activation GC idle timeout is {DefaultIdleTimeout} sec).", WAIT_TIME.TotalSeconds, DEFAULT_IDLE_TIMEOUT.TotalSeconds); await Task.Delay(WAIT_TIME); // we should have only collected grains from the idle category (IdleActivationGcTestGrain1). int idleActivationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, idleGrainTypeName); int busyActivationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, busyGrainTypeName); Assert.Equal(0, idleActivationsNotCollected); Assert.Equal(busyGrainCount, busyActivationsNotCollected); }
public async Task ManualCollectionShouldNotCollectBusyActivations() { Initialize(DEFAULT_IDLE_TIMEOUT); TimeSpan shortIdleTimeout = TimeSpan.FromSeconds(1); const int idleGrainCount = 500; const int busyGrainCount = 500; var idleGrainTypeName = typeof(IdleActivationGcTestGrain1).FullName; var busyGrainTypeName = typeof(BusyActivationGcTestGrain1).FullName; List <Task> tasks0 = new List <Task>(); List <IBusyActivationGcTestGrain1> busyGrains = new List <IBusyActivationGcTestGrain1>(); logger.Info("ManualCollectionShouldNotCollectBusyActivations: activating {0} busy grains.", busyGrainCount); for (var i = 0; i < busyGrainCount; ++i) { IBusyActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IBusyActivationGcTestGrain1>(Guid.NewGuid()); busyGrains.Add(g); tasks0.Add(g.Nop()); } await Task.WhenAll(tasks0); bool[] quit = new bool[] { false }; Func <Task> busyWorker = async() => { logger.Info("ManualCollectionShouldNotCollectBusyActivations: busyWorker started"); List <Task> tasks1 = new List <Task>(); while (!quit[0]) { foreach (var g in busyGrains) { tasks1.Add(g.Nop()); } await Task.WhenAll(tasks1); } }; Task.Run(busyWorker).Ignore(); logger.Info("ManualCollectionShouldNotCollectBusyActivations: activating {0} idle grains.", idleGrainCount); tasks0.Clear(); for (var i = 0; i < idleGrainCount; ++i) { IIdleActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IIdleActivationGcTestGrain1>(Guid.NewGuid()); tasks0.Add(g.Nop()); } await Task.WhenAll(tasks0); int activationsCreated = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, idleGrainTypeName) + await TestUtils.GetActivationCount(this.testCluster.GrainFactory, busyGrainTypeName); Assert.Equal(idleGrainCount + busyGrainCount, activationsCreated); logger.Info("ManualCollectionShouldNotCollectBusyActivations: grains activated; waiting {0} sec (activation GC idle timeout is {1} sec).", shortIdleTimeout.TotalSeconds, DEFAULT_IDLE_TIMEOUT.TotalSeconds); await Task.Delay(shortIdleTimeout); TimeSpan everything = TimeSpan.FromMinutes(10); logger.Info("ManualCollectionShouldNotCollectBusyActivations: triggering manual collection (timespan is {0} sec).", everything.TotalSeconds); IManagementGrain mgmtGrain = this.testCluster.GrainFactory.GetGrain <IManagementGrain>(0); await mgmtGrain.ForceActivationCollection(everything); logger.Info("ManualCollectionShouldNotCollectBusyActivations: waiting {0} sec (activation GC idle timeout is {1} sec).", WAIT_TIME.TotalSeconds, DEFAULT_IDLE_TIMEOUT.TotalSeconds); await Task.Delay(WAIT_TIME); // we should have only collected grains from the idle category (IdleActivationGcTestGrain). int idleActivationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, idleGrainTypeName); int busyActivationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, busyGrainTypeName); Assert.Equal(0, idleActivationsNotCollected); Assert.Equal(busyGrainCount, busyActivationsNotCollected); quit[0] = true; }
public async Task ActivationCollectorShouldNotCollectBusyActivations() { await Initialize(DEFAULT_IDLE_TIMEOUT); const int idleGrainCount = 500; const int busyGrainCount = 500; var idleGrainTypeName = RuntimeTypeNameFormatter.Format(typeof(IdleActivationGcTestGrain1)); var busyGrainTypeName = RuntimeTypeNameFormatter.Format(typeof(BusyActivationGcTestGrain1)); List <Task> tasks0 = new List <Task>(); List <IBusyActivationGcTestGrain1> busyGrains = new List <IBusyActivationGcTestGrain1>(); logger.Info("ActivationCollectorShouldNotCollectBusyActivations: activating {0} busy grains.", busyGrainCount); for (var i = 0; i < busyGrainCount; ++i) { IBusyActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IBusyActivationGcTestGrain1>(Guid.NewGuid()); busyGrains.Add(g); tasks0.Add(g.Nop()); } await Task.WhenAll(tasks0); bool[] quit = new bool[] { false }; Func <Task> busyWorker = async() => { logger.Info("ActivationCollectorShouldNotCollectBusyActivations: busyWorker started"); List <Task> tasks1 = new List <Task>(); while (!quit[0]) { foreach (var g in busyGrains) { tasks1.Add(g.Nop()); } await Task.WhenAll(tasks1); } }; Task.Run(busyWorker).Ignore(); logger.Info("ActivationCollectorShouldNotCollectBusyActivations: activating {0} idle grains.", idleGrainCount); tasks0.Clear(); for (var i = 0; i < idleGrainCount; ++i) { IIdleActivationGcTestGrain1 g = this.testCluster.GrainFactory.GetGrain <IIdleActivationGcTestGrain1>(Guid.NewGuid()); tasks0.Add(g.Nop()); } await Task.WhenAll(tasks0); int activationsCreated = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, idleGrainTypeName) + await TestUtils.GetActivationCount(this.testCluster.GrainFactory, busyGrainTypeName); Assert.Equal(idleGrainCount + busyGrainCount, activationsCreated); logger.Info("ActivationCollectorShouldNotCollectBusyActivations: grains activated; waiting {0} sec (activation GC idle timeout is {1} sec).", WAIT_TIME.TotalSeconds, DEFAULT_IDLE_TIMEOUT.TotalSeconds); await Task.Delay(WAIT_TIME); // we should have only collected grains from the idle category (IdleActivationGcTestGrain1). int idleActivationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, idleGrainTypeName); int busyActivationsNotCollected = await TestUtils.GetActivationCount(this.testCluster.GrainFactory, busyGrainTypeName); Assert.Equal(0, idleActivationsNotCollected); Assert.Equal(busyGrainCount, busyActivationsNotCollected); quit[0] = true; }