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)); }
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); }
/// <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)); }