예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }