public static async Task <IDictionary <ActorId, TResult> > GetFromAllActors <TActorType, TResult>(IPartitionEnumerationManager partitionEnumerationManager,
                                                                                                          IActorProxyFactory actorProxyFactory, Uri serviceUri, Func <TActorType, Task <KeyValuePair <ActorId, TResult> > > onEachActor, CancellationToken cancellationToken = default(CancellationToken))
            where TActorType : IActor
        {
            var servicePartitionKeysAsync = await ServiceContextExtensions.GetServicePartitionKeysAsync(partitionEnumerationManager, serviceUri);

            var activeActors = new List <ActorInformation>();

            foreach (var partitionInformation in servicePartitionKeysAsync)
            {
                var actorServiceProxy = actorProxyFactory.CreateActorServiceProxy <IActorService>(serviceUri, partitionInformation.LowKey);


                ContinuationToken continuationToken = null;
                do
                {
                    var page = await actorServiceProxy.GetActorsAsync(continuationToken, cancellationToken);

                    activeActors.AddRange(page.Items);

                    continuationToken = page.ContinuationToken;
                } while (continuationToken != null);
            }

            var tasks = activeActors.Select(activeActor => actorProxyFactory.CreateActorProxy <TActorType>(activeActor.ActorId)).Select(onEachActor).ToList();

            return((await Task.WhenAll(tasks)).ToDictionary(task => task.Key, task => task.Value));
        }
Ejemplo n.º 2
0
        public static async Task <IList <Int64RangePartitionInformation> > GetServicePartitionKeysAsync(IPartitionEnumerationManager partitionEnumerationManager, Uri serviceName)
        {
            for (var i = 0; i < MaxQueryRetryCount; i++)
            {
                try
                {
                    // Get the list of partitions up and running in the service.
                    var partitionList = await partitionEnumerationManager.GetPartitionListAsync(serviceName);

                    // For each partition, build a service partition client used to resolve the low key served by the partition.
                    IList <Int64RangePartitionInformation> partitionKeys = new List <Int64RangePartitionInformation>(partitionList.Count);
                    foreach (var partition in partitionList)
                    {
                        var partitionInfo = partition.PartitionInformation as Int64RangePartitionInformation;
                        if (partitionInfo == null)
                        {
                            throw new InvalidOperationException(
                                      $"The service {serviceName} should have a uniform Int64 partition. Instead: {partition.PartitionInformation.Kind}");
                        }

                        partitionKeys.Add(partitionInfo);
                    }

                    return(partitionKeys);
                }
                catch (FabricTransientException)
                {
                    //ServiceEventSource.Current.OperationFailed(ex.Message, "create representative partition clients");
                    if (i == MaxQueryRetryCount - 1)
                    {
                        throw;
                    }
                }

                await Task.Delay(BackoffQueryDelay);
            }

            throw new TimeoutException("Retry timeout is exhausted and creating representative partition clients wasn't successful");
        }
        public static async Task <IDictionary <ActorId, ActorInformation> > GetFromAllActors <TActorType>(IPartitionEnumerationManager partitionEnumerationManager, IActorProxyFactory actorProxyFactory,
                                                                                                          Uri serviceUri, CancellationToken cancellationToken = default(CancellationToken), int maxResults = 100)
            where TActorType : IActor
        {
            var servicePartitionKeysAsync = await ServiceContextExtensions.GetServicePartitionKeysAsync(partitionEnumerationManager, serviceUri);

            var result  = new Dictionary <ActorId, ActorInformation>();
            var results = 0;

            foreach (var partitionInformation in servicePartitionKeysAsync)
            {
                var actorServiceProxy = actorProxyFactory.CreateActorServiceProxy <IActorService>(serviceUri, partitionInformation.LowKey);

                ContinuationToken continuationToken = null;
                do
                {
                    var page = await actorServiceProxy.GetActorsAsync(continuationToken, cancellationToken);

                    foreach (var actor in page.Items)
                    {
                        result.Add(actor.ActorId, actor);
                        results++;
                    }
                    if (results >= maxResults)
                    {
                        return(result);
                    }
                    continuationToken = page.ContinuationToken;
                }while (continuationToken != null);
            }
            return(result);
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Returns a list of service partition clients pointing to one key in each of the WordCount service partitions.
 /// The returned representative key is the min key served by each partition.
 /// </summary>
 /// <returns>The service partition clients pointing at a key in each of the WordCount service partitions.</returns>
 public static Task <IList <Int64RangePartitionInformation> > GetServicePartitionKeysAsync(IPartitionEnumerationManager partitionEnumerationManager, ServiceContext context)
 {
     return(GetServicePartitionKeysAsync(partitionEnumerationManager, context.ServiceName));
 }