Exemplo n.º 1
0
        private async Task ScaleUpCollection(CosmosDbScalingConfig cosmosDbScalingConfig, string jobDefinitionId)
        {
            Guard.ArgumentNotNull(cosmosDbScalingConfig, nameof(cosmosDbScalingConfig));
            Guard.IsNullOrWhiteSpace(jobDefinitionId, nameof(jobDefinitionId));

            CosmosDbScalingJobConfig cosmosDbScalingJobConfig = cosmosDbScalingConfig.JobRequestUnitConfigs
                                                                .FirstOrDefault(m => string.Equals(
                                                                                    m.JobDefinitionId,
                                                                                    jobDefinitionId,
                                                                                    StringComparison.InvariantCultureIgnoreCase));

            if (cosmosDbScalingJobConfig == null)
            {
                string errorMessage = $"A job config does not exist for job definition id {jobDefinitionId}";

                _logger.Error(errorMessage);
                throw new NonRetriableException(errorMessage);
            }

            CosmosDbScalingCollectionSettings settings = await _scalingConfigRepositoryPolicy.ExecuteAsync(() =>
                                                                                                           _cosmosDbScalingConfigRepository.GetCollectionSettingsByRepositoryType(cosmosDbScalingConfig.RepositoryType));

            if (settings == null)
            {
                string errorMessage = $"A collections settings file does not exist for settings collection type: '{cosmosDbScalingConfig.RepositoryType}'";

                _logger.Error(errorMessage);
                throw new RetriableException(errorMessage);
            }

            int currentRequestUnits = settings.CurrentRequestUnits;

            if (settings.IsAtBaseLine)
            {
                settings.CurrentRequestUnits = cosmosDbScalingJobConfig.JobRequestUnits;
            }
            else
            {
                settings.CurrentRequestUnits =
                    settings.AvailableRequestUnits >= cosmosDbScalingJobConfig.JobRequestUnits ?
                    (settings.CurrentRequestUnits + cosmosDbScalingJobConfig.JobRequestUnits) :
                    settings.MaxRequestUnits;
            }

            await ScaleCollection(cosmosDbScalingConfig.RepositoryType, settings.CurrentRequestUnits);

            int incrementalRequestUnitsValue = currentRequestUnits - settings.CurrentRequestUnits;

            await UpdateCollectionSettings(settings, CosmosDbScalingDirection.Up, incrementalRequestUnitsValue);
        }
Exemplo n.º 2
0
        public async Task ScaleUp(Message message)
        {
            Guard.ArgumentNotNull(message, nameof(message));

            JobNotification jobNotification = message.GetPayloadAsInstanceOf <JobNotification>();

            Guard.ArgumentNotNull(jobNotification, "Null message payload provided");

            if (jobNotification.RunningStatus == RunningStatus.Completed || jobNotification.RunningStatus == RunningStatus.InProgress)
            {
                return;
            }

            CosmosDbScalingRequestModel requestModel = _cosmosDbScalingRequestModelBuilder.BuildRequestModel(jobNotification);

            if (requestModel.RepositoryTypes.IsNullOrEmpty())
            {
                return;
            }

            foreach (CosmosCollectionType cosmosRepositoryType in requestModel.RepositoryTypes)
            {
                try
                {
                    CosmosDbScalingConfig cosmosDbScalingConfig = await _scalingConfigRepositoryPolicy.ExecuteAsync(() => _cosmosDbScalingConfigRepository.GetConfigByRepositoryType(cosmosRepositoryType));

                    await ScaleUpCollection(cosmosDbScalingConfig, requestModel.JobDefinitionId);
                }
                catch (Exception ex)
                {
                    string errorMessage = "Failed to increase cosmosdb request units";
                    _logger.Error(ex, errorMessage);

                    throw new RetriableException(errorMessage, ex);
                }
            }

            await _cacheProviderPolicy.ExecuteAsync(() => _cacheProvider.RemoveAsync <List <CosmosDbScalingConfig> >(CacheKeys.AllCosmosScalingConfigs));
        }
Exemplo n.º 3
0
        private async Task SaveScalingConfig(ScalingConfigurationUpdateModel scalingConfigurationUpdate)
        {
            CosmosDbScalingConfig cosmosDbScalingConfig = await _cosmosDbScalingConfigRepository.GetConfigByRepositoryType(scalingConfigurationUpdate.RepositoryType);

            if (cosmosDbScalingConfig == null)
            {
                cosmosDbScalingConfig = new CosmosDbScalingConfig()
                {
                    Id             = Guid.NewGuid().ToString(),
                    RepositoryType = scalingConfigurationUpdate.RepositoryType,
                };
            }
            cosmosDbScalingConfig.JobRequestUnitConfigs = scalingConfigurationUpdate.JobRequestUnitConfigs;

            HttpStatusCode statusCode = await _scalingConfigRepositoryPolicy.ExecuteAsync(
                () => _cosmosDbScalingConfigRepository.UpdateConfigSettings(cosmosDbScalingConfig));

            if (!statusCode.IsSuccess())
            {
                string errorMessage = $"Failed to Insert or Update config setting repository type: '{scalingConfigurationUpdate.RepositoryType}'  with status code: '{statusCode}'";
                _logger.Error(errorMessage);
                throw new RetriableException(errorMessage);
            }
        }
Exemplo n.º 4
0
        public async Task <HttpStatusCode> UpdateConfigSettings(CosmosDbScalingConfig settings)
        {
            Guard.ArgumentNotNull(settings, nameof(settings));

            return(await _cosmosRepository.UpsertAsync(settings));
        }