use of com.linkedin.d2.balancer.LoadBalancerState.NullStateListenerCallback in project rest.li by linkedin.
the class SimpleLoadBalancer method listenToService.
private void listenToService(String serviceName) throws ServiceUnavailableException {
if (_timeout > 0) {
CountDownLatch latch = new CountDownLatch(1);
SimpleLoadBalancerCountDownCallback callback = new SimpleLoadBalancerCountDownCallback(latch) {
@Override
public void done(int type, String name) {
super.done(type, name);
}
};
_state.listenToService(serviceName, callback);
try {
if (!latch.await(_timeout, _unit)) {
warn(_log, "timed out during wait while trying to add service: ", serviceName);
}
} catch (InterruptedException e) {
_log.error("got interrupt while waiting for a service to be registered", e);
die(serviceName, "got interrupt while waiting for a service to be registered");
}
} else {
_state.listenToService(serviceName, new NullStateListenerCallback());
_log.info("No timeout for service {}", serviceName);
}
}
use of com.linkedin.d2.balancer.LoadBalancerState.NullStateListenerCallback in project rest.li by linkedin.
the class SimpleLoadBalancerStateTest method testSSLDisabledWithHttpsInstances.
@Test(groups = { "small", "back-end" })
public void testSSLDisabledWithHttpsInstances() throws URISyntaxException {
reset();
URI uri = URI.create("http://cluster-1/test");
URI httpsUri = URI.create("https://cluster-1/test");
List<String> schemes = new ArrayList<String>();
Map<Integer, PartitionData> partitionData = new HashMap<Integer, PartitionData>(1);
partitionData.put(DefaultPartitionAccessor.DEFAULT_PARTITION_ID, new PartitionData(1d));
Map<URI, Map<Integer, PartitionData>> uriData = new HashMap<URI, Map<Integer, PartitionData>>();
uriData.put(uri, partitionData);
uriData.put(httpsUri, partitionData);
schemes.add("https");
schemes.add("http");
assertNull(_state.getClient("service-1", uri));
// set up state
_state.listenToCluster("cluster-1", new NullStateListenerCallback());
assertNull(_state.getClient("service-1", uri));
_state.listenToService("service-1", new NullStateListenerCallback());
assertNull(_state.getClient("service-1", uri));
Map<String, Object> transportClientProperties = new HashMap<String, Object>();
transportClientProperties.put(HttpClientFactory.HTTP_SSL_CONTEXT, _sslContext);
transportClientProperties.put(HttpClientFactory.HTTP_SSL_PARAMS, _sslParameters);
transportClientProperties = Collections.unmodifiableMap(transportClientProperties);
ServiceProperties serviceProperties = new ServiceProperties("service-1", "cluster-1", "/test", Arrays.asList("random"), Collections.<String, Object>emptyMap(), transportClientProperties, null, schemes, null);
_serviceRegistry.put("service-1", serviceProperties);
assertNull(_state.getClient("service-1", uri));
_uriRegistry.put("cluster-1", new UriProperties("cluster-1", uriData));
List<LoadBalancerState.SchemeStrategyPair> schemeStrategyPairs = _state.getStrategiesForService("service-1", schemes);
for (LoadBalancerState.SchemeStrategyPair pair : schemeStrategyPairs) {
assertFalse("https".equalsIgnoreCase(pair.getScheme()), "https shouldn't be in any schemeStrategyPair");
}
TrackerClient client = _state.getClient("service-1", uri);
assertNotNull(client);
assertEquals(client.getUri(), uri);
// Unfortunately, I don't know a good way to intercept the logs
client = _state.getClient("service-1", httpsUri);
assertNull(client, "shouldn't pick an https uri");
_state.refreshTransportClientsPerService(serviceProperties);
}
use of com.linkedin.d2.balancer.LoadBalancerState.NullStateListenerCallback in project rest.li by linkedin.
the class SimpleLoadBalancerStateTest method testRegister.
@Test(groups = { "small", "back-end" })
public void testRegister() {
reset();
TestListener listener = new TestListener();
List<String> schemes = new ArrayList<String>();
schemes.add("http");
_state.register(listener);
assertNull(listener.scheme);
assertNull(listener.strategy);
assertNull(listener.serviceName);
// trigger a strategy add
// first add a cluster
_state.listenToCluster("cluster-1", new NullStateListenerCallback());
_clusterRegistry.put("cluster-1", new ClusterProperties("cluster-1"));
// then add a service
_state.listenToService("service-1", new NullStateListenerCallback());
_serviceRegistry.put("service-1", new ServiceProperties("service-1", "cluster-1", "/test", Arrays.asList("random"), Collections.<String, Object>emptyMap(), null, null, schemes, null));
// this should trigger a refresh
assertEquals(listener.scheme, "http");
assertTrue(listener.strategy instanceof RandomLoadBalancerStrategy);
assertEquals(listener.serviceName, "service-1");
// then update the cluster
_clusterRegistry.put("cluster-1", new ClusterProperties("cluster-1"));
// this triggered a second refresh, but also an onStrategyRemoved. The onStrategyRemoved should
// be done first, and then the onStrategyAdd, so we should still see a valid strategy.
assertEquals(listener.scheme, "http");
assertTrue(listener.strategy instanceof RandomLoadBalancerStrategy);
assertEquals(listener.serviceName, "service-1");
_state.listenToCluster("partition-cluster-1", new NullStateListenerCallback());
_clusterRegistry.put("partition-cluster-1", new ClusterProperties("partition-cluster-1", null, new HashMap<String, String>(), new HashSet<URI>(), new RangeBasedPartitionProperties("id=(\\d+)", 0, 100, 2)));
_state.listenToService("partition-service-1", new NullStateListenerCallback());
_serviceRegistry.put("partition-service-1", new ServiceProperties("partition-service-1", "partition-cluster-1", "/partition-test", Arrays.asList("degraderV3"), Collections.<String, Object>emptyMap(), null, null, schemes, null));
assertEquals(listener.scheme, "http");
assertTrue(listener.strategy instanceof DegraderLoadBalancerStrategyV3);
}
use of com.linkedin.d2.balancer.LoadBalancerState.NullStateListenerCallback in project rest.li by linkedin.
the class SimpleLoadBalancerStateTest method testShutdown.
@Test(groups = { "small", "back-end" })
public void testShutdown() throws URISyntaxException, InterruptedException {
reset();
URI uri = URI.create("http://cluster-1/test");
TestListener listener = new TestListener();
List<String> schemes = new ArrayList<String>();
Map<Integer, PartitionData> partitionData = new HashMap<Integer, PartitionData>(1);
partitionData.put(DefaultPartitionAccessor.DEFAULT_PARTITION_ID, new PartitionData(1d));
Map<URI, Map<Integer, PartitionData>> uriData = new HashMap<URI, Map<Integer, PartitionData>>();
uriData.put(uri, partitionData);
schemes.add("http");
_state.register(listener);
assertNull(listener.scheme);
assertNull(listener.strategy);
assertNull(listener.serviceName);
// set up state
_state.listenToCluster("cluster-1", new NullStateListenerCallback());
_state.listenToService("service-1", new NullStateListenerCallback());
_clusterRegistry.put("cluster-1", new ClusterProperties("cluster-1", schemes));
_uriRegistry.put("cluster-1", new UriProperties("cluster-1", uriData));
_serviceRegistry.put("service-1", new ServiceProperties("service-1", "cluster-1", "/test", Arrays.asList("random")));
TrackerClient client = _state.getClient("cluster-1", uri);
TestShutdownCallback callback = new TestShutdownCallback();
_state.shutdown(callback);
if (!callback.await(10, TimeUnit.SECONDS)) {
fail("unable to shut down state");
}
for (TransportClientFactory factory : _clientFactories.values()) {
SimpleLoadBalancerTest.DoNothingClientFactory f = (SimpleLoadBalancerTest.DoNothingClientFactory) factory;
assertEquals(f.getRunningClientCount(), 0, "Not all clients were shut down");
}
}
use of com.linkedin.d2.balancer.LoadBalancerState.NullStateListenerCallback in project rest.li by linkedin.
the class SimpleLoadBalancerStateTest method testShutdownWithListener.
@Test(groups = { "small", "back-end" })
public void testShutdownWithListener() throws URISyntaxException, InterruptedException {
reset();
URI uri = URI.create("http://cluster-1/test");
TestListener listener = new TestListener();
List<String> schemes = new ArrayList<String>();
Map<Integer, PartitionData> partitionData = new HashMap<Integer, PartitionData>(1);
partitionData.put(DefaultPartitionAccessor.DEFAULT_PARTITION_ID, new PartitionData(1d));
Map<URI, Map<Integer, PartitionData>> uriData = new HashMap<URI, Map<Integer, PartitionData>>();
uriData.put(uri, partitionData);
schemes.add("http");
_state.register(listener);
assertNull(listener.scheme);
assertNull(listener.strategy);
assertNull(listener.serviceName);
// set up state
_state.listenToCluster("cluster-1", new NullStateListenerCallback());
_state.listenToService("service-1", new NullStateListenerCallback());
List<String> strategyList = Arrays.asList("degraderV3");
_state.refreshServiceStrategies(new ServiceProperties("service-1", "cluster-1", "/test", strategyList, Collections.<String, Object>emptyMap(), Collections.<String, Object>emptyMap(), Collections.<String, String>emptyMap(), schemes, Collections.<URI>emptySet()));
assertEquals(listener.scheme, "http");
assertNotNull(listener.strategy);
assertEquals(listener.serviceName, "service-1");
TrackerClient client = _state.getClient("cluster-1", uri);
TestShutdownCallback callback = new TestShutdownCallback();
_state.shutdown(callback);
if (!callback.await(10, TimeUnit.SECONDS)) {
fail("unable to shut down state");
}
for (TransportClientFactory factory : _clientFactories.values()) {
SimpleLoadBalancerTest.DoNothingClientFactory f = (SimpleLoadBalancerTest.DoNothingClientFactory) factory;
assertEquals(f.getRunningClientCount(), 0, "Not all clients were shut down");
}
assertNull(listener.scheme);
assertNull(listener.strategy);
assertNull(listener.serviceName);
}
Aggregations