Beispiel #1
0
        private async Task <CosmosMultipleResponse <TEntity> > ExecuteMultiOperationAsync(IEnumerable <TEntity> entities,
                                                                                          Func <TEntity, Task <CosmosResponse <TEntity> > > operationFunc)
        {
            var entitiesList = entities.ToList();

            if (!entitiesList.Any())
            {
                return(new CosmosMultipleResponse <TEntity>());
            }

            try
            {
                var multipleResponse = await _cosmosScaler.UpscaleCollectionIfConfiguredAsSuch(entitiesList, DatabaseName, CollectionName, operationFunc);

                var results = (await entitiesList.Select(operationFunc).WhenAllTasksAsync()).ToList();
                multipleResponse.SuccessfulEntities.AddRange(results.Where(x => x.IsSuccess));
                multipleResponse.FailedEntities.AddRange(results.Where(x => !x.IsSuccess));
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                return(multipleResponse);
            }
            catch (Exception)
            {
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                throw;
            }
        }
Beispiel #2
0
        private async Task <CosmosMultipleResponse <TEntity> > ExecuteMultiOperationAsync(IEnumerable <TEntity> entities,
                                                                                          Func <TEntity, Task <CosmosResponse <TEntity> > > operationFunc)
        {
            var entitiesList = entities.ToList();

            if (!entitiesList.Any())
            {
                return(new CosmosMultipleResponse <TEntity>());
            }

            try
            {
                var multipleResponse = await _cosmosScaler.UpscaleCollectionIfConfiguredAsSuch(entitiesList, DatabaseName, CollectionName, operationFunc);

                var multiOperationEntitiesTasks = entitiesList.Select(operationFunc);
                var operationResult             = await HandleOperationWithRateLimitRetry(multiOperationEntitiesTasks, operationFunc);

                multipleResponse.SuccessfulEntities.AddRange(operationResult.SuccessfulEntities);
                multipleResponse.FailedEntities.AddRange(operationResult.FailedEntities);
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                return(multipleResponse);
            }
            catch (Exception exception)
            {
                await _cosmosScaler.DownscaleCollectionRequestUnitsToDefault(DatabaseName, CollectionName);

                if (exception is DocumentClientException documentClientException)
                {
                    return(new CosmosMultipleResponse <TEntity>(documentClientException));
                }
                throw;
            }
        }
        public async Task WhenCollectionIsDownScaled_AndAutomaticScalingIsTurnedOff_ThenOfferDoesNotChange()
        {
            var catStore = new CosmosStore <Cat>(new CosmosStoreSettings(_databaseId, _emulatorUri, _emulatorKey,
                                                                         settings =>
            {
                settings.DefaultCollectionThroughput = 500;
            }), _collectionName);
            var cosmosScaler = new CosmosScaler <Cat>(catStore);

            var preScaleOffer = await catStore.CosmonautClient.GetOfferV2ForCollectionAsync(_databaseId, _collectionName);

            await cosmosScaler.DownscaleCollectionRequestUnitsToDefault(_databaseId, _collectionName);

            var postScaleOffer = await catStore.CosmonautClient.GetOfferV2ForCollectionAsync(_databaseId, _collectionName);

            preScaleOffer.Content.OfferThroughput.Should().Be(500);
            postScaleOffer.Content.OfferThroughput.Should().Be(500);
        }