use of com.linkedin.d2.balancer.clients.BackupRequestsClient in project rest.li by linkedin.
the class TestBackupRequestsClient method testRequest.
@Test(dataProvider = "isD2Async")
public void testRequest(boolean isD2Async) throws Exception {
AtomicReference<ServiceProperties> serviceProperties = new AtomicReference<>();
serviceProperties.set(createServiceProperties(null));
BackupRequestsClient client = createClient(serviceProperties::get, isD2Async);
URI uri = URI.create("d2://testService");
RestRequest restRequest = new RestRequestBuilder(uri).setEntity(CONTENT).build();
Future<RestResponse> response = client.restRequest(restRequest);
assertEquals(response.get().getStatus(), 200);
}
use of com.linkedin.d2.balancer.clients.BackupRequestsClient in project rest.li by linkedin.
the class TestBackupRequestsClient method createClient.
private BackupRequestsClient createClient(Supplier<ServiceProperties> servicePropertiesSupplier, TestBackupRequestsStrategyStatsConsumer statsConsumer, boolean isD2Async) {
ResponseTimeDistribution hiccupDistribution = new GaussianResponseTimeDistribution(500, 1000, 500, TimeUnit.MILLISECONDS);
ResponseTimeDistribution responseTime = new GaussianWithHiccupResponseTimeDistribution(2, 10, 5, TimeUnit.MILLISECONDS, hiccupDistribution, 0.02);
return createClient(servicePropertiesSupplier, statsConsumer, responseTime, isD2Async);
}
use of com.linkedin.d2.balancer.clients.BackupRequestsClient 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");
}
use of com.linkedin.d2.balancer.clients.BackupRequestsClient in project rest.li by linkedin.
the class TestBackupRequestsClient method testStatsConsumerUpdateAndRemove.
@Test(dataProvider = "isD2Async")
public void testStatsConsumerUpdateAndRemove(boolean isD2Async) throws Exception {
AtomicReference<ServiceProperties> serviceProperties = new AtomicReference<>();
TestBackupRequestsStrategyStatsConsumer statsConsumer = new TestBackupRequestsStrategyStatsConsumer();
serviceProperties.set(createServiceProperties(null));
BackupRequestsClient client = createClient(serviceProperties::get, statsConsumer, isD2Async);
URI uri = URI.create("d2://testService");
RestRequest restRequest = new RestRequestBuilder(uri).setEntity(CONTENT).build();
RequestContext requestContext = new RequestContext();
requestContext.putLocalAttr(R2Constants.OPERATION, "get");
Future<RestResponse> response = client.restRequest(restRequest, requestContext);
assertEquals(response.get().getStatus(), 200);
List<StatsConsumerEvent> events = statsConsumer.getEvents();
assertEquals(events.size(), 0);
serviceProperties.set(createServiceProperties(Arrays.asList(createBackupRequestsConfiguration(5, "get"), createBackupRequestsConfiguration(1, "batch_get"))));
requestContext = new RequestContext();
requestContext.putLocalAttr(R2Constants.OPERATION, "get");
response = client.restRequest(restRequest, requestContext);
assertEquals(response.get().getStatus(), 200);
events = statsConsumer.getEvents();
assertEquals(events.size(), 2);
assertEquals(events.get(0).isEventAdd(), true);
assertEquals(events.get(0).getService(), SERVICE_NAME);
assertEquals(events.get(0).getOperation(), "get");
BackupRequestsStrategyStatsProvider statsProvider1 = events.get(0).getStatsProvider();
assertNotNull(statsProvider1);
assertEquals(events.get(1).isEventAdd(), true);
assertEquals(events.get(1).getService(), SERVICE_NAME);
assertEquals(events.get(1).getOperation(), "batch_get");
BackupRequestsStrategyStatsProvider statsProvider2 = events.get(1).getStatsProvider();
assertNotNull(statsProvider2);
serviceProperties.set(createServiceProperties(Arrays.asList(createBackupRequestsConfiguration(1, "get"))));
requestContext = new RequestContext();
requestContext.putLocalAttr(R2Constants.OPERATION, "get");
response = client.restRequest(restRequest, requestContext);
assertEquals(response.get().getStatus(), 200);
events = statsConsumer.getEvents();
assertEquals(events.size(), 5);
assertEquals(events.get(2).isEventAdd(), false);
assertEquals(events.get(2).getService(), SERVICE_NAME);
assertEquals(events.get(2).getOperation(), "get");
BackupRequestsStrategyStatsProvider removedStatsProvider = events.get(2).getStatsProvider();
assertNotNull(removedStatsProvider);
assertSame(statsProvider1, removedStatsProvider);
assertEquals(events.get(3).isEventAdd(), true);
assertEquals(events.get(3).getService(), SERVICE_NAME);
assertEquals(events.get(3).getOperation(), "get");
BackupRequestsStrategyStatsProvider statsProvider3 = events.get(3).getStatsProvider();
assertNotNull(statsProvider1);
assertNotSame(statsProvider1, statsProvider3);
assertEquals(events.get(4).isEventAdd(), false);
assertEquals(events.get(4).getService(), SERVICE_NAME);
assertEquals(events.get(4).getOperation(), "batch_get");
BackupRequestsStrategyStatsProvider removedStatsProvider2 = events.get(4).getStatsProvider();
assertNotNull(removedStatsProvider);
assertSame(statsProvider2, removedStatsProvider2);
}
use of com.linkedin.d2.balancer.clients.BackupRequestsClient in project rest.li by linkedin.
the class TestBackupRequestsClient method testStatsConsumerAddRemove.
@Test(dataProvider = "isD2Async")
public void testStatsConsumerAddRemove(boolean isD2Async) throws Exception {
AtomicReference<ServiceProperties> serviceProperties = new AtomicReference<>();
TestBackupRequestsStrategyStatsConsumer statsConsumer = new TestBackupRequestsStrategyStatsConsumer();
serviceProperties.set(createServiceProperties(null));
BackupRequestsClient client = createClient(serviceProperties::get, statsConsumer, isD2Async);
URI uri = URI.create("d2://testService");
RestRequest restRequest = new RestRequestBuilder(uri).setEntity(CONTENT).build();
RequestContext requestContext = new RequestContext();
requestContext.putLocalAttr(R2Constants.OPERATION, "get");
Future<RestResponse> response = client.restRequest(restRequest, requestContext);
assertEquals(response.get().getStatus(), 200);
List<StatsConsumerEvent> events = statsConsumer.getEvents();
assertEquals(events.size(), 0);
serviceProperties.set(createServiceProperties(Arrays.asList(createBackupRequestsConfiguration(5, "get"))));
requestContext = new RequestContext();
requestContext.putLocalAttr(R2Constants.OPERATION, "get");
response = client.restRequest(restRequest, requestContext);
assertEquals(response.get().getStatus(), 200);
events = statsConsumer.getEvents();
assertEquals(events.size(), 1);
assertEquals(events.get(0).isEventAdd(), true);
assertEquals(events.get(0).getService(), SERVICE_NAME);
assertEquals(events.get(0).getOperation(), "get");
BackupRequestsStrategyStatsProvider statsProvider = events.get(0).getStatsProvider();
assertNotNull(statsProvider);
serviceProperties.set(createServiceProperties(null));
requestContext = new RequestContext();
requestContext.putLocalAttr(R2Constants.OPERATION, "get");
response = client.restRequest(restRequest, requestContext);
assertEquals(response.get().getStatus(), 200);
events = statsConsumer.getEvents();
assertEquals(events.size(), 2);
assertEquals(events.get(1).isEventAdd(), false);
assertEquals(events.get(1).getService(), SERVICE_NAME);
assertEquals(events.get(1).getOperation(), "get");
BackupRequestsStrategyStatsProvider removedStatsProvider = events.get(1).getStatsProvider();
assertNotNull(removedStatsProvider);
assertSame(statsProvider, removedStatsProvider);
}
Aggregations