Search in sources :

Example 1 with DarkClusterStrategyNameArray

use of com.linkedin.d2.DarkClusterStrategyNameArray in project rest.li by linkedin.

the class DarkClustersConverter method toProperties.

@SuppressWarnings("unchecked")
public static Map<String, Object> toProperties(DarkClusterConfigMap config) {
    if (config == null) {
        return Collections.emptyMap();
    } else {
        Map<String, Object> darkProps = new HashMap<>();
        for (Map.Entry<String, DarkClusterConfig> entry : config.entrySet()) {
            String darkClusterName = entry.getKey();
            DarkClusterConfig darkClusterConfig = entry.getValue();
            Map<String, Object> prop = new HashMap<>();
            if (darkClusterConfig.hasMultiplier()) {
                prop.put(PropertyKeys.DARK_CLUSTER_MULTIPLIER, darkClusterConfig.getMultiplier().toString());
            }
            if (darkClusterConfig.hasDispatcherOutboundTargetRate()) {
                prop.put(PropertyKeys.DARK_CLUSTER_OUTBOUND_TARGET_RATE, darkClusterConfig.getDispatcherOutboundTargetRate().toString());
            }
            if (darkClusterConfig.hasDispatcherMaxRequestsToBuffer()) {
                prop.put(PropertyKeys.DARK_CLUSTER_MAX_REQUESTS_TO_BUFFER, darkClusterConfig.getDispatcherMaxRequestsToBuffer().toString());
            }
            if (darkClusterConfig.hasDispatcherBufferedRequestExpiryInSeconds()) {
                prop.put(PropertyKeys.DARK_CLUSTER_BUFFERED_REQUEST_EXPIRY_IN_SECONDS, darkClusterConfig.getDispatcherBufferedRequestExpiryInSeconds().toString());
            }
            if (darkClusterConfig.hasDarkClusterStrategyPrioritizedList()) {
                DarkClusterStrategyNameArray strategyNameArray = darkClusterConfig.getDarkClusterStrategyPrioritizedList();
                List<String> strategyList = new ArrayList<>();
                for (DarkClusterStrategyName type : strategyNameArray) {
                    strategyList.add(type.toString());
                }
                prop.put(PropertyKeys.DARK_CLUSTER_STRATEGY_LIST, strategyList);
            }
            if (darkClusterConfig.hasTransportClientProperties()) {
                prop.put(PropertyKeys.DARK_CLUSTER_TRANSPORT_CLIENT_PROPERTIES, TransportClientPropertiesConverter.toProperties(darkClusterConfig.getTransportClientProperties()));
            }
            darkProps.put(darkClusterName, prop);
        }
        return darkProps;
    }
}
Also used : HashMap(java.util.HashMap) DarkClusterStrategyNameArray(com.linkedin.d2.DarkClusterStrategyNameArray) DarkClusterStrategyName(com.linkedin.d2.DarkClusterStrategyName) DarkClusterConfig(com.linkedin.d2.DarkClusterConfig) ArrayList(java.util.ArrayList) DarkClusterConfigMap(com.linkedin.d2.DarkClusterConfigMap) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with DarkClusterStrategyNameArray

use of com.linkedin.d2.DarkClusterStrategyNameArray in project rest.li by linkedin.

the class DarkClustersConverterTest method testMultipleStrategies.

@Test
public void testMultipleStrategies() {
    DarkClusterConfigMap configMap = new DarkClusterConfigMap();
    DarkClusterStrategyNameArray darkClusterStrategyNameArray = new DarkClusterStrategyNameArray();
    darkClusterStrategyNameArray.add(DarkClusterStrategyName.RELATIVE_TRAFFIC);
    darkClusterStrategyNameArray.add(DarkClusterStrategyName.CONSTANT_QPS);
    DarkClusterConfig config = new DarkClusterConfig().setDarkClusterStrategyPrioritizedList(darkClusterStrategyNameArray);
    configMap.put(DARK_CLUSTER_KEY, config);
    // these are defaults that will be set if the fields are missing.
    config.setMultiplier(DARK_CLUSTER_DEFAULT_MULTIPLIER);
    DarkClusterConfigMap expectedConfigMap = new DarkClusterConfigMap();
    DarkClusterConfig expectedConfig = new DarkClusterConfig(config.data());
    expectedConfig.setMultiplier(0);
    expectedConfig.setDispatcherOutboundTargetRate(0);
    expectedConfig.setDispatcherMaxRequestsToBuffer(1);
    expectedConfig.setDispatcherBufferedRequestExpiryInSeconds(1);
    expectedConfigMap.put(DARK_CLUSTER_KEY, expectedConfig);
    DarkClusterConfigMap resultConfigMap = DarkClustersConverter.toConfig(DarkClustersConverter.toProperties(configMap));
    Assert.assertEquals(resultConfigMap, expectedConfigMap);
    Assert.assertEquals(resultConfigMap.get(DARK_CLUSTER_KEY).getDarkClusterStrategyPrioritizedList().get(0), DarkClusterStrategyName.RELATIVE_TRAFFIC, "expected first strategy to be RELATIVE_TRAFFIC");
    Assert.assertEquals(resultConfigMap.get(DARK_CLUSTER_KEY).getDarkClusterStrategyPrioritizedList().get(1), DarkClusterStrategyName.CONSTANT_QPS, "expected first strategy to be CONSTANT_QPS");
}
Also used : DarkClusterConfigMap(com.linkedin.d2.DarkClusterConfigMap) DarkClusterStrategyNameArray(com.linkedin.d2.DarkClusterStrategyNameArray) DarkClusterConfig(com.linkedin.d2.DarkClusterConfig) Test(org.testng.annotations.Test)

Example 3 with DarkClusterStrategyNameArray

use of com.linkedin.d2.DarkClusterStrategyNameArray in project rest.li by linkedin.

the class TestDarkClusterStrategyFactory method testStrategyFallThruWithNoFallback.

@Test
public void testStrategyFallThruWithNoFallback() {
    DarkClusterConfig darkClusterConfig1 = createRelativeTrafficMultiplierConfig(0.5f);
    DarkClusterStrategyNameArray darkClusterStrategyList = new DarkClusterStrategyNameArray();
    // Only ConstantQPS strategy is present, with no alternative.
    darkClusterStrategyList.addAll(Collections.singletonList(CONSTANT_QPS));
    darkClusterConfig1.setDarkClusterStrategyPrioritizedList(darkClusterStrategyList);
    _clusterInfoProvider.addDarkClusterConfig(SOURCE_CLUSTER_NAME, DARK_CLUSTER_NAME, darkClusterConfig1);
    _clusterInfoProvider.notifyListenersClusterAdded(SOURCE_CLUSTER_NAME);
    DarkClusterStrategy strategy = _strategyFactory.get(DARK_CLUSTER_NAME);
    // test that we didn't find a strategy corresponding to Constant QPS and fell through. It will end up with the NoOpStrategy.
    Assert.assertTrue(strategy instanceof NoOpDarkClusterStrategy);
}
Also used : DarkClusterStrategyNameArray(com.linkedin.d2.DarkClusterStrategyNameArray) DarkClusterConfig(com.linkedin.d2.DarkClusterConfig) NoOpDarkClusterStrategy(com.linkedin.darkcluster.api.NoOpDarkClusterStrategy) RelativeTrafficMultiplierDarkClusterStrategy(com.linkedin.darkcluster.impl.RelativeTrafficMultiplierDarkClusterStrategy) DarkClusterStrategy(com.linkedin.darkcluster.api.DarkClusterStrategy) NoOpDarkClusterStrategy(com.linkedin.darkcluster.api.NoOpDarkClusterStrategy) Test(org.testng.annotations.Test)

Example 4 with DarkClusterStrategyNameArray

use of com.linkedin.d2.DarkClusterStrategyNameArray in project rest.li by linkedin.

the class DarkClusterTestUtil method createRelativeTrafficMultiplierConfig.

/**
 * This creates the RelativeTrafficMultiplierConfig, which justs consists of
 * setting the multiplier.
 */
public static DarkClusterConfig createRelativeTrafficMultiplierConfig(float multiplier) {
    DarkClusterStrategyNameArray darkClusterStrategyArray = new DarkClusterStrategyNameArray();
    darkClusterStrategyArray.add(DarkClusterStrategyName.RELATIVE_TRAFFIC);
    return new DarkClusterConfig().setDarkClusterStrategyPrioritizedList(darkClusterStrategyArray).setMultiplier(multiplier);
}
Also used : DarkClusterStrategyNameArray(com.linkedin.d2.DarkClusterStrategyNameArray) DarkClusterConfig(com.linkedin.d2.DarkClusterConfig)

Example 5 with DarkClusterStrategyNameArray

use of com.linkedin.d2.DarkClusterStrategyNameArray in project rest.li by linkedin.

the class TestDarkClusterStrategyFactory method testStrategyFallThru.

@Test
public void testStrategyFallThru() {
    DarkClusterConfig darkClusterConfig1 = createRelativeTrafficMultiplierConfig(0.5f);
    DarkClusterStrategyNameArray darkClusterStrategyList = new DarkClusterStrategyNameArray();
    darkClusterStrategyList.addAll(Arrays.asList(CONSTANT_QPS, RELATIVE_TRAFFIC));
    darkClusterConfig1.setDarkClusterStrategyPrioritizedList(darkClusterStrategyList);
    _clusterInfoProvider.addDarkClusterConfig(SOURCE_CLUSTER_NAME, DARK_CLUSTER_NAME, darkClusterConfig1);
    _clusterInfoProvider.notifyListenersClusterAdded(SOURCE_CLUSTER_NAME);
    DarkClusterStrategy strategy = _strategyFactory.get(DARK_CLUSTER_NAME);
    // test that we didn't find a strategy corresponding to Constant QPS and fell through to Relative traffic
    Assert.assertTrue(strategy instanceof RelativeTrafficMultiplierDarkClusterStrategy);
    Assert.assertEquals(((RelativeTrafficMultiplierDarkClusterStrategy) strategy).getMultiplier(), 0.5f, "expected 0.5f multiplier");
}
Also used : RelativeTrafficMultiplierDarkClusterStrategy(com.linkedin.darkcluster.impl.RelativeTrafficMultiplierDarkClusterStrategy) DarkClusterStrategyNameArray(com.linkedin.d2.DarkClusterStrategyNameArray) DarkClusterConfig(com.linkedin.d2.DarkClusterConfig) NoOpDarkClusterStrategy(com.linkedin.darkcluster.api.NoOpDarkClusterStrategy) RelativeTrafficMultiplierDarkClusterStrategy(com.linkedin.darkcluster.impl.RelativeTrafficMultiplierDarkClusterStrategy) DarkClusterStrategy(com.linkedin.darkcluster.api.DarkClusterStrategy) Test(org.testng.annotations.Test)

Aggregations

DarkClusterStrategyNameArray (com.linkedin.d2.DarkClusterStrategyNameArray)10 DarkClusterConfig (com.linkedin.d2.DarkClusterConfig)8 Test (org.testng.annotations.Test)6 DarkClusterConfigMap (com.linkedin.d2.DarkClusterConfigMap)5 NoOpDarkClusterStrategy (com.linkedin.darkcluster.api.NoOpDarkClusterStrategy)4 DarkClusterStrategy (com.linkedin.darkcluster.api.DarkClusterStrategy)3 RelativeTrafficMultiplierDarkClusterStrategy (com.linkedin.darkcluster.impl.RelativeTrafficMultiplierDarkClusterStrategy)3 ArrayList (java.util.ArrayList)3 HashMap (java.util.HashMap)3 D2TransportClientProperties (com.linkedin.d2.D2TransportClientProperties)2 Map (java.util.Map)2 DarkClusterStrategyName (com.linkedin.d2.DarkClusterStrategyName)1 BaseDarkClusterDispatcher (com.linkedin.darkcluster.api.BaseDarkClusterDispatcher)1 DataList (com.linkedin.data.DataList)1 ConstantQpsRateLimiter (com.linkedin.r2.transport.http.client.ConstantQpsRateLimiter)1 List (java.util.List)1