use of com.linkedin.d2.backuprequests.PoissonEventsArrival in project rest.li by linkedin.
the class TestBoundedCostBackupRequestsStrategy method testMinBackupDelay.
@Test
public void testMinBackupDelay() {
BoundedCostBackupRequestsStrategy strategy = new BoundedCostBackupRequestsStrategy(5, 64, 1024, 128, 100);
BackupRequestsSimulator simulator = new BackupRequestsSimulator(new PoissonEventsArrival(200, TimeUnit.SECONDS), new GaussianResponseTimeDistribution(10, 50, 10, 99, TimeUnit.MILLISECONDS), strategy);
simulator.simulate(ITERATIONS);
assertEquals(simulator.getNumberOfBackupRequestsMade(), 0);
}
use of com.linkedin.d2.backuprequests.PoissonEventsArrival in project rest.li by linkedin.
the class TestBoundedCostBackupRequestsStrategy method testLongTailEffectOfBackupRequests.
@Test
public void testLongTailEffectOfBackupRequests() {
BoundedCostBackupRequestsStrategy strategy = new BoundedCostBackupRequestsStrategy(5, 64, 1024, 128, 0);
ResponseTimeDistribution hiccupDistribution = new GaussianResponseTimeDistribution(500, 1000, 500, TimeUnit.MILLISECONDS);
BackupRequestsSimulator simulator = new BackupRequestsSimulator(new PoissonEventsArrival(200, TimeUnit.SECONDS), new GaussianWithHiccupResponseTimeDistribution(2, 10, 5, TimeUnit.MILLISECONDS, hiccupDistribution, 0.02), strategy);
simulator.simulate(ITERATIONS);
double withoutBackup99 = simulator.getResponseTimeWithoutBackupRequestsHistogram().getValueAtPercentile(99);
double withBackup99 = simulator.getResponseTimeWithBackupRequestsHistogram().getValueAtPercentile(99);
assertTrue(withBackup99 * 10 < withoutBackup99, "99th percentile is expected to be improved 10x, with backup: " + withBackup99 / 1000000 + "ms, without backup: " + withoutBackup99 / 1000000 + "ms");
}
use of com.linkedin.d2.backuprequests.PoissonEventsArrival in project rest.li by linkedin.
the class TestBoundedCostBackupRequestsStrategy method testNumberOfBackupRequestsMade.
public double testNumberOfBackupRequestsMade(int pct, int burstSize) {
BoundedCostBackupRequestsStrategy strategy = new BoundedCostBackupRequestsStrategy(pct, burstSize, 1024, 128, 0);
BackupRequestsSimulator simulator = new BackupRequestsSimulator(new PoissonEventsArrival(200, TimeUnit.SECONDS), new GaussianResponseTimeDistribution(20, 100, 50, TimeUnit.MILLISECONDS), strategy);
simulator.simulate(ITERATIONS);
return ((100d * simulator.getNumberOfBackupRequestsMade()) / ITERATIONS);
}
use of com.linkedin.d2.backuprequests.PoissonEventsArrival in project rest.li by linkedin.
the class TestBoundedCostBackupRequestsStrategy method testValuesOutOfRange.
@Test
public void testValuesOutOfRange() {
BoundedCostBackupRequestsStrategy strategy = new BoundedCostBackupRequestsStrategy(5, 64, 1024, 128, 0);
BackupRequestsSimulator simulator = new BackupRequestsSimulator(new PoissonEventsArrival(200, TimeUnit.SECONDS), new GaussianResponseTimeDistribution(BoundedCostBackupRequestsStrategy.HIGH, 2 * BoundedCostBackupRequestsStrategy.HIGH, BoundedCostBackupRequestsStrategy.HIGH, TimeUnit.NANOSECONDS), strategy);
simulator.simulate(ITERATIONS);
assertTrue(((100d * simulator.getNumberOfBackupRequestsMade()) / ITERATIONS) < 5 + EXPECTED_PRECISSION);
assertTrue(strategy.getTimeUntilBackupRequestNano().get() >= BoundedCostBackupRequestsStrategy.HIGH);
}
use of com.linkedin.d2.backuprequests.PoissonEventsArrival in project rest.li by linkedin.
the class TestBackupRequestsClient method testBackupRequestsRun.
// @Test - Disabled due to flakiness. See SI-3077 to track and resolve this.
public void testBackupRequestsRun() throws Exception {
final AtomicBoolean shutDown = new AtomicBoolean(false);
final AtomicLong completed = new AtomicLong(0);
AtomicReference<ServiceProperties> serviceProperties = new AtomicReference<>();
TestBackupRequestsStrategyStatsConsumer statsConsumer = new TestBackupRequestsStrategyStatsConsumer();
serviceProperties.set(createServiceProperties(null));
final BackupRequestsClient client = createClient(serviceProperties::get, statsConsumer, false);
final URI uri = URI.create("d2://testService");
Thread loadGenerator = new Thread(() -> {
/*
* Little's theorem: L = a * W
* W = 10 ms in the test (not including hiccups).
* We want L to be 100, so a = 100 / 15 = 6.6 events per millisecond
*/
EventsArrival arrivals = new PoissonEventsArrival(6.6, TimeUnit.MILLISECONDS);
long lastNano = System.nanoTime();
while (!shutDown.get()) {
long nextNano = lastNano + arrivals.nanosToNextEvent();
try {
waitUntil(nextNano);
} catch (Exception e) {
e.printStackTrace();
}
RestRequest restRequest = new RestRequestBuilder(uri).setEntity(CONTENT).build();
RequestContext requestContext = new RequestContext();
requestContext.putLocalAttr(R2Constants.OPERATION, "get");
Set<URI> hosts = new HashSet<>();
hosts.add(uri);
requestContext.putLocalAttr("D2-Hint-ExcludedHosts", hosts);
client.restRequest(restRequest, requestContext, new Callback<RestResponse>() {
@Override
public void onSuccess(RestResponse result) {
completed.incrementAndGet();
}
@Override
public void onError(Throwable e) {
}
});
lastNano = nextNano;
}
});
loadGenerator.start();
Thread.sleep(10000);
serviceProperties.set(createServiceProperties(Arrays.asList(createBackupRequestsConfiguration(5, "get"))));
long startTime = System.currentTimeMillis();
while (statsConsumer.getLatencyWithBackup().size() < 1 && System.currentTimeMillis() - startTime < 30000) {
Thread.sleep(10);
}
long endTime = System.currentTimeMillis();
// this should disable backup requests
serviceProperties.set(createServiceProperties(Arrays.asList(createBackupRequestsConfiguration(5, "batch_get"))));
Thread.sleep((endTime - startTime) * 2);
// initialize shutdown of load generator
shutDown.set(true);
// sum up histograms
Histogram withoutBackup = new Histogram(LatencyMetric.LOWEST_DISCERNIBLE_VALUE, LatencyMetric.HIGHEST_TRACKABLE_VALUE, LatencyMetric.NUMBER_OF_SIGNIFICANT_VALUE_DIGITS);
Histogram withBackup = new Histogram(LatencyMetric.LOWEST_DISCERNIBLE_VALUE, LatencyMetric.HIGHEST_TRACKABLE_VALUE, LatencyMetric.NUMBER_OF_SIGNIFICANT_VALUE_DIGITS);
statsConsumer.getLatencyWithoutBackup().stream().forEach(h -> {
withoutBackup.add(h);
});
statsConsumer.getLatencyWithBackup().stream().forEach(h -> {
withBackup.add(h);
});
assertEquals(withoutBackup.getTotalCount(), withBackup.getTotalCount());
double withoutBackup99 = withoutBackup.getValueAtPercentile(99);
double withBackup99 = withBackup.getValueAtPercentile(99);
assertTrue(withBackup99 * 10 < withoutBackup99, "99th percentile is expected to be improved 10x, with backup: " + withBackup99 / 1000000 + "ms, without backup: " + withoutBackup99 / 1000000 + "ms");
}
Aggregations