use of com.linkedin.d2.backuprequests.EventsArrival 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