public async Task <ReplicaResult> SendToReplicaAsync( ITransport transport, IReplicaOrdering replicaOrdering, Uri replica, Request request, int connectionAttempts, TimeSpan?connectionTimeout, TimeSpan timeout, CancellationToken cancellationToken) { if (configuration.Logging.LogReplicaRequests) { LogRequest(replica, timeout); } var timeBudget = TimeBudget.StartNew(timeout, TimeSpan.FromMilliseconds(1)); var absoluteRequest = requestConverter.TryConvertToAbsolute(request, replica); var response = await SendRequestAsync(transport, absoluteRequest, timeBudget, connectionAttempts, connectionTimeout, cancellationToken).ConfigureAwait(false); var responseVerdict = responseClassifier.Decide(response, configuration.ResponseCriteria); var result = new ReplicaResult(replica, response, responseVerdict, timeBudget.Elapsed); if (configuration.Logging.LogReplicaResults) { LogResult(result); } replicaOrdering.Learn(result, storageProvider); return(result); }
public void TestSetup() { replica = new Uri("http://replica/"); relativeRequest = Request.Get("foo/bar"); absoluteRequest = Request.Get("http://replica/foo/bar"); response = new Response(ResponseCode.Ok); timeout = 5.Seconds(); connectionTimeout = null; replicaOrdering = Substitute.For <IReplicaOrdering>(); configuration = Substitute.For <IClusterClientConfiguration>(); configuration.ResponseCriteria.Returns(new List <IResponseCriterion> { Substitute.For <IResponseCriterion>() }); configuration.Logging.Returns( new LoggingOptions { LogReplicaRequests = true, LogReplicaResults = true }); configuration.ReplicaOrdering.Returns(replicaOrdering); configuration.Log.Returns(log = Substitute.For <ILog>()); log.IsEnabledFor(default).ReturnsForAnyArgs(true);
public void SetUp() { replica1 = new Uri("http://replica1"); replica2 = new Uri("http://replica2"); response1 = new Response(ResponseCode.Ok); response2 = new Response(ResponseCode.Ok); selectedResponse = new Response(ResponseCode.Ok); result1 = new ReplicaResult(replica1, response1, ResponseVerdict.DontKnow, TimeSpan.Zero); result2 = new ReplicaResult(replica2, response2, ResponseVerdict.DontKnow, TimeSpan.Zero); var log = new ConsoleLog(); context = new RequestContext(Request.Get("foo/bar"), Substitute.For <IRequestStrategy>(), Budget.Infinite, log, CancellationToken.None, null, int.MaxValue); // ReSharper disable AssignNullToNotNullAttribute context.Strategy.SendAsync(null, null, null, null, 0, default(CancellationToken)) // ReSharper restore AssignNullToNotNullAttribute .ReturnsForAnyArgs( async info => { var replicas = info.Arg <IEnumerable <Uri> >(); var sender = info.Arg <IRequestSender>(); foreach (var replica in replicas) { await sender.SendToReplicaAsync(replica, context.Request, TimeSpan.Zero, CancellationToken.None); } }); clusterProvider = Substitute.For <IClusterProvider>(); clusterProvider.GetCluster().Returns(new[] { replica1, replica2 }); requestSender = Substitute.For <IRequestSender>(); requestSender.SendToReplicaAsync(replica1, Arg.Any <Request>(), Arg.Any <TimeSpan>(), Arg.Any <CancellationToken>()).ReturnsTask(_ => result1); requestSender.SendToReplicaAsync(replica2, Arg.Any <Request>(), Arg.Any <TimeSpan>(), Arg.Any <CancellationToken>()).ReturnsTask(_ => result2); replicaOrdering = Substitute.For <IReplicaOrdering>(); // ReSharper disable AssignNullToNotNullAttribute replicaOrdering.Order(null, null, null).ReturnsForAnyArgs(info => info.Arg <IList <Uri> >().Reverse()); // ReSharper restore AssignNullToNotNullAttribute responseSelector = Substitute.For <IResponseSelector>(); // ReSharper disable once AssignNullToNotNullAttribute responseSelector.Select(null).ReturnsForAnyArgs(_ => selectedResponse); resultStatusSelector = Substitute.For <IClusterResultStatusSelector>(); // ReSharper disable AssignNullToNotNullAttribute resultStatusSelector.Select(null, null).ReturnsForAnyArgs(ClusterResultStatus.Success); // ReSharper restore AssignNullToNotNullAttribute storageProvider = Substitute.For <IReplicaStorageProvider>(); module = new RequestExecutionModule( clusterProvider, replicaOrdering, responseSelector, storageProvider, requestSender, resultStatusSelector); }
public RequestContext( Request request, RequestParameters parameters, IRequestTimeBudget budget, ILog log, IClusterProvider clusterProvider, IReplicaOrdering replicaOrdering, ITransport transport, int maximumReplicasToUse, int connectionAttempts, string clientApplicationName = null, CancellationToken cancellationToken = default) { Request = request; Budget = budget; Log = log; ClusterProvider = clusterProvider; ReplicaOrdering = replicaOrdering; Transport = transport; Parameters = parameters; CancellationToken = cancellationToken; MaximumReplicasToUse = maximumReplicasToUse; ConnectionAttempts = connectionAttempts; ClientApplicationName = clientApplicationName; ResetReplicaResults(); }
public RequestContextTuner(IRequestContext requestContext) { fallbackClusterProvider = requestContext.ClusterProvider; fallbackReplicaOrdering = requestContext.ReplicaOrdering; fallbackConnectionAttempts = requestContext.ConnectionAttempts; fallbackRequestStrategy = requestContext.Parameters.Strategy; }
public void TestSetup() { replica1 = new Uri("http://replica1"); replica2 = new Uri("http://replica2"); response1 = new Response(ResponseCode.Ok); response2 = new Response(ResponseCode.Ok); selectedResponse = new Response(ResponseCode.Ok); result1 = new ReplicaResult(replica1, response1, ResponseVerdict.DontKnow, TimeSpan.Zero); result2 = new ReplicaResult(replica2, response2, ResponseVerdict.DontKnow, TimeSpan.Zero); var parameters = RequestParameters.Empty .WithStrategy(Substitute.For <IRequestStrategy>()); clusterProvider = Substitute.For <IClusterProvider>(); clusterProvider.GetCluster().Returns(new[] { replica1, replica2 }); replicaOrdering = Substitute.For <IReplicaOrdering>(); replicaOrdering.Order(null, null, null, null).ReturnsForAnyArgs(info => info.Arg <IList <Uri> >().Reverse()); context = new RequestContext( Request.Get("foo/bar"), parameters, Budget.Infinite, new SilentLog(), clusterProvider, replicaOrdering, transport: default,
public void TestSetup() { replica1 = new Uri("http://replica1"); replica2 = new Uri("http://replica2"); response1 = new Response(ResponseCode.Ok); response2 = new Response(ResponseCode.Ok); selectedResponse = new Response(ResponseCode.Ok); result1 = new ReplicaResult(replica1, response1, ResponseVerdict.DontKnow, TimeSpan.Zero); result2 = new ReplicaResult(replica2, response2, ResponseVerdict.DontKnow, TimeSpan.Zero); var parameters = RequestParameters.Empty .WithStrategy(Substitute.For <IRequestStrategy>()); context = new RequestContext(Request.Get("foo/bar"), parameters, Budget.Infinite, new SilentLog(), null, int.MaxValue); context.Parameters.Strategy.SendAsync(null, null, null, null, null, 0, default) .ReturnsForAnyArgs( async info => { var replicas = info.Arg <IEnumerable <Uri> >(); var sender = info.Arg <IRequestSender>(); foreach (var replica in replicas) { await sender.SendToReplicaAsync(replica, context.Request, null, TimeSpan.Zero, CancellationToken.None); } }); clusterProvider = Substitute.For <IClusterProvider>(); clusterProvider.GetCluster().Returns(new[] { replica1, replica2 }); requestSender = Substitute.For <IRequestSenderInternal>(); requestSender.SendToReplicaAsync(Arg.Any <ITransport>(), replica1, Arg.Any <Request>(), Arg.Any <TimeSpan?>(), Arg.Any <TimeSpan>(), Arg.Any <CancellationToken>()).ReturnsTask(_ => result1); requestSender.SendToReplicaAsync(Arg.Any <ITransport>(), replica2, Arg.Any <Request>(), Arg.Any <TimeSpan?>(), Arg.Any <TimeSpan>(), Arg.Any <CancellationToken>()).ReturnsTask(_ => result2); replicaOrdering = Substitute.For <IReplicaOrdering>(); replicaOrdering.Order(null, null, null, null).ReturnsForAnyArgs(info => info.Arg <IList <Uri> >().Reverse()); responseSelector = Substitute.For <IResponseSelector>(); responseSelector.Select(null, null, null).ReturnsForAnyArgs(_ => selectedResponse); resultStatusSelector = Substitute.For <IClusterResultStatusSelector>(); resultStatusSelector.Select(null, null).ReturnsForAnyArgs(ClusterResultStatus.Success); storageProvider = Substitute.For <IReplicaStorageProvider>(); module = new RequestExecutionModule( clusterProvider, replicaOrdering, responseSelector, storageProvider, requestSender, resultStatusSelector); }
public RequestExecutionModule( IClusterProvider clusterProvider, IReplicaOrdering replicaOrdering, IResponseSelector responseSelector, IReplicaStorageProvider storageProvider, IRequestSender requestSender, IClusterResultStatusSelector resultStatusSelector) { this.clusterProvider = clusterProvider; this.replicaOrdering = replicaOrdering; this.responseSelector = responseSelector; this.storageProvider = storageProvider; this.requestSender = requestSender; this.resultStatusSelector = resultStatusSelector; }