public async Task <ClusterResult> ExecuteAsync(IRequestContext context, Func <IRequestContext, Task <ClusterResult> > next) { var replicas = clusterProvider.GetCluster(); if (replicas == null || replicas.Count == 0) { LogReplicasNotFound(context); return(ClusterResult.ReplicasNotFound(context.Request)); } var contextImpl = (RequestContext)context; var contextualSender = new ContextualRequestSender(requestSender, contextImpl); var maxReplicasToUse = context.MaximumReplicasToUse; var orderedReplicas = replicaOrdering.Order(replicas, storageProvider, contextImpl.Request); var limitedReplicas = orderedReplicas.Take(maxReplicasToUse); await contextImpl.Strategy.SendAsync(contextImpl.Request, contextualSender, contextImpl.Budget, limitedReplicas, Math.Min(replicas.Count, maxReplicasToUse), context.CancellationToken).ConfigureAwait(false); context.CancellationToken.ThrowIfCancellationRequested(); var replicaResults = contextImpl.FreezeReplicaResults(); var selectedResponse = responseSelector.Select(replicaResults); var resultStatus = resultStatusSelector.Select(replicaResults, contextImpl.Budget); return(new ClusterResult(resultStatus, replicaResults, selectedResponse, context.Request)); }
public void TestSetup() { replica = new Uri("http://replica"); request = Request.Get("foo/bar"); result = new ReplicaResult(replica, new Response(ResponseCode.Ok), ResponseVerdict.Accept, 1.Milliseconds()); timeout = 1.Minutes(); connectionTimeout = 1.Seconds(); resultSource = new TaskCompletionSource <ReplicaResult>(); baseSender = Substitute.For <IRequestSenderInternal>(); baseSender.SendToReplicaAsync(null, null, null, null, TimeSpan.Zero, CancellationToken.None).ReturnsForAnyArgs(_ => resultSource.Task); context = new RequestContext(request, new RequestParameters(Strategy.SingleReplica), Budget.WithRemaining(timeout), new ConsoleLog(), Substitute.For <ITransport>(), int.MaxValue, null, CancellationToken.None); contextualSender = new ContextualRequestSender(baseSender, context); }
public void SetUp() { replica = new Uri("http://replica"); request = Request.Get("foo/bar"); result = new ReplicaResult(replica, new Response(ResponseCode.Ok), ResponseVerdict.Accept, 1.Milliseconds()); timeout = 1.Minutes(); resultSource = new TaskCompletionSource <ReplicaResult>(); baseSender = Substitute.For <IRequestSender>(); // ReSharper disable AssignNullToNotNullAttribute baseSender.SendToReplicaAsync(null, null, TimeSpan.Zero, CancellationToken.None).ReturnsForAnyArgs(_ => resultSource.Task); // ReSharper restore AssignNullToNotNullAttribute var log = new ConsoleLog(); context = new RequestContext(request, Strategy.SingleReplica, Budget.WithRemaining(timeout), log, CancellationToken.None, null, int.MaxValue); contextualSender = new ContextualRequestSender(baseSender, context); }