internal async Task <CosmosMultipleResponse <TEntity> > HandleOperationWithRateLimitRetry(IEnumerable <Task <CosmosResponse <TEntity> > > entitiesTasks, Func <TEntity, Task <CosmosResponse <TEntity> > > operationFunc) { var response = new CosmosMultipleResponse <TEntity>(); var results = (await Task.WhenAll(entitiesTasks)).ToList(); async Task RetryPotentialRateLimitFailures() { var failedBecauseOfRateLimit = results.Where(x => x.CosmosOperationStatus == CosmosOperationStatus.RequestRateIsLarge).ToList(); if (!failedBecauseOfRateLimit.Any()) { return; } results.RemoveAll(x => x.CosmosOperationStatus == CosmosOperationStatus.RequestRateIsLarge); entitiesTasks = failedBecauseOfRateLimit.Select(entity => operationFunc(entity.Entity)); results.AddRange(await Task.WhenAll(entitiesTasks)); await RetryPotentialRateLimitFailures(); } await RetryPotentialRateLimitFailures(); response.FailedEntities.AddRange(results.Where(x => !x.IsSuccess)); return(response); }
public async Task <CosmosMultipleResponse <TEntity> > UpdateRangeAsync(IEnumerable <TEntity> entities) { var response = new CosmosMultipleResponse <TEntity>(); foreach (var entity in entities) { var result = await UpdateAsync(entity); if (!result.IsSuccess) { response.FailedEntities.Add(result); } } return(response); }
public async Task <CosmosMultipleResponse <TEntity> > RemoveAsync(Expression <Func <TEntity, bool> > predicate) { var toRemove = _store.Values.Where(predicate.Compile()).ToList(); var response = new CosmosMultipleResponse <TEntity>(); foreach (var entity in toRemove) { var result = await RemoveAsync(entity); if (!result.IsSuccess) { response.FailedEntities.Add(result); } } return(response); }
internal async Task <CosmosMultipleResponse <TEntity> > UpscaleCollectionIfConfiguredAsSuch(List <TEntity> entitiesList, string databaseId, string collectionId, Func <TEntity, Task <CosmosResponse <TEntity> > > operationAsync) { var multipleResponse = new CosmosMultipleResponse <TEntity>(); if (!_cosmosStore.Settings.ScaleCollectionRUsAutomatically) { return(multipleResponse); } var sampleResponse = await HandleUpscalingForRangeOperation(entitiesList, databaseId, collectionId, operationAsync); multipleResponse.AddResponse(sampleResponse); return(multipleResponse); }
private async Task <CosmosMultipleResponse <TEntity> > ExecuteMultiOperationAsync(IEnumerable <TEntity> entities, Func <TEntity, Task <CosmosResponse <TEntity> > > operationFunc) { var multipleResponse = new CosmosMultipleResponse <TEntity>(); var entitiesList = entities.ToList(); if (!entitiesList.Any()) { return(multipleResponse); } var results = (await entitiesList.Select(operationFunc).WhenAllTasksAsync()).ToList(); multipleResponse.SuccessfulEntities.AddRange(results.Where(x => x.IsSuccess)); multipleResponse.FailedEntities.AddRange(results.Where(x => !x.IsSuccess)); return(multipleResponse); }