private void ScheduleForkIfNeeded(List <Task> currentTasks, Request request, IRequestTimeBudget budget, int currentReplicaIndex, int totalReplicas, CancellationToken cancellationToken)
        {
            if (currentReplicaIndex == totalReplicas - 1)
            {
                return;
            }

            if (currentTasks.Count >= maximumParallelism)
            {
                return;
            }

            var forkingDelay = delaysProvider.GetForkingDelay(request, budget, currentReplicaIndex, totalReplicas);

            if (forkingDelay == null)
            {
                return;
            }

            if (forkingDelay.Value < TimeSpan.Zero)
            {
                return;
            }

            if (forkingDelay.Value >= budget.Remaining)
            {
                return;
            }

            currentTasks.Add(delaysPlanner.Plan(forkingDelay.Value, cancellationToken));
        }
Example #2
0
        private void SetupDelaysPlanner()
        {
            delaysPlanner
            .Plan(Arg.Any <TimeSpan>(), Arg.Any <CancellationToken>())
            .Returns(
                _ =>
            {
                delaySourcesEnumerator.MoveNext();

                return(delaySourcesEnumerator.Current.Task);
            });
        }