Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }