Exemple #1
0
        public async Task ExecuteAsync(EnsurePoolSize command, CancellationToken cancellationToken)
        {
            var vacantInstanceTarget = await repository.GetVacantInstanceTargetAsync(cancellationToken);

            var vacantInstanceCount = await repository.GetVacantInstanceCountAsync(cancellationToken);

            var vacantInstanceDeficit = vacantInstanceTarget - vacantInstanceCount;

            telemetryClient.GetMetric("pools.vacant.count").TrackValue(vacantInstanceCount);
            telemetryClient.GetMetric("pools.vacant.target").TrackValue(vacantInstanceTarget);
            telemetryClient.GetMetric("pools.vacant.deficit").TrackValue(vacantInstanceDeficit);

            if (vacantInstanceDeficit == 0)
            {
                return;
            }

            while (vacantInstanceDeficit > 0)
            {
                var allocationBlockSize = await repository.GetAllocationBlockSizeAsync(cancellationToken);

                telemetryClient.GetMetric("pools.vacant.block.size").TrackValue(vacantInstanceTarget);
                using (telemetryClient.TrackMetricTimer("pools.vacant.grow.block.time"))
                {
                    Task[] addTasks = new Task[Math.Min(allocationBlockSize, vacantInstanceDeficit)];
                    for (var i = 0; i < addTasks.Length; i++)
                    {
                        addTasks[i] = addVacantInstance.ExecuteAsync(new PushVacantInstance(), cancellationToken);
                        vacantInstanceDeficit--;
                    }

                    await Task.WhenAll(addTasks);
                }
            }
        }