use of com.linkedin.d2.D2RelativeStrategyProperties in project rest.li by linkedin.
the class TestLoadBalancerStrategy method testSlowStart.
@Test(dataProvider = "strategy", retryAnalyzer = SingleRetry.class)
public void testSlowStart(loadBalancerStrategyType type) {
Map<String, String> degraderPropertiesWithSlowStart = new HashMap<>();
D2RelativeStrategyProperties relativePropertiesWithSlowStart = new D2RelativeStrategyProperties();
degraderPropertiesWithSlowStart.put(PropertyKeys.DEGRADER_SLOW_START_THRESHOLD, "0.2");
relativePropertiesWithSlowStart.setSlowStartThreshold(0.2);
LoadBalancerStrategyTestRunnerBuilder builder = new LoadBalancerStrategyTestRunnerBuilder(type, DEFAULT_SERVICE_NAME, 5).setConstantRequestCount(60).setNumIntervals(50).setDegraderStrategies(new HashMap<>(), degraderPropertiesWithSlowStart).setDynamicLatency(Arrays.asList(HOST_RECOVERING_TO_HEALTHY_LATENCY, HEALTHY_HOST_LATENCY_CORRELATION, HEALTHY_HOST_LATENCY_CORRELATION, HEALTHY_HOST_LATENCY_CORRELATION, HEALTHY_HOST_LATENCY_CORRELATION));
LoadBalancerStrategyTestRunner testRunner = type == loadBalancerStrategyType.DEGRADER ? builder.setDegraderStrategies(new HashMap<>(), degraderPropertiesWithSlowStart).build() : builder.setRelativeLoadBalancerStrategies(relativePropertiesWithSlowStart).build();
testRunner.runWait();
List<Integer> pointHistory = testRunner.getPointHistory().get(testRunner.getUri(0));
assertTrue(hasPointsInHistory(pointHistory, Arrays.asList(2, 4, 8, 16)), "Slow start should double the health score when it is below threshold");
}
use of com.linkedin.d2.D2RelativeStrategyProperties in project rest.li by linkedin.
the class TestLoadBalancerStrategy method testRaceCondition.
@Test(dataProvider = "raceConditionScenario")
public void testRaceCondition(loadBalancerStrategyType type, int numTrackerClients) {
Map<String, String> degraderProperties = new HashMap<>();
degraderProperties.put(PropertyKeys.DEGRADER_INITIAL_DROP_RATE, "0.99");
degraderProperties.put(PropertyKeys.DEGRADER_SLOW_START_THRESHOLD, "0.16");
D2RelativeStrategyProperties relativeProperties = new D2RelativeStrategyProperties().setSlowStartThreshold(0.16).setInitialHealthScore(0.01);
LoadBalancerStrategyTestRunnerBuilder builder = new LoadBalancerStrategyTestRunnerBuilder(type, DEFAULT_SERVICE_NAME, 10).setConstantRequestCount(30).setNumIntervals(50).setConstantLatency(Arrays.asList(HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY));
LoadBalancerStrategyTestRunner testRunner = type == loadBalancerStrategyType.DEGRADER ? builder.setDegraderStrategies(new HashMap<>(), degraderProperties).build() : builder.setRelativeLoadBalancerStrategies(relativeProperties).build();
testRunner.runWaitInconsistentTrackerClients(numTrackerClients);
assertEquals(testRunner.getPoints().size(), 10);
assertEquals(testRunner.getPoints().get(testRunner.getUri(0)).intValue(), 100);
}
use of com.linkedin.d2.D2RelativeStrategyProperties in project rest.li by linkedin.
the class TestLoadBalancerStrategy method testStayQuarantined.
@Test(dataProvider = "strategy")
public void testStayQuarantined(loadBalancerStrategyType type) {
Map<String, Object> strategyPropertiesWithQuarantineEnabled = new HashMap<>();
D2RelativeStrategyProperties relativePropertiesWithQuarantineEnabled = new D2RelativeStrategyProperties();
D2QuarantineProperties quarantineProperties = new D2QuarantineProperties().setQuarantineMaxPercent(DEFAULT_QUARANTINE_PERCENTAGE);
strategyPropertiesWithQuarantineEnabled.put(PropertyKeys.HTTP_LB_QUARANTINE_MAX_PERCENT, String.valueOf(DEFAULT_QUARANTINE_PERCENTAGE));
relativePropertiesWithQuarantineEnabled.setQuarantineProperties(quarantineProperties);
LoadBalancerStrategyTestRunnerBuilder builder = new LoadBalancerStrategyTestRunnerBuilder(type, DEFAULT_SERVICE_NAME, 5).setConstantRequestCount(1000).setNumIntervals(10).setConstantLatency(Arrays.asList(UNHEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY, HEALTHY_HOST_CONSTANT_LATENCY));
LoadBalancerStrategyTestRunner testRunner = type == loadBalancerStrategyType.DEGRADER ? builder.setDegraderStrategies(strategyPropertiesWithQuarantineEnabled, new HashMap<>()).build() : builder.setRelativeLoadBalancerStrategies(relativePropertiesWithQuarantineEnabled).build();
testRunner.runWait();
List<Integer> pointHistory = testRunner.getPointHistory().get(testRunner.getUri(0));
assertEquals(pointHistory.get(9).intValue(), QUARANTINED_POINTS);
}
use of com.linkedin.d2.D2RelativeStrategyProperties in project rest.li by linkedin.
the class TestLoadBalancerPerformanceSimulation method buildRelativeRunnerWithRandomLatencyInRange.
private LoadBalancerStrategyTestRunner buildRelativeRunnerWithRandomLatencyInRange(boolean isFastRecovery, long badHostBaseLatency, long regularBaseLatency) {
int numHosts = 20;
int numRequestsPerInterval = 20;
List<LatencyCorrelation> latencyCorrelationList = new ArrayList<>();
long leftLimit = 0L;
long rightLimit = 400L;
latencyCorrelationList.add((requestsPerInterval, intervalIndex) -> badHostBaseLatency + (long) (Math.random() * (rightLimit - leftLimit)));
for (int i = 1; i < numHosts; i++) {
latencyCorrelationList.add((requestsPerInterval, intervalIndex) -> regularBaseLatency + (long) (Math.random() * (rightLimit - leftLimit)));
}
D2RelativeStrategyProperties relativeStrategyProperties = new D2RelativeStrategyProperties().setEnableFastRecovery(isFastRecovery);
return new LoadBalancerStrategyTestRunnerBuilder(loadBalancerStrategyType.RELATIVE, DEFAULT_SERVICE_NAME, numHosts).setConstantRequestCount(numRequestsPerInterval).setNumIntervals(200).setDynamicLatency(latencyCorrelationList).setRelativeLoadBalancerStrategies(relativeStrategyProperties).build();
}
use of com.linkedin.d2.D2RelativeStrategyProperties in project rest.li by linkedin.
the class TestLoadBalancerPerformanceSimulation method buildRelativeRunnerWithDifferentLatency.
private LoadBalancerStrategyTestRunner buildRelativeRunnerWithDifferentLatency(double relativeLatencyHighThresholdFactor) {
int minBaseLatency = 100;
int baseLatencyDiff = 20;
int numHosts = 10;
double hostLinearFactor = 0.05;
List<LatencyCorrelation> latencyCorrelationList = new ArrayList<>();
for (int i = 0; i < numHosts; i++) {
long baseLatency = i * baseLatencyDiff + minBaseLatency;
latencyCorrelationList.add((requestsPerInterval, intervalIndex) -> baseLatency + (long) (hostLinearFactor * requestsPerInterval));
}
D2RelativeStrategyProperties relativeStrategyProperties = new D2RelativeStrategyProperties().setRelativeLatencyHighThresholdFactor(relativeLatencyHighThresholdFactor);
return new LoadBalancerStrategyTestRunnerBuilder(loadBalancerStrategyType.RELATIVE, DEFAULT_SERVICE_NAME, numHosts).setConstantRequestCount(10000).setNumIntervals(100).setDynamicLatency(latencyCorrelationList).setRelativeLoadBalancerStrategies(relativeStrategyProperties).build();
}
Aggregations