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); }
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)); }
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); } }
public async Task <HttpStatusCode> UpdateConfigSettings(CosmosDbScalingConfig settings) { Guard.ArgumentNotNull(settings, nameof(settings)); return(await _cosmosRepository.UpsertAsync(settings)); }