public static async Task <Tuple <SelectedReplica, Replica> > GetSelectedReplicaAsync(
            FabricClient fabricClient,
            ReplicaSelector replicaSelector,
            TimeSpan requestTimeout,
            TimeSpan operationTimeout,
            CancellationToken cancellationToken)
        {
            ThrowIf.Null(replicaSelector, "ReplicaSelector");

            SelectedPartition selectedPartition = await FaultAnalysisServiceUtility.GetSelectedPartitionStateAsync(
                fabricClient,
                replicaSelector.PartitionSelector,
                requestTimeout,
                operationTimeout,
                cancellationToken).ConfigureAwait(false);

            Guid partitionId = selectedPartition.PartitionId;

            ServiceReplicaList replicasResult = await FabricClientRetryHelper.ExecuteFabricActionWithRetryAsync(
                () => fabricClient.QueryManager.GetReplicaListAsync(
                    partitionId,
                    0,
                    requestTimeout,
                    cancellationToken),
                operationTimeout,
                cancellationToken).ConfigureAwait(false);

            Replica replicaResult         = replicaSelector.GetSelectedReplica(replicasResult.ToArray(), new Random(), true /*skip invalid replicas*/);
            var     replicaSelectorResult = new SelectedReplica(replicaResult.Id, selectedPartition);

            return(new Tuple <SelectedReplica, Replica>(replicaSelectorResult, replicaResult));
        }