public async Task ScaleDownIncrementally() { IList <CosmosDbScalingCollectionSettings> settingsToUpdate = new List <CosmosDbScalingCollectionSettings>(); IEnumerable <CosmosDbScalingCollectionSettings> collectionsToProcess = await _scalingConfigRepositoryPolicy.ExecuteAsync(() => _cosmosDbScalingConfigRepository.GetCollectionSettingsIncremented(previousMinutestoCheckForScaledCollections)); if (collectionsToProcess.IsNullOrEmpty()) { return; } _logger.Information($"Found {collectionsToProcess.Count()} collections to scale down"); foreach (CosmosDbScalingCollectionSettings settings in collectionsToProcess) { try { int requestUnitsToDecrement; if ((settings.CurrentRequestUnits - settings.LastScalingIncrementValue) < settings.MinRequestUnits) { requestUnitsToDecrement = (settings.CurrentRequestUnits - settings.MinRequestUnits); if (requestUnitsToDecrement <= 0) { continue; } } else { requestUnitsToDecrement = settings.LastScalingIncrementValue; } int requestUnits = settings.CurrentRequestUnits - requestUnitsToDecrement; settings.CurrentRequestUnits = requestUnits; await ScaleCollection(settings.CosmosCollectionType, requestUnits); await UpdateCollectionSettings(settings, CosmosDbScalingDirection.Down, requestUnitsToDecrement); } catch (Exception ex) { throw new RetriableException($"Failed to scale down collection for repository type '{settings.CosmosCollectionType}'", ex); } } }
public async Task ScaleDownIncrementally() { IEnumerable <CosmosDbScalingCollectionSettings> collectionsToProcess = await _scalingConfigRepositoryPolicy.ExecuteAsync(() => _cosmosDbScalingConfigRepository.GetCollectionSettingsIncremented(previousMinutestoCheckForScaledCollections)); if (collectionsToProcess.IsNullOrEmpty()) { return; } _logger.Information($"Found {collectionsToProcess.Count()} collections to scale down"); foreach (CosmosDbScalingCollectionSettings settings in collectionsToProcess) { try { int previousCurrentRequestUnits = settings.CurrentRequestUnits; settings.CurrentRequestUnits = Math.Max(previousCurrentRequestUnits - settings.LastScalingIncrementValue, settings.MinRequestUnits); int?minimumRequestUnitsAllowed = await GetMinimumThroughput(settings.CosmosCollectionType); if (minimumRequestUnitsAllowed.HasValue && settings.CurrentRequestUnits < minimumRequestUnitsAllowed.Value) { settings.CurrentRequestUnits = minimumRequestUnitsAllowed.Value; } int requestUnitsToDecrement = previousCurrentRequestUnits - settings.CurrentRequestUnits; if (requestUnitsToDecrement <= 0) { continue; } settings.CurrentRequestUnits = await ScaleCollection(settings.CosmosCollectionType, settings.CurrentRequestUnits, settings.MaxRequestUnits); await UpdateCollectionSettings(settings, CosmosDbScalingDirection.Down, requestUnitsToDecrement); } catch (Exception ex) { throw new RetriableException($"Failed to scale down collection for repository type '{settings.CosmosCollectionType}'", ex); } } }