/// <summary> /// Adds an <see cref="AdaptiveHealthModifier{T}"/> with <see cref="AdaptiveHealthWithoutDecay"/> and given <paramref name="tuningPolicy"/>. /// </summary> /// <param name="builder"></param> /// <param name="tuningPolicy">A health tuning policy. See <see cref="IAdaptiveHealthTuningPolicy"/> and <see cref="TuningPolicies"/> for details.</param> /// <param name="upMultiplier">A multiplier used to increase health. See <see cref="AdaptiveHealthWithoutDecay"/> for details.</param> /// <param name="downMultiplier">A multiplier used to decrease health. See <see cref="AdaptiveHealthWithoutDecay"/> for details.</param> /// <param name="minimumHealthValue">A minimum possible health value. See <see cref="AdaptiveHealthWithoutDecay"/> for details.</param> public static void AddAdaptiveHealthModifierWithoutDecay( this IWeighedReplicaOrderingBuilder builder, IAdaptiveHealthTuningPolicy tuningPolicy, double upMultiplier = ClusterClientDefaults.AdaptiveHealthUpMultiplier, double downMultiplier = ClusterClientDefaults.AdaptiveHealthDownMultiplier, double minimumHealthValue = ClusterClientDefaults.AdaptiveHealthMinimumValue) => builder.AddModifier(new AdaptiveHealthModifier <double>(new AdaptiveHealthWithoutDecay(upMultiplier, downMultiplier, minimumHealthValue), tuningPolicy, builder.Log));
/// <summary> /// Adds an <see cref="AdaptiveHealthModifier{T}"/> with <see cref="AdaptiveHealthWithLinearDecay"/> and given <paramref name="tuningPolicy"/>. /// </summary> /// <param name="builder"></param> /// <param name="tuningPolicy">A health tuning policy. See <see cref="IAdaptiveHealthTuningPolicy"/> and <see cref="TuningPolicies"/> for details.</param> /// <param name="decayDuration">A duration of full health damage decay. See <see cref="AdaptiveHealthWithLinearDecay"/> for details.</param> /// <param name="upMultiplier">A multiplier used to increase health. See <see cref="AdaptiveHealthWithLinearDecay"/> for details.</param> /// <param name="downMultiplier">A multiplier used to decrease health. See <see cref="AdaptiveHealthWithLinearDecay"/> for details.</param> /// <param name="minimumHealthValue">A minimum possible health value. See <see cref="AdaptiveHealthWithLinearDecay"/> for details.</param> public static void AddAdaptiveHealthModifierWithLinearDecay( this IWeighedReplicaOrderingBuilder builder, IAdaptiveHealthTuningPolicy tuningPolicy, TimeSpan decayDuration, double upMultiplier = ClusterClientDefaults.AdaptiveHealthUpMultiplier, double downMultiplier = ClusterClientDefaults.AdaptiveHealthDownMultiplier, double minimumHealthValue = ClusterClientDefaults.AdaptiveHealthMinimumValue) => builder.AddModifier(new AdaptiveHealthModifier <HealthWithDecay>(new AdaptiveHealthWithLinearDecay(() => DateTime.UtcNow, decayDuration, upMultiplier, downMultiplier, minimumHealthValue), tuningPolicy, builder.Log));
public AdaptiveHealthModifier(IAdaptiveHealthImplementation <THealth> implementation, IAdaptiveHealthTuningPolicy tuningPolicy, ILog log) { this.implementation = implementation; this.tuningPolicy = tuningPolicy; this.log = log ?? new SilentLog(); storageKey = implementation.GetType().FullName; }
public void SetUp() { replica1 = new Uri("http://replica1"); replica2 = new Uri("http://replica2"); replicas = new List <Uri> { replica1, replica2 }; request = Request.Get("foo/bar"); storageProvider = Substitute.For <IReplicaStorageProvider>(); storageProvider.Obtain <int>(Arg.Any <string>()).Returns(storage = new ConcurrentDictionary <Uri, int>()); implementation = Substitute.For <IAdaptiveHealthImplementation <int> >(); tuningPolicy = Substitute.For <IAdaptiveHealthTuningPolicy>(); modifier = new AdaptiveHealthModifier <int>(implementation, tuningPolicy, log = new ConsoleLog()); }
public void Should_return_correct_action_based_on_constituents_decisions(AdaptiveHealthAction expected, params AdaptiveHealthAction[] actions) { var result = new ReplicaResult(new Uri("http://replica"), Responses.Timeout, ResponseVerdict.Accept, TimeSpan.Zero); var policies = new IAdaptiveHealthTuningPolicy[actions.Length]; for (var i = 0; i < actions.Length; i++) { policies[i] = Substitute.For <IAdaptiveHealthTuningPolicy>(); policies[i].SelectAction(result).Returns(actions[i]); } var compositePolicy = new CompositeTuningPolicy(policies); compositePolicy.SelectAction(result).Should().Be(expected); }