Beispiel #1
0
        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");
        }
        private async Task <bool> CheckCounters(ISampleStreaming_ProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumerCount, StreamSubscriptionHandle <int> handler, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();

            var numConsumed = await consumer.GetNumberConsumed();

            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced > 0, "Events were not produced");
                Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
                if (handler != null)
                {
                    var numHandlerConsumed = numConsumed[handler];
                    Assert.AreEqual(numProduced, numHandlerConsumed, "Producer and consumer do not match");
                }
                else
                {
                    foreach (int consumed in numConsumed.Values)
                    {
                        Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
                    }
                }
            }
            else if (numProduced <= 0 ||                                                                                                            // no events produced?
                     consumerCount != numConsumed.Count ||                                                                                          // subscription counts are wrong?
                     handler == null ? numConsumed.Values.All(consumedCount => consumedCount != numProduced) : numConsumed[handler] != numProduced) // consumed events don't match produced events for any subscription or specific handler (if sent)?
            {
                if (numProduced <= 0)
                {
                    _logger.Info("numProduced <= 0: Events were not produced");
                }
                if (consumerCount != numConsumed.Count)
                {
                    _logger.Info("consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {0}, numConsumed.Count = {1}",
                                 consumerCount, numConsumed.Count);
                }
                foreach (int consumed in numConsumed.Values)
                {
                    if (numProduced != consumed)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                                     numProduced, consumed);
                        //numProduced, Utils.DictionaryToString(numConsumed));
                    }
                }
                return(false);
            }

            if (handler != null)
            {
                _logger.Info("All counts are equal. numProduced = {0}, numHandlerConsumed = {1}, consumersCount = {2}", numProduced, numConsumed[handler], consumerCount); //Utils.DictionaryToString(numConsumed));
            }
            else
            {
                _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}", numProduced, consumerCount); //Utils.DictionaryToString(numConsumed));
            }

            return(true);
        }
        private async Task <bool> CheckCounters(IMultipleProducingProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int producerCount, int consumerCount, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();

            var numConsumed = await consumer.GetNumberConsumed();

            var consumed = numConsumed.First().Value;

            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced.Any(pair => pair.Value > 0), "Events were not produced");
                Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
                Assert.AreEqual(producerCount, numProduced.Count, "Incorrect number of producers");

                foreach (int produced in numProduced.Values)
                {
                    Assert.AreEqual(produced, consumed, "Produced and Consumed counts do not match");
                }
            }
            else if (numProduced.Any(pair => pair.Value <= 0) ||                         // no events produced?
                     consumerCount != numConsumed.Count ||                               // subscription counts are wrong?
                     producerCount != numProduced.Count ||
                     numProduced.Values.All(producedCount => producedCount != consumed)) // consumed events don't match produced events for any subscription or specific handler (if sent)?
            {
                if (numProduced.Any(pair => pair.Value <= 0))
                {
                    _logger.Info("numProduced <= 0: Events were not produced");
                }
                if (consumerCount != numConsumed.Count)
                {
                    _logger.Info("consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {0}, numConsumed.Count = {1}",
                                 consumerCount, numConsumed.Count);
                }
                if (producerCount != numProduced.Count)
                {
                    _logger.Info("producerCount != numProduced.Count: Incorrect number of producer. producerCount = {0}, numProduced.Count = {1}",
                                 producerCount, numProduced.Count);
                }

                foreach (var produced in numProduced.Values)
                {
                    if (produced != consumed)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                                     produced, consumed);
                        //numProduced, Utils.DictionaryToString(numConsumed));
                    }
                }
                return(false);
            }

            _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}", numProduced, consumerCount); //Utils.DictionaryToString(numConsumed));

            return(true);
        }
        private async Task <bool> CheckCounters(ISampleStreaming_ProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumerCount, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();

            var numConsumed = await consumer.GetNumberConsumed();

            if (assertIsTrue)
            {
                Assert.True(numConsumed.Values.All(v => v.Item2 == 0), "Errors");
                Assert.True(numProduced > 0, "Events were not produced");
                Assert.Equal(consumerCount, numConsumed.Count);
                foreach (int consumed in numConsumed.Values.Select(v => v.Item1))
                {
                    Assert.Equal(numProduced, consumed);
                }
            }
            else if (numProduced <= 0 ||                                                            // no events produced?
                     consumerCount != numConsumed.Count ||                                          // subscription counts are wrong?
                     numConsumed.Values.Any(consumedCount => consumedCount.Item1 != numProduced) || // consumed events don't match produced events for any subscription?
                     numConsumed.Values.Any(v => v.Item2 != 0))                                     // stream errors
            {
                if (numProduced <= 0)
                {
                    logger.LogInformation("numProduced <= 0: Events were not produced");
                }
                if (consumerCount != numConsumed.Count)
                {
                    logger.LogInformation(
                        "consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {ConsumerCount}, numConsumed.Count = {ConsumedCount}",
                        consumerCount,
                        numConsumed.Count);
                }
                foreach (var consumed in numConsumed)
                {
                    if (numProduced != consumed.Value.Item1)
                    {
                        logger.LogInformation("numProduced != consumed: Produced and consumed counts do not match. numProduced = {ProducedCount}, consumed = {ConsumedCount}",
                                              numProduced, consumed.Key.HandleId + " -> " + consumed.Value);
                        //numProduced, Utils.DictionaryToString(numConsumed));
                    }
                }
                return(false);
            }

            logger.LogInformation(
                "All counts are equal. numProduced = {ProducedCount}, numConsumed = {ConsumedCount}",
                numProduced,
                Utils.EnumerableToString(
                    numConsumed,
                    kvp => kvp.Key.HandleId.ToString() + "->" + kvp.Value.ToString()));
            return(true);
        }
Beispiel #5
0
        private async Task <bool> CheckCounter(IBatchProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer,
                                               StreamSubscriptionHandle <int> handler, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();

            var consumers = await consumer.GetNumberConsumed();

            var numConsumed = consumers[handler];

            _logger.Info("Checking now for handler for stream: {0}", handler.StreamIdentity.ToString());

            return(await CheckCounter(numProduced, numConsumed, assertIsTrue));
        }
Beispiel #6
0
        private async Task <bool> CheckCounter(IBatchProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumersCount,
                                               bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();

            var numConsumed = await consumer.GetNumberConsumed();

            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced > 0, "No messages produced");
                Assert.AreEqual(consumersCount, numConsumed.Count, "Number of consumers is incorrect");

                foreach (int consumed in numConsumed.Values)
                {
                    Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
                }
            }
            else if (numProduced <= 0 ||
                     numConsumed.Count != consumersCount ||
                     numConsumed.Values.Any(consumed => consumed != numProduced))
            {
                if (numProduced <= 0)
                {
                    _logger.Info("Noting produced yet..");
                }
                if (numConsumed.Count != consumersCount)
                {
                    _logger.Info("Consumer num doesn't match yet..");
                }
                foreach (var consumed in numConsumed.Values)
                {
                    if (consumed != numProduced)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                                     numProduced, consumed);
                    }
                }

                return(false);
            }

            _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}, Total consumed = {2}", numProduced, consumersCount, numConsumed.Values.Sum());

            return(true);
        }
        private async Task <bool> CheckCounters(ISampleStreaming_ProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumerCount, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();

            var numConsumed = await consumer.GetNumberConsumed();

            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced > 0, "Events were not produced");
                Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
                foreach (int consumed in numConsumed.Values)
                {
                    Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
                }
            }
            else if (numProduced <= 0 ||                                                    // no events produced?
                     consumerCount != numConsumed.Count ||                                  // subscription counts are wrong?
                     numConsumed.Values.Any(consumedCount => consumedCount != numProduced)) // consumed events don't match produced events for any subscription?
            {
                return(false);
            }
            return(true);
        }
 private async Task<bool> CheckCounters(ISampleStreaming_ProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumerCount, bool assertIsTrue)
 {
     var numProduced = await producer.GetNumberProduced();
     var numConsumed = await consumer.GetNumberConsumed();
     if (assertIsTrue)
     {
         Assert.IsTrue(numConsumed.Values.All(v => v.Item2 == 0), "Errors");
         Assert.IsTrue(numProduced > 0, "Events were not produced");
         Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
         foreach (int consumed in numConsumed.Values.Select(v => v.Item1))
         {
             Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
         }
     }
     else if (numProduced <= 0 || // no events produced?
              consumerCount != numConsumed.Count || // subscription counts are wrong?
              numConsumed.Values.Any(consumedCount => consumedCount.Item1 != numProduced) ||// consumed events don't match produced events for any subscription?
              numConsumed.Values.Any(v => v.Item2 != 0)) // stream errors
     {
         if (numProduced <= 0)
         {
             logger.Info("numProduced <= 0: Events were not produced");
         }
         if (consumerCount != numConsumed.Count)
         {
             logger.Info("consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {0}, numConsumed.Count = {1}",
                 consumerCount, numConsumed.Count);
         }
         foreach (var consumed in numConsumed)
         {
             if (numProduced != consumed.Value.Item1)
             {
                 logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                     numProduced, consumed.Key.HandleId + " -> " + consumed.Value);
                     //numProduced, Utils.DictionaryToString(numConsumed));
             }
         }
         return false;
     }
     logger.Info("All counts are equal. numProduced = {0}, numConsumed = {1}", numProduced, 
         Utils.EnumerableToString(numConsumed, kvp => kvp.Key.HandleId.ToString() + "->" +  kvp.Value.ToString()));
     return true;
 }
        private async Task<bool> CheckCounter(IBatchProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumersCount,
            bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();
            var numConsumed = await consumer.GetNumberConsumed();

            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced > 0, "No messages produced");
                Assert.AreEqual(consumersCount, numConsumed.Count, "Number of consumers is incorrect" );

                foreach (int consumed in numConsumed.Values)
                {
                    Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
                }
            }
            else if (numProduced <= 0 ||
                     numConsumed.Count != consumersCount ||
                     numConsumed.Values.Any(consumed => consumed != numProduced))
            {
                if (numProduced <= 0)
                {
                    _logger.Info("Noting produced yet..");
                }
                if (numConsumed.Count != consumersCount)
                {
                    _logger.Info("Consumer num doesn't match yet..");
                }
                foreach (var consumed in numConsumed.Values)
                {
                    if (consumed != numProduced)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                            numProduced, consumed);
                    }
                }

                return false;
            }

            _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}, Total consumed = {2}", numProduced, consumersCount, numConsumed.Values.Sum());

            return true;
        }
        private async Task<bool> CheckCounter(IBatchProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer,
            StreamSubscriptionHandle<int> handler, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();
            var consumers = await consumer.GetNumberConsumed();
            var numConsumed = consumers[handler];
            
            _logger.Info("Checking now for handler for stream: {0}", handler.StreamIdentity.ToString());

            return await CheckCounter(numProduced, numConsumed, assertIsTrue);
        }
        private async Task<bool> CheckCounters(IMultipleProducingProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int producerCount, int consumerCount, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();
            var numConsumed = await consumer.GetNumberConsumed();

            var consumed = numConsumed.First().Value;

            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced.Any(pair => pair.Value > 0), "Events were not produced");
                Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
                Assert.AreEqual(producerCount, numProduced.Count, "Incorrect number of producers");

                foreach (int produced in numProduced.Values)
                {
                    Assert.AreEqual(produced, consumed, "Produced and Consumed counts do not match");
                }
            }
            else if (numProduced.Any(pair => pair.Value <= 0) || // no events produced?
                     consumerCount != numConsumed.Count || // subscription counts are wrong?
                     producerCount != numProduced.Count ||
                     numProduced.Values.All(producedCount => producedCount != consumed)) // consumed events don't match produced events for any subscription or specific handler (if sent)?
            {
                if (numProduced.Any(pair => pair.Value <= 0))
                {
                    _logger.Info("numProduced <= 0: Events were not produced");
                }
                if (consumerCount != numConsumed.Count)
                {
                    _logger.Info("consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {0}, numConsumed.Count = {1}",
                        consumerCount, numConsumed.Count);
                }
                if (producerCount != numProduced.Count)
                {
                    _logger.Info("producerCount != numProduced.Count: Incorrect number of producer. producerCount = {0}, numProduced.Count = {1}",
                        producerCount, numProduced.Count);
                }

                foreach (var produced in numProduced.Values)
                {
                    if (produced != consumed)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                            produced, consumed);
                        //numProduced, Utils.DictionaryToString(numConsumed));
                    }
                }
                return false;
            }

            _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}", numProduced, consumerCount); //Utils.DictionaryToString(numConsumed));    

            return true;
        }
        private async Task<bool> CheckCounters(ISampleStreaming_ProducerGrain producer, IMultipleSubscriptionConsumerGrain consumer, int consumerCount, StreamSubscriptionHandle<int> handler, bool assertIsTrue)
        {
            var numProduced = await producer.GetNumberProduced();
            var numConsumed = await consumer.GetNumberConsumed();
            if (assertIsTrue)
            {
                Assert.IsTrue(numProduced > 0, "Events were not produced");
                Assert.AreEqual(consumerCount, numConsumed.Count, "Incorrect number of consumers");
                if (handler != null)
                {
                    var numHandlerConsumed = numConsumed[handler];
                    Assert.AreEqual(numProduced, numHandlerConsumed, "Producer and consumer do not match");
                }
                else
                {
                    foreach (int consumed in numConsumed.Values)
                    {
                        Assert.AreEqual(numProduced, consumed, "Produced and consumed counts do not match");
                    }
                }
            }
            else if (numProduced <= 0 || // no events produced?
                     consumerCount != numConsumed.Count || // subscription counts are wrong?
                     handler == null ? numConsumed.Values.All(consumedCount => consumedCount != numProduced) : numConsumed[handler] != numProduced) // consumed events don't match produced events for any subscription or specific handler (if sent)?
            {
                if (numProduced <= 0)
                {
                    _logger.Info("numProduced <= 0: Events were not produced");
                }
                if (consumerCount != numConsumed.Count)
                {
                    _logger.Info("consumerCount != numConsumed.Count: Incorrect number of consumers. consumerCount = {0}, numConsumed.Count = {1}",
                        consumerCount, numConsumed.Count);
                }
                foreach (int consumed in numConsumed.Values)
                {
                    if (numProduced != consumed)
                    {
                        _logger.Info("numProduced != consumed: Produced and consumed counts do not match. numProduced = {0}, consumed = {1}",
                            numProduced, consumed);
                        //numProduced, Utils.DictionaryToString(numConsumed));
                    }
                }
                return false;
            }

            if (handler != null)
            {
                _logger.Info("All counts are equal. numProduced = {0}, numHandlerConsumed = {1}, consumersCount = {2}", numProduced, numConsumed[handler], consumerCount); //Utils.DictionaryToString(numConsumed));    
            }
            else
            {
                _logger.Info("All counts are equal. numProduced = {0}, consumersCount = {1}", numProduced, consumerCount); //Utils.DictionaryToString(numConsumed));    
            }
         
            return true;
        }