use of com.linkedin.d2.balancer.LoadBalancer in project rest.li by linkedin.
the class WarmUpLoadBalancerTest method testDeletingFilesAfterShutdown.
@Test(timeOut = 10000, groups = { "ci-flaky" })
public void testDeletingFilesAfterShutdown() throws InterruptedException, ExecutionException, TimeoutException {
createDefaultServicesIniFiles();
TestLoadBalancer balancer = new TestLoadBalancer();
List<String> allServicesBeforeShutdown = getAllDownstreamServices();
List<String> partialServices = getPartialDownstreams();
DownstreamServicesFetcher returnPartialDownstreams = callback -> callback.onSuccess(partialServices);
LoadBalancer warmUpLoadBalancer = new WarmUpLoadBalancer(balancer, balancer, Executors.newSingleThreadScheduledExecutor(), _tmpdir.getAbsolutePath(), MY_SERVICES_FS, returnPartialDownstreams, WarmUpLoadBalancer.DEFAULT_SEND_REQUESTS_TIMEOUT_SECONDS, WarmUpLoadBalancer.DEFAULT_CONCURRENT_REQUESTS);
FutureCallback<None> callback = new FutureCallback<>();
warmUpLoadBalancer.start(callback);
callback.get(5000, TimeUnit.MILLISECONDS);
FutureCallback<None> shutdownCallback = new FutureCallback<>();
warmUpLoadBalancer.shutdown(() -> shutdownCallback.onSuccess(None.none()));
shutdownCallback.get(5000, TimeUnit.MILLISECONDS);
List<String> allServicesAfterShutdown = getAllDownstreamServices();
Assert.assertTrue(allServicesBeforeShutdown.size() > partialServices.size(), "After shutdown the unused services should have been deleted. Expected lower number of:" + allServicesBeforeShutdown.size() + ", actual " + partialServices.size());
Assert.assertTrue(partialServices.containsAll(allServicesAfterShutdown) && allServicesAfterShutdown.containsAll(partialServices), "There should be just the services that were passed by the partial fetcher");
}
use of com.linkedin.d2.balancer.LoadBalancer in project rest.li by linkedin.
the class WarmUpLoadBalancerTest method testThrottlingUnlimitedRequests.
/**
* Tests that if the requests are not throttled it makes a large amount of concurrent calls
*/
@Test(timeOut = 10000)
public void testThrottlingUnlimitedRequests() throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException {
int NRequests = 500;
createNServicesIniFiles(NRequests);
int concurrentRequestsHugeNumber = 999999999;
int concurrentRequestsCheckHigher = WarmUpLoadBalancer.DEFAULT_CONCURRENT_REQUESTS;
TestLoadBalancer balancer = new TestLoadBalancer(50);
AtomicInteger requestCount = balancer.getRequestCount();
LoadBalancer warmUpLoadBalancer = new WarmUpLoadBalancer(balancer, balancer, Executors.newSingleThreadScheduledExecutor(), _tmpdir.getAbsolutePath(), MY_SERVICES_FS, _FSBasedDownstreamServicesFetcher, WarmUpLoadBalancer.DEFAULT_SEND_REQUESTS_TIMEOUT_SECONDS, concurrentRequestsHugeNumber);
FutureCallback<None> callback = new FutureCallback<>();
warmUpLoadBalancer.start(callback);
boolean triggeredAtLeastOnce = false;
while (!callback.isDone()) {
int currentConcurrentRequests = balancer.getRequestCount().get() - balancer.getCompletedRequestCount().get();
if (currentConcurrentRequests > concurrentRequestsCheckHigher) {
triggeredAtLeastOnce = true;
}
Thread.sleep(50);
}
Assert.assertTrue(triggeredAtLeastOnce);
Assert.assertEquals(NRequests, requestCount.get());
}
use of com.linkedin.d2.balancer.LoadBalancer in project rest.li by linkedin.
the class WarmUpLoadBalancerTest method testHitTimeout.
@Test(timeOut = 10000)
public void testHitTimeout() throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException {
int NRequests = 5000;
int warmUpTimeout = 2;
int concurrentRequests = 5;
int requestTime = 100;
float requestsPerSecond = 1000 / requestTime * concurrentRequests;
int expectedRequests = (int) (requestsPerSecond * warmUpTimeout);
// we allow inaccuracies of 1s
int deviation = (int) requestsPerSecond;
createNServicesIniFiles(NRequests);
TestLoadBalancer balancer = new TestLoadBalancer(requestTime);
AtomicInteger requestCount = balancer.getRequestCount();
LoadBalancer warmUpLoadBalancer = new WarmUpLoadBalancer(balancer, balancer, Executors.newSingleThreadScheduledExecutor(), _tmpdir.getAbsolutePath(), MY_SERVICES_FS, _FSBasedDownstreamServicesFetcher, warmUpTimeout, concurrentRequests);
FutureCallback<None> callback = new FutureCallback<>();
warmUpLoadBalancer.start(callback);
callback.get();
Assert.assertTrue(expectedRequests - deviation < requestCount.get() && expectedRequests + deviation > requestCount.get(), "Expected # of requests between " + expectedRequests + " +/-" + deviation + ", found:" + requestCount.get());
}
use of com.linkedin.d2.balancer.LoadBalancer in project rest.li by linkedin.
the class WarmUpLoadBalancerTest method testNotDeletingFilesGetClient.
/**
* Since the list might from the fetcher might not be complete (update service, old data, etc.., and the user might
* require additional services at runtime, we have to check that those services are not cleared from the cache
* otherwise it would incur in a penalty at the next deployment
*/
@Test(timeOut = 10000)
public void testNotDeletingFilesGetClient() throws InterruptedException, ExecutionException, TimeoutException, ServiceUnavailableException {
createDefaultServicesIniFiles();
TestLoadBalancer balancer = new TestLoadBalancer();
List<String> allServicesBeforeShutdown = getAllDownstreamServices();
DownstreamServicesFetcher returnNoDownstreams = callback -> callback.onSuccess(Collections.emptyList());
String pickOneService = allServicesBeforeShutdown.get(0);
LoadBalancer warmUpLoadBalancer = new WarmUpLoadBalancer(balancer, balancer, Executors.newSingleThreadScheduledExecutor(), _tmpdir.getAbsolutePath(), MY_SERVICES_FS, returnNoDownstreams, WarmUpLoadBalancer.DEFAULT_SEND_REQUESTS_TIMEOUT_SECONDS, WarmUpLoadBalancer.DEFAULT_CONCURRENT_REQUESTS);
FutureCallback<None> callback = new FutureCallback<>();
warmUpLoadBalancer.start(callback);
callback.get(5000, TimeUnit.MILLISECONDS);
warmUpLoadBalancer.getClient(new URIRequest("d2://" + pickOneService), new RequestContext());
FutureCallback<None> shutdownCallback = new FutureCallback<>();
warmUpLoadBalancer.shutdown(() -> shutdownCallback.onSuccess(None.none()));
shutdownCallback.get(5000, TimeUnit.MILLISECONDS);
List<String> allServicesAfterShutdown = getAllDownstreamServices();
Assert.assertEquals(1, allServicesAfterShutdown.size(), "After shutdown there should be just one service, the one that we 'get the client' on");
}
use of com.linkedin.d2.balancer.LoadBalancer in project rest.li by linkedin.
the class WarmUpLoadBalancerTest method testThrottling.
@Test(timeOut = 10000)
public void testThrottling() throws InterruptedException {
int NRequests = 100;
createNServicesIniFiles(NRequests);
TestLoadBalancer balancer = new TestLoadBalancer(50);
AtomicInteger requestCount = balancer.getRequestCount();
LoadBalancer warmUpLoadBalancer = new WarmUpLoadBalancer(balancer, balancer, Executors.newSingleThreadScheduledExecutor(), _tmpdir.getAbsolutePath(), MY_SERVICES_FS, _FSBasedDownstreamServicesFetcher, WarmUpLoadBalancer.DEFAULT_SEND_REQUESTS_TIMEOUT_SECONDS, WarmUpLoadBalancer.DEFAULT_CONCURRENT_REQUESTS);
FutureCallback<None> callback = new FutureCallback<>();
warmUpLoadBalancer.start(callback);
boolean triggeredAtLeastOnce = false;
while (!callback.isDone()) {
triggeredAtLeastOnce = true;
int currentConcurrentRequests = balancer.getRequestCount().get() - balancer.getCompletedRequestCount().get();
if (currentConcurrentRequests > WarmUpLoadBalancer.DEFAULT_CONCURRENT_REQUESTS) {
Assert.fail("The concurrent requests (" + currentConcurrentRequests + ") are greater than the allowed (" + WarmUpLoadBalancer.DEFAULT_CONCURRENT_REQUESTS + ")");
}
Thread.sleep(50);
}
Assert.assertTrue(triggeredAtLeastOnce);
Assert.assertEquals(NRequests, requestCount.get());
}
Aggregations