Skip to content

Commit 141246f

Browse files
committed
Moved cosmos job hosting to use unified retry logic
1 parent bc6b453 commit 141246f

File tree

6 files changed

+48
-18
lines changed

6 files changed

+48
-18
lines changed

src/Microsoft.Health.Fhir.Core.UnitTests/Features/Operations/Reindex/ReindexJobWorkerTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
using System.Threading.Tasks;
1010
using Microsoft.Extensions.Logging.Abstractions;
1111
using Microsoft.Extensions.Options;
12+
using Microsoft.Health.Core.Features.Context;
1213
using Microsoft.Health.Extensions.DependencyInjection;
1314
using Microsoft.Health.Fhir.Core.Configs;
15+
using Microsoft.Health.Fhir.Core.Features.Context;
1416
using Microsoft.Health.Fhir.Core.Features.Operations;
1517
using Microsoft.Health.Fhir.Core.Features.Operations.Reindex;
1618
using Microsoft.Health.Fhir.Core.Features.Operations.Reindex.Models;
@@ -59,6 +61,7 @@ public ReindexJobWorkerTests()
5961
Options.Create(_reindexJobConfiguration),
6062
_reindexJobTask.CreateMockScopeProvider(),
6163
searchParameterOperations,
64+
Substitute.For<RequestContextAccessor<IFhirRequestContext>>(),
6265
NullLogger<ReindexJobWorker>.Instance);
6366

6467
_reindexJobWorker.Handle(new Messages.Search.SearchParametersInitializedNotification(), CancellationToken.None);

src/Microsoft.Health.Fhir.Core/Features/Operations/Reindex/ReindexJobWorker.cs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@
1212
using MediatR;
1313
using Microsoft.Extensions.Logging;
1414
using Microsoft.Extensions.Options;
15+
using Microsoft.Extensions.Primitives;
16+
using Microsoft.Health.Core.Features.Context;
1517
using Microsoft.Health.Extensions.DependencyInjection;
1618
using Microsoft.Health.Fhir.Core.Configs;
19+
using Microsoft.Health.Fhir.Core.Features.Context;
1720
using Microsoft.Health.Fhir.Core.Features.Operations.Reindex.Models;
1821
using Microsoft.Health.Fhir.Core.Features.Search.Parameters;
1922
using Microsoft.Health.Fhir.Core.Messages.Search;
@@ -29,6 +32,7 @@ public class ReindexJobWorker : INotificationHandler<SearchParametersInitialized
2932
private readonly ReindexJobConfiguration _reindexJobConfiguration;
3033
private readonly IScopeProvider<IReindexJobTask> _reindexJobTaskFactory;
3134
private readonly ISearchParameterOperations _searchParameterOperations;
35+
private readonly RequestContextAccessor<IFhirRequestContext> _contextAccessor;
3236
private readonly ILogger _logger;
3337
private bool _searchParametersInitialized = false;
3438

@@ -37,19 +41,15 @@ public ReindexJobWorker(
3741
IOptions<ReindexJobConfiguration> reindexJobConfiguration,
3842
IScopeProvider<IReindexJobTask> reindexJobTaskFactory,
3943
ISearchParameterOperations searchParameterOperations,
44+
RequestContextAccessor<IFhirRequestContext> contextAccessor,
4045
ILogger<ReindexJobWorker> logger)
4146
{
42-
EnsureArg.IsNotNull(fhirOperationDataStoreFactory, nameof(fhirOperationDataStoreFactory));
43-
EnsureArg.IsNotNull(reindexJobConfiguration?.Value, nameof(reindexJobConfiguration));
44-
EnsureArg.IsNotNull(reindexJobTaskFactory, nameof(reindexJobTaskFactory));
45-
EnsureArg.IsNotNull(searchParameterOperations, nameof(searchParameterOperations));
46-
EnsureArg.IsNotNull(logger, nameof(logger));
47-
48-
_fhirOperationDataStoreFactory = fhirOperationDataStoreFactory;
49-
_reindexJobConfiguration = reindexJobConfiguration.Value;
50-
_reindexJobTaskFactory = reindexJobTaskFactory;
51-
_searchParameterOperations = searchParameterOperations;
52-
_logger = logger;
47+
_fhirOperationDataStoreFactory = EnsureArg.IsNotNull(fhirOperationDataStoreFactory, nameof(fhirOperationDataStoreFactory));
48+
_reindexJobConfiguration = EnsureArg.IsNotNull(reindexJobConfiguration?.Value, nameof(reindexJobConfiguration));
49+
_reindexJobTaskFactory = EnsureArg.IsNotNull(reindexJobTaskFactory, nameof(reindexJobTaskFactory));
50+
_searchParameterOperations = EnsureArg.IsNotNull(searchParameterOperations, nameof(searchParameterOperations));
51+
_contextAccessor = EnsureArg.IsNotNull(contextAccessor, nameof(contextAccessor));
52+
_logger = EnsureArg.IsNotNull(logger, nameof(logger));
5353
}
5454

5555
public async Task ExecuteAsync(CancellationToken cancellationToken)
@@ -60,6 +60,18 @@ public async Task ExecuteAsync(CancellationToken cancellationToken)
6060
{
6161
if (_searchParametersInitialized)
6262
{
63+
// Create a background task context to trigger the correct retry policy.
64+
var fhirRequestContext = new FhirRequestContext(
65+
method: nameof(ReindexJobWorker),
66+
uriString: string.Empty,
67+
baseUriString: string.Empty,
68+
correlationId: string.Empty,
69+
requestHeaders: new Dictionary<string, StringValues>(),
70+
responseHeaders: new Dictionary<string, StringValues>())
71+
{
72+
IsBackgroundTask = true,
73+
};
74+
6375
// Check for any changes to Search Parameters
6476
try
6577
{

src/Microsoft.Health.Fhir.CosmosDb/Features/Storage/Queues/CosmosQueueClient.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,21 @@
1212
using System.Threading.Tasks;
1313
using EnsureThat;
1414
using Microsoft.Azure.Cosmos;
15+
using Microsoft.Build.Framework;
16+
using Microsoft.Extensions.Logging;
17+
using Microsoft.Extensions.Primitives;
1518
using Microsoft.Health.Abstractions.Exceptions;
1619
using Microsoft.Health.Core;
1720
using Microsoft.Health.Core.Extensions;
21+
using Microsoft.Health.Core.Features.Context;
1822
using Microsoft.Health.Extensions.DependencyInjection;
1923
using Microsoft.Health.Fhir.Core.Extensions;
24+
using Microsoft.Health.Fhir.Core.Features.Context;
2025
using Microsoft.Health.Fhir.CosmosDb.Core.Features.Storage;
2126
using Microsoft.Health.Fhir.CosmosDb.Features.Queries;
2227
using Microsoft.Health.JobManagement;
2328
using Polly;
29+
using Polly.Retry;
2430

2531
namespace Microsoft.Health.Fhir.CosmosDb.Features.Storage.Queues;
2632

@@ -29,20 +35,24 @@ public class CosmosQueueClient : IQueueClient
2935
private readonly Func<IScoped<Container>> _containerFactory;
3036
private readonly ICosmosQueryFactory _queryFactory;
3137
private readonly ICosmosDbDistributedLockFactory _distributedLockFactory;
32-
private static readonly AsyncPolicy _retryPolicy = Policy
33-
.Handle<CosmosException>(ex => ex.StatusCode == HttpStatusCode.PreconditionFailed)
34-
.Or<CosmosException>(ex => ex.StatusCode == HttpStatusCode.TooManyRequests)
35-
.Or<RequestRateExceededException>()
36-
.WaitAndRetryAsync(5, _ => TimeSpan.FromMilliseconds(RandomNumberGenerator.GetInt32(100, 1000)));
38+
private readonly RetryExceptionPolicyFactory _retryExceptionPolicyFactory;
39+
private readonly ILogger<CosmosQueueClient> _logger;
40+
private readonly AsyncPolicy _retryPolicy;
3741

3842
public CosmosQueueClient(
3943
Func<IScoped<Container>> containerFactory,
4044
ICosmosQueryFactory queryFactory,
41-
ICosmosDbDistributedLockFactory distributedLockFactory)
45+
ICosmosDbDistributedLockFactory distributedLockFactory,
46+
RetryExceptionPolicyFactory retryExceptionPolicyFactor,
47+
ILogger<CosmosQueueClient> logger)
4248
{
4349
_containerFactory = EnsureArg.IsNotNull(containerFactory, nameof(containerFactory));
4450
_queryFactory = EnsureArg.IsNotNull(queryFactory, nameof(queryFactory));
4551
_distributedLockFactory = EnsureArg.IsNotNull(distributedLockFactory, nameof(distributedLockFactory));
52+
_retryExceptionPolicyFactory = EnsureArg.IsNotNull(retryExceptionPolicyFactor, nameof(retryExceptionPolicyFactor));
53+
_logger = EnsureArg.IsNotNull(logger, nameof(logger));
54+
55+
_retryPolicy = _retryExceptionPolicyFactory.BackgroundWorkerRetryPolicy;
4656
}
4757

4858
public bool IsInitialized() => true;

src/Microsoft.Health.Fhir.CosmosDb/Features/Storage/RetryExceptionPolicyFactory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public AsyncPolicy RetryPolicy
5454
}
5555
}
5656

57+
public AsyncPolicy BackgroundWorkerRetryPolicy => _backgroundJobRetryPolicy;
58+
5759
private static AsyncRetryPolicy CreateExtendedRetryPolicy(int maxRetries, int maxWaitTimeInSeconds)
5860
{
5961
return Policy.Handle<RequestRateExceededException>()

test/Microsoft.Health.Fhir.Shared.Tests.Integration/Features/Operations/Reindex/ReindexJobTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,7 @@ private async Task<CreateReindexResponse> SetUpForReindexing(CreateReindexReques
899899
Options.Create(_jobConfiguration),
900900
InitializeReindexJobTask().CreateMockScopeProvider(),
901901
_searchParameterOperations,
902+
Substitute.For<RequestContextAccessor<IFhirRequestContext>>(),
902903
NullLogger<ReindexJobWorker>.Instance);
903904

904905
await _reindexJobWorker.Handle(new SearchParametersInitializedNotification(), CancellationToken.None);

test/Microsoft.Health.Fhir.Shared.Tests.Integration/Persistence/CosmosDbFhirStorageTestsFixture.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,9 @@ public virtual async Task InitializeAsync()
232232
_queueClient = new CosmosQueueClient(
233233
() => _container.CreateMockScope(),
234234
new CosmosQueryFactory(Substitute.For<ICosmosResponseProcessor>(), Substitute.For<ICosmosQueryLogger>()),
235-
new CosmosDbDistributedLockFactory(() => _container.CreateMockScope(), NullLogger<CosmosDbDistributedLock>.Instance));
235+
new CosmosDbDistributedLockFactory(() => _container.CreateMockScope(), NullLogger<CosmosDbDistributedLock>.Instance),
236+
retryExceptionPolicyFactory,
237+
NullLogger<CosmosQueueClient>.Instance);
236238

237239
_cosmosFhirOperationDataStore = new CosmosFhirOperationDataStore(
238240
_queueClient,

0 commit comments

Comments
 (0)