Skip to content

Commit a978efd

Browse files
pmachapmanRaymondLuong3
authored andcommitted
Add a 5 minute timeout for HTTP requests to Serval
1 parent b611bc9 commit a978efd

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

src/SIL.XForge.Scripture/Services/MachineServiceCollectionExtensions.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
using System;
2-
using System.Diagnostics.CodeAnalysis;
32
using System.Net;
43
using System.Net.Http;
54
using Duende.IdentityModel.Client;
65
using Microsoft.AspNetCore.Hosting;
76
using Microsoft.Extensions.Configuration;
87
using Microsoft.Extensions.Hosting;
98
using Polly;
9+
using Polly.CircuitBreaker;
10+
using Polly.Retry;
11+
using Polly.Timeout;
1012
using Serval.Client;
1113
using SIL.XForge.Configuration;
1214
using SIL.XForge.Scripture.Models;
1315
using SIL.XForge.Scripture.Services;
1416

1517
namespace Microsoft.Extensions.DependencyInjection;
1618

17-
[ExcludeFromCodeCoverage(Justification = "This logic will only work in a valid ASP.NET Core Context")]
1819
public static class MachineServiceCollectionExtensions
1920
{
2021
public static IServiceCollection AddSFMachine(
@@ -59,7 +60,8 @@ IWebHostEnvironment env
5960
.AddHttpClient(MachineApi.HttpClientName)
6061
.SetHandlerLifetime(TimeSpan.FromMinutes(5))
6162
.AddPolicyHandler(GetRetryPolicy())
62-
.AddPolicyHandler(GetCircuitBreakerPolicy());
63+
.AddPolicyHandler(GetCircuitBreakerPolicy())
64+
.AddPolicyHandler(GetTimeoutPolicy());
6365
services.AddSingleton<ITranslationEnginesClient, TranslationEnginesClient>(sp =>
6466
{
6567
// Instantiate the translation engines client with our named HTTP client
@@ -95,15 +97,20 @@ IWebHostEnvironment env
9597
return services;
9698
}
9799

98-
private static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy() =>
100+
private static AsyncRetryPolicy<HttpResponseMessage> GetRetryPolicy() =>
99101
Policy<HttpResponseMessage>
100102
.Handle<HttpRequestException>()
101103
.OrResult(r => r.StatusCode >= HttpStatusCode.InternalServerError)
102104
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
103105

104-
private static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy() =>
106+
private static AsyncCircuitBreakerPolicy<HttpResponseMessage> GetCircuitBreakerPolicy() =>
105107
Policy<HttpResponseMessage>
106108
.Handle<HttpRequestException>()
107109
.OrResult(r => r.StatusCode >= HttpStatusCode.InternalServerError)
108110
.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
111+
112+
private static AsyncTimeoutPolicy<HttpResponseMessage> GetTimeoutPolicy() =>
113+
// NOTE: The Serval Get Build endpoint has a long polling timeout of 40 seconds,
114+
// so ensure any timeout values support this
115+
Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromMinutes(5), TimeoutStrategy.Pessimistic);
109116
}

0 commit comments

Comments
 (0)