public async Task DeactivationTest(Guid streamGuid, string streamNamespace) { // get producer and consumer ISampleStreaming_ProducerGrain producer = SampleStreaming_ProducerGrainFactory.GetGrain(Guid.NewGuid()); IMultipleSubscriptionConsumerGrain consumer = MultipleSubscriptionConsumerGrainFactory.GetGrain(Guid.NewGuid()); // subscribe (PubSubRendezvousGrain will have one consumer) StreamSubscriptionHandle <int> subscriptionHandle = await consumer.BecomeConsumer(streamGuid, streamNamespace, streamProviderName); // produce one message (PubSubRendezvousGrain will have one consumer and one producer) await producer.BecomeProducer(streamGuid, streamNamespace, streamProviderName); await producer.Produce(); var count = await consumer.GetNumberConsumed(); Assert.AreEqual(count[subscriptionHandle], 1, "Consumer grain has not received stream message"); //TODO: trigger deactivation programmatically await Task.Delay(TimeSpan.FromMilliseconds(130000)); // wait for the PubSubRendezvousGrain and the SampleStreaming_ProducerGrain to be deactivated // deactivating PubSubRendezvousGrain and SampleStreaming_ProducerGrain during the same GC cycle causes a deadlock // resume producing after the PubSubRendezvousGrain and the SampleStreaming_ProducerGrain grains have been deactivated: await producer.BecomeProducer(streamGuid, streamNamespace, streamProviderName).WithTimeout(Timeout, "BecomeProducer is hung due to deactivation deadlock"); await producer.Produce().WithTimeout(Timeout, "Produce is hung due to deactivation deadlock"); // consumer grain should continue to receive stream messages: count = await consumer.GetNumberConsumed(); Assert.AreEqual(count[subscriptionHandle], 2, "Consumer did not receive stream messages after PubSubRendezvousGrain and SampleStreaming_ProducerGrain reactivation"); }
public async Task DeactivationTest_ClientConsumer(Guid streamGuid, string streamNamespace) { // get producer and consumer ISampleStreaming_ProducerGrain producer = SampleStreaming_ProducerGrainFactory.GetGrain(Guid.NewGuid()); var count = new Counter(); // get stream and subscribe IStreamProvider streamProvider = GrainClient.GetStreamProvider(streamProviderName); var stream = streamProvider.GetStream <int>(streamGuid, streamNamespace); StreamSubscriptionHandle <int> subscriptionHandle = await stream.SubscribeAsync((e, t) => count.Increment()); // produce one message (PubSubRendezvousGrain will have one consumer and one producer) await producer.BecomeProducer(streamGuid, streamNamespace, streamProviderName); await producer.Produce(); Assert.AreEqual(count.Value, 1, "Client consumer grain has not received stream message"); //TODO: trigger deactivation programmatically await Task.Delay(TimeSpan.FromMilliseconds(130000)); // wait for the PubSubRendezvousGrain and the SampleStreaming_ProducerGrain to be deactivated // deactivating PubSubRendezvousGrain and SampleStreaming_ProducerGrain during the same GC cycle causes a deadlock // resume producing after the PubSubRendezvousGrain and the SampleStreaming_ProducerGrain grains have been deactivated: await producer.BecomeProducer(streamGuid, streamNamespace, streamProviderName).WithTimeout(Timeout, "BecomeProducer is hung due to deactivation deadlock"); await producer.Produce().WithTimeout(Timeout, "Produce is hung due to deactivation deadlock"); Assert.AreEqual(count.Value, 2, "Client consumer grain did not receive stream messages after PubSubRendezvousGrain and SampleStreaming_ProducerGrain reactivation"); }