xds: Avoid switchTo in WrrLocalityLb and WeightedTargetLb

This commit is contained in:
Eric Anderson 2024-03-05 23:55:24 -08:00
parent ebed04798c
commit 2c49cc4197
10 changed files with 94 additions and 97 deletions

View File

@ -79,17 +79,11 @@ final class WeightedTargetLoadBalancer extends LoadBalancer {
WeightedTargetConfig weightedTargetConfig = (WeightedTargetConfig) lbConfig; WeightedTargetConfig weightedTargetConfig = (WeightedTargetConfig) lbConfig;
Map<String, WeightedPolicySelection> newTargets = weightedTargetConfig.targets; Map<String, WeightedPolicySelection> newTargets = weightedTargetConfig.targets;
for (String targetName : newTargets.keySet()) { for (String targetName : newTargets.keySet()) {
WeightedPolicySelection weightedChildLbConfig = newTargets.get(targetName);
if (!targets.containsKey(targetName)) { if (!targets.containsKey(targetName)) {
ChildHelper childHelper = new ChildHelper(targetName); ChildHelper childHelper = new ChildHelper(targetName);
GracefulSwitchLoadBalancer childBalancer = new GracefulSwitchLoadBalancer(childHelper); GracefulSwitchLoadBalancer childBalancer = new GracefulSwitchLoadBalancer(childHelper);
childBalancer.switchTo(weightedChildLbConfig.policySelection.getProvider());
childHelpers.put(targetName, childHelper); childHelpers.put(targetName, childHelper);
childBalancers.put(targetName, childBalancer); childBalancers.put(targetName, childBalancer);
} else if (!weightedChildLbConfig.policySelection.getProvider().equals(
targets.get(targetName).policySelection.getProvider())) {
childBalancers.get(targetName)
.switchTo(weightedChildLbConfig.policySelection.getProvider());
} }
} }
targets = newTargets; targets = newTargets;
@ -97,7 +91,7 @@ final class WeightedTargetLoadBalancer extends LoadBalancer {
childBalancers.get(targetName).handleResolvedAddresses( childBalancers.get(targetName).handleResolvedAddresses(
resolvedAddresses.toBuilder() resolvedAddresses.toBuilder()
.setAddresses(AddressFilter.filter(resolvedAddresses.getAddresses(), targetName)) .setAddresses(AddressFilter.filter(resolvedAddresses.getAddresses(), targetName))
.setLoadBalancingPolicyConfig(targets.get(targetName).policySelection.getConfig()) .setLoadBalancingPolicyConfig(targets.get(targetName).childConfig)
.setAttributes(resolvedAddresses.getAttributes().toBuilder() .setAttributes(resolvedAddresses.getAttributes().toBuilder()
.set(CHILD_NAME, targetName) .set(CHILD_NAME, targetName)
.build()) .build())

View File

@ -26,11 +26,8 @@ import io.grpc.LoadBalancerRegistry;
import io.grpc.NameResolver.ConfigOrError; import io.grpc.NameResolver.ConfigOrError;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.internal.JsonUtil; import io.grpc.internal.JsonUtil;
import io.grpc.internal.ServiceConfigUtil; import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.internal.ServiceConfigUtil.LbConfig;
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -97,22 +94,16 @@ public final class WeightedTargetLoadBalancerProvider extends LoadBalancerProvid
return ConfigOrError.fromError(Status.INTERNAL.withDescription( return ConfigOrError.fromError(Status.INTERNAL.withDescription(
"Wrong weight for target " + name + " in weighted_target LB policy:\n " + rawConfig)); "Wrong weight for target " + name + " in weighted_target LB policy:\n " + rawConfig));
} }
List<LbConfig> childConfigCandidates = ServiceConfigUtil.unwrapLoadBalancingConfigList(
JsonUtil.getListOfObjects(rawWeightedTarget, "childPolicy"));
if (childConfigCandidates == null || childConfigCandidates.isEmpty()) {
return ConfigOrError.fromError(Status.INTERNAL.withDescription(
"No child policy for target " + name + " in weighted_target LB policy:\n "
+ rawConfig));
}
LoadBalancerRegistry lbRegistry = LoadBalancerRegistry lbRegistry =
this.lbRegistry == null ? LoadBalancerRegistry.getDefaultRegistry() : this.lbRegistry; this.lbRegistry == null ? LoadBalancerRegistry.getDefaultRegistry() : this.lbRegistry;
ConfigOrError selectedConfig = ConfigOrError childConfig = GracefulSwitchLoadBalancer.parseLoadBalancingPolicyConfig(
ServiceConfigUtil.selectLbPolicyFromList(childConfigCandidates, lbRegistry); JsonUtil.getListOfObjects(rawWeightedTarget, "childPolicy"), lbRegistry);
if (selectedConfig.getError() != null) { if (childConfig.getError() != null) {
return selectedConfig; return ConfigOrError.fromError(Status.INTERNAL
.withDescription("Could not parse weighted_target's child policy:" + name)
.withCause(childConfig.getError().asRuntimeException()));
} }
PolicySelection policySelection = (PolicySelection) selectedConfig.getConfig(); parsedChildConfigs.put(name, new WeightedPolicySelection(weight, childConfig.getConfig()));
parsedChildConfigs.put(name, new WeightedPolicySelection(weight, policySelection));
} }
return ConfigOrError.fromConfig(new WeightedTargetConfig(parsedChildConfigs)); return ConfigOrError.fromConfig(new WeightedTargetConfig(parsedChildConfigs));
} catch (RuntimeException e) { } catch (RuntimeException e) {
@ -125,11 +116,11 @@ public final class WeightedTargetLoadBalancerProvider extends LoadBalancerProvid
static final class WeightedPolicySelection { static final class WeightedPolicySelection {
final int weight; final int weight;
final PolicySelection policySelection; final Object childConfig;
WeightedPolicySelection(int weight, PolicySelection policySelection) { WeightedPolicySelection(int weight, Object childConfig) {
this.weight = weight; this.weight = weight;
this.policySelection = policySelection; this.childConfig = childConfig;
} }
@Override @Override
@ -141,19 +132,19 @@ public final class WeightedTargetLoadBalancerProvider extends LoadBalancerProvid
return false; return false;
} }
WeightedPolicySelection that = (WeightedPolicySelection) o; WeightedPolicySelection that = (WeightedPolicySelection) o;
return weight == that.weight && Objects.equals(policySelection, that.policySelection); return weight == that.weight && Objects.equals(childConfig, that.childConfig);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(weight, policySelection); return Objects.hash(weight, childConfig);
} }
@Override @Override
public String toString() { public String toString() {
return MoreObjects.toStringHelper(this) return MoreObjects.toStringHelper(this)
.add("weight", weight) .add("weight", weight)
.add("policySelection", policySelection) .add("childConfig", childConfig)
.toString(); .toString();
} }
} }

View File

@ -27,7 +27,6 @@ import io.grpc.InternalLogId;
import io.grpc.LoadBalancer; import io.grpc.LoadBalancer;
import io.grpc.LoadBalancerRegistry; import io.grpc.LoadBalancerRegistry;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
import io.grpc.util.GracefulSwitchLoadBalancer; import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig;
@ -108,13 +107,15 @@ final class WrrLocalityLoadBalancer extends LoadBalancer {
for (String locality : localityWeights.keySet()) { for (String locality : localityWeights.keySet()) {
weightedPolicySelections.put(locality, weightedPolicySelections.put(locality,
new WeightedPolicySelection(localityWeights.get(locality), new WeightedPolicySelection(localityWeights.get(locality),
wrrLocalityConfig.childPolicy)); wrrLocalityConfig.childConfig));
} }
switchLb.switchTo(lbRegistry.getProvider(WEIGHTED_TARGET_POLICY_NAME)); Object switchConfig = GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
lbRegistry.getProvider(WEIGHTED_TARGET_POLICY_NAME),
new WeightedTargetConfig(weightedPolicySelections));
switchLb.handleResolvedAddresses( switchLb.handleResolvedAddresses(
resolvedAddresses.toBuilder() resolvedAddresses.toBuilder()
.setLoadBalancingPolicyConfig(new WeightedTargetConfig(weightedPolicySelections)) .setLoadBalancingPolicyConfig(switchConfig)
.build()); .build());
return Status.OK; return Status.OK;
@ -136,10 +137,10 @@ final class WrrLocalityLoadBalancer extends LoadBalancer {
*/ */
static final class WrrLocalityConfig { static final class WrrLocalityConfig {
final PolicySelection childPolicy; final Object childConfig;
WrrLocalityConfig(PolicySelection childPolicy) { WrrLocalityConfig(Object childConfig) {
this.childPolicy = childPolicy; this.childConfig = childConfig;
} }
@Override @Override
@ -151,17 +152,17 @@ final class WrrLocalityLoadBalancer extends LoadBalancer {
return false; return false;
} }
WrrLocalityConfig that = (WrrLocalityConfig) o; WrrLocalityConfig that = (WrrLocalityConfig) o;
return Objects.equals(childPolicy, that.childPolicy); return Objects.equals(childConfig, that.childConfig);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hashCode(childPolicy); return Objects.hashCode(childConfig);
} }
@Override @Override
public String toString() { public String toString() {
return MoreObjects.toStringHelper(this).add("childPolicy", childPolicy).toString(); return MoreObjects.toStringHelper(this).add("childConfig", childConfig).toString();
} }
} }
} }

View File

@ -24,11 +24,8 @@ import io.grpc.LoadBalancerRegistry;
import io.grpc.NameResolver.ConfigOrError; import io.grpc.NameResolver.ConfigOrError;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.internal.JsonUtil; import io.grpc.internal.JsonUtil;
import io.grpc.internal.ServiceConfigUtil; import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.internal.ServiceConfigUtil.LbConfig;
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
import io.grpc.xds.WrrLocalityLoadBalancer.WrrLocalityConfig; import io.grpc.xds.WrrLocalityLoadBalancer.WrrLocalityConfig;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -62,21 +59,14 @@ public final class WrrLocalityLoadBalancerProvider extends LoadBalancerProvider
@Override @Override
public ConfigOrError parseLoadBalancingPolicyConfig(Map<String, ?> rawConfig) { public ConfigOrError parseLoadBalancingPolicyConfig(Map<String, ?> rawConfig) {
try { try {
List<LbConfig> childConfigCandidates = ServiceConfigUtil.unwrapLoadBalancingConfigList( ConfigOrError childConfig = GracefulSwitchLoadBalancer.parseLoadBalancingPolicyConfig(
JsonUtil.getListOfObjects(rawConfig, "childPolicy")); JsonUtil.getListOfObjects(rawConfig, "childPolicy"));
if (childConfigCandidates == null || childConfigCandidates.isEmpty()) { if (childConfig.getError() != null) {
return ConfigOrError.fromError(Status.INTERNAL.withDescription( return ConfigOrError.fromError(Status.INTERNAL
"No child policy in wrr_locality LB policy: " .withDescription("Failed to parse child policy in wrr_locality LB policy: " + rawConfig)
+ rawConfig)); .withCause(childConfig.getError().asRuntimeException()));
} }
ConfigOrError selectedConfig = return ConfigOrError.fromConfig(new WrrLocalityConfig(childConfig.getConfig()));
ServiceConfigUtil.selectLbPolicyFromList(childConfigCandidates,
LoadBalancerRegistry.getDefaultRegistry());
if (selectedConfig.getError() != null) {
return selectedConfig;
}
PolicySelection policySelection = (PolicySelection) selectedConfig.getConfig();
return ConfigOrError.fromConfig(new WrrLocalityConfig(policySelection));
} catch (RuntimeException e) { } catch (RuntimeException e) {
return ConfigOrError.fromError(Status.INTERNAL.withCause(e) return ConfigOrError.fromError(Status.INTERNAL.withCause(e)
.withDescription("Failed to parse wrr_locality LB config: " + rawConfig)); .withDescription("Failed to parse wrr_locality LB config: " + rawConfig));

View File

@ -52,6 +52,7 @@ import io.grpc.internal.PickSubchannelArgsImpl;
import io.grpc.internal.ServiceConfigUtil.PolicySelection; import io.grpc.internal.ServiceConfigUtil.PolicySelection;
import io.grpc.protobuf.ProtoUtils; import io.grpc.protobuf.ProtoUtils;
import io.grpc.testing.TestMethodDescriptors; import io.grpc.testing.TestMethodDescriptors;
import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.xds.ClusterImplLoadBalancerProvider.ClusterImplConfig; import io.grpc.xds.ClusterImplLoadBalancerProvider.ClusterImplConfig;
import io.grpc.xds.Endpoints.DropOverload; import io.grpc.xds.Endpoints.DropOverload;
import io.grpc.xds.EnvoyServerProtoData.DownstreamTlsContext; import io.grpc.xds.EnvoyServerProtoData.DownstreamTlsContext;
@ -119,8 +120,8 @@ public class ClusterImplLoadBalancerTest {
private final FakeClock fakeClock = new FakeClock(); private final FakeClock fakeClock = new FakeClock();
private final Locality locality = private final Locality locality =
Locality.create("test-region", "test-zone", "test-subzone"); Locality.create("test-region", "test-zone", "test-subzone");
private final PolicySelection roundRobin = private final Object roundRobin = GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
new PolicySelection(new FakeLoadBalancerProvider("round_robin"), null); new FakeLoadBalancerProvider("round_robin"), null);
private final List<FakeLoadBalancer> downstreamBalancers = new ArrayList<>(); private final List<FakeLoadBalancer> downstreamBalancers = new ArrayList<>();
private final FakeTlsContextManager tlsContextManager = new FakeTlsContextManager(); private final FakeTlsContextManager tlsContextManager = new FakeTlsContextManager();
private final LoadStatsManager2 loadStatsManager = private final LoadStatsManager2 loadStatsManager =

View File

@ -59,6 +59,8 @@ import io.grpc.internal.FakeClock.ScheduledTask;
import io.grpc.internal.GrpcUtil; import io.grpc.internal.GrpcUtil;
import io.grpc.internal.ObjectPool; import io.grpc.internal.ObjectPool;
import io.grpc.internal.ServiceConfigUtil.PolicySelection; import io.grpc.internal.ServiceConfigUtil.PolicySelection;
import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.util.GracefulSwitchLoadBalancerAccessor;
import io.grpc.util.OutlierDetectionLoadBalancer.OutlierDetectionLoadBalancerConfig; import io.grpc.util.OutlierDetectionLoadBalancer.OutlierDetectionLoadBalancerConfig;
import io.grpc.util.OutlierDetectionLoadBalancerProvider; import io.grpc.util.OutlierDetectionLoadBalancerProvider;
import io.grpc.xds.ClusterImplLoadBalancerProvider.ClusterImplConfig; import io.grpc.xds.ClusterImplLoadBalancerProvider.ClusterImplConfig;
@ -159,12 +161,14 @@ public class ClusterResolverLoadBalancerTest {
private final NameResolverRegistry nsRegistry = new NameResolverRegistry(); private final NameResolverRegistry nsRegistry = new NameResolverRegistry();
private final PolicySelection roundRobin = new PolicySelection( private final PolicySelection roundRobin = new PolicySelection(
new FakeLoadBalancerProvider("wrr_locality_experimental"), new WrrLocalityConfig( new FakeLoadBalancerProvider("wrr_locality_experimental"), new WrrLocalityConfig(
new PolicySelection(new FakeLoadBalancerProvider("round_robin"), null))); GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
new FakeLoadBalancerProvider("round_robin"), null)));
private final PolicySelection ringHash = new PolicySelection( private final PolicySelection ringHash = new PolicySelection(
new FakeLoadBalancerProvider("ring_hash_experimental"), new RingHashConfig(10L, 100L)); new FakeLoadBalancerProvider("ring_hash_experimental"), new RingHashConfig(10L, 100L));
private final PolicySelection leastRequest = new PolicySelection( private final PolicySelection leastRequest = new PolicySelection(
new FakeLoadBalancerProvider("wrr_locality_experimental"), new WrrLocalityConfig( new FakeLoadBalancerProvider("wrr_locality_experimental"), new WrrLocalityConfig(
new PolicySelection(new FakeLoadBalancerProvider("least_request_experimental"), GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
new FakeLoadBalancerProvider("least_request_experimental"),
new LeastRequestConfig(3)))); new LeastRequestConfig(3))));
private final List<FakeLoadBalancer> childBalancers = new ArrayList<>(); private final List<FakeLoadBalancer> childBalancers = new ArrayList<>();
private final List<FakeNameResolver> resolvers = new ArrayList<>(); private final List<FakeNameResolver> resolvers = new ArrayList<>();
@ -331,8 +335,9 @@ public class ClusterResolverLoadBalancerTest {
tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME); tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME);
WrrLocalityConfig wrrLocalityConfig = WrrLocalityConfig wrrLocalityConfig =
(WrrLocalityConfig) clusterImplConfig.childPolicy.getConfig(); (WrrLocalityConfig) clusterImplConfig.childPolicy.getConfig();
assertThat(wrrLocalityConfig.childPolicy.getProvider().getPolicyName()).isEqualTo( LoadBalancerProvider childProvider =
"least_request_experimental"); GracefulSwitchLoadBalancerAccessor.getChildProvider(wrrLocalityConfig.childConfig);
assertThat(childProvider.getPolicyName()).isEqualTo("least_request_experimental");
assertThat( assertThat(
childBalancer.addresses.get(0).getAttributes() childBalancer.addresses.get(0).getAttributes()
@ -414,8 +419,9 @@ public class ClusterResolverLoadBalancerTest {
tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME); tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME);
WrrLocalityConfig wrrLocalityConfig = WrrLocalityConfig wrrLocalityConfig =
(WrrLocalityConfig) clusterImplConfig.childPolicy.getConfig(); (WrrLocalityConfig) clusterImplConfig.childPolicy.getConfig();
assertThat(wrrLocalityConfig.childPolicy.getProvider().getPolicyName()).isEqualTo( LoadBalancerProvider childProvider =
"least_request_experimental"); GracefulSwitchLoadBalancerAccessor.getChildProvider(wrrLocalityConfig.childConfig);
assertThat(childProvider.getPolicyName()).isEqualTo("least_request_experimental");
assertThat( assertThat(
childBalancer.addresses.get(0).getAttributes() childBalancer.addresses.get(0).getAttributes()
@ -484,8 +490,9 @@ public class ClusterResolverLoadBalancerTest {
assertThat(clusterImplConfig1.childPolicy.getConfig()).isInstanceOf(WrrLocalityConfig.class); assertThat(clusterImplConfig1.childPolicy.getConfig()).isInstanceOf(WrrLocalityConfig.class);
WrrLocalityConfig wrrLocalityConfig1 = WrrLocalityConfig wrrLocalityConfig1 =
(WrrLocalityConfig) clusterImplConfig1.childPolicy.getConfig(); (WrrLocalityConfig) clusterImplConfig1.childPolicy.getConfig();
assertThat(wrrLocalityConfig1.childPolicy.getProvider().getPolicyName()).isEqualTo( LoadBalancerProvider childProvider1 =
"round_robin"); GracefulSwitchLoadBalancerAccessor.getChildProvider(wrrLocalityConfig1.childConfig);
assertThat(childProvider1.getPolicyName()).isEqualTo("round_robin");
PriorityChildConfig priorityChildConfig2 = priorityLbConfig.childConfigs.get(priority2); PriorityChildConfig priorityChildConfig2 = priorityLbConfig.childConfigs.get(priority2);
assertThat(priorityChildConfig2.ignoreReresolution).isTrue(); assertThat(priorityChildConfig2.ignoreReresolution).isTrue();
@ -498,8 +505,9 @@ public class ClusterResolverLoadBalancerTest {
assertThat(clusterImplConfig2.childPolicy.getConfig()).isInstanceOf(WrrLocalityConfig.class); assertThat(clusterImplConfig2.childPolicy.getConfig()).isInstanceOf(WrrLocalityConfig.class);
WrrLocalityConfig wrrLocalityConfig2 = WrrLocalityConfig wrrLocalityConfig2 =
(WrrLocalityConfig) clusterImplConfig1.childPolicy.getConfig(); (WrrLocalityConfig) clusterImplConfig1.childPolicy.getConfig();
assertThat(wrrLocalityConfig2.childPolicy.getProvider().getPolicyName()).isEqualTo( LoadBalancerProvider childProvider2 =
"round_robin"); GracefulSwitchLoadBalancerAccessor.getChildProvider(wrrLocalityConfig2.childConfig);
assertThat(childProvider2.getPolicyName()).isEqualTo("round_robin");
PriorityChildConfig priorityChildConfig3 = priorityLbConfig.childConfigs.get(priority3); PriorityChildConfig priorityChildConfig3 = priorityLbConfig.childConfigs.get(priority3);
assertThat(priorityChildConfig3.ignoreReresolution).isTrue(); assertThat(priorityChildConfig3.ignoreReresolution).isTrue();
@ -512,8 +520,9 @@ public class ClusterResolverLoadBalancerTest {
assertThat(clusterImplConfig3.childPolicy.getConfig()).isInstanceOf(WrrLocalityConfig.class); assertThat(clusterImplConfig3.childPolicy.getConfig()).isInstanceOf(WrrLocalityConfig.class);
WrrLocalityConfig wrrLocalityConfig3 = WrrLocalityConfig wrrLocalityConfig3 =
(WrrLocalityConfig) clusterImplConfig1.childPolicy.getConfig(); (WrrLocalityConfig) clusterImplConfig1.childPolicy.getConfig();
assertThat(wrrLocalityConfig3.childPolicy.getProvider().getPolicyName()).isEqualTo( LoadBalancerProvider childProvider3 =
"round_robin"); GracefulSwitchLoadBalancerAccessor.getChildProvider(wrrLocalityConfig3.childConfig);
assertThat(childProvider3.getPolicyName()).isEqualTo("round_robin");
for (EquivalentAddressGroup eag : childBalancer.addresses) { for (EquivalentAddressGroup eag : childBalancer.addresses) {
if (eag.getAttributes().get(InternalXdsAttributes.ATTR_LOCALITY) == locality1) { if (eag.getAttributes().get(InternalXdsAttributes.ATTR_LOCALITY) == locality1) {

View File

@ -26,7 +26,7 @@ import io.grpc.LoadBalancerProvider;
import io.grpc.LoadBalancerRegistry; import io.grpc.LoadBalancerRegistry;
import io.grpc.NameResolver.ConfigOrError; import io.grpc.NameResolver.ConfigOrError;
import io.grpc.internal.JsonParser; import io.grpc.internal.JsonParser;
import io.grpc.internal.ServiceConfigUtil.PolicySelection; import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig;
import java.util.Map; import java.util.Map;
@ -128,11 +128,13 @@ public class WeightedTargetLoadBalancerProviderTest {
"target_1", "target_1",
new WeightedPolicySelection( new WeightedPolicySelection(
10, 10,
new PolicySelection(lbProviderFoo, fooConfig)), GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
lbProviderFoo, fooConfig)),
"target_2", "target_2",
new WeightedPolicySelection( new WeightedPolicySelection(
20, 20,
new PolicySelection(lbProviderBar, barConfig))))); GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
lbProviderBar, barConfig)))));
assertThat(parsedConfig).isEqualTo(expectedConfig); assertThat(parsedConfig).isEqualTo(expectedConfig);
} }
} }

View File

@ -49,7 +49,7 @@ import io.grpc.LoadBalancerProvider;
import io.grpc.LoadBalancerRegistry; import io.grpc.LoadBalancerRegistry;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.SynchronizationContext; import io.grpc.SynchronizationContext;
import io.grpc.internal.ServiceConfigUtil.PolicySelection; import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.xds.WeightedRandomPicker.WeightedChildPicker; import io.grpc.xds.WeightedRandomPicker.WeightedChildPicker;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig;
@ -146,13 +146,13 @@ public class WeightedTargetLoadBalancerTest {
}; };
private final WeightedPolicySelection weightedLbConfig0 = new WeightedPolicySelection( private final WeightedPolicySelection weightedLbConfig0 = new WeightedPolicySelection(
weights[0], new PolicySelection(fooLbProvider, configs[0])); weights[0], newChildConfig(fooLbProvider, configs[0]));
private final WeightedPolicySelection weightedLbConfig1 = new WeightedPolicySelection( private final WeightedPolicySelection weightedLbConfig1 = new WeightedPolicySelection(
weights[1], new PolicySelection(barLbProvider, configs[1])); weights[1], newChildConfig(barLbProvider, configs[1]));
private final WeightedPolicySelection weightedLbConfig2 = new WeightedPolicySelection( private final WeightedPolicySelection weightedLbConfig2 = new WeightedPolicySelection(
weights[2], new PolicySelection(barLbProvider, configs[2])); weights[2], newChildConfig(barLbProvider, configs[2]));
private final WeightedPolicySelection weightedLbConfig3 = new WeightedPolicySelection( private final WeightedPolicySelection weightedLbConfig3 = new WeightedPolicySelection(
weights[3], new PolicySelection(fooLbProvider, configs[3])); weights[3], newChildConfig(fooLbProvider, configs[3]));
@Mock @Mock
private Helper helper; private Helper helper;
@ -233,16 +233,16 @@ public class WeightedTargetLoadBalancerTest {
Map<String, WeightedPolicySelection> newTargets = ImmutableMap.of( Map<String, WeightedPolicySelection> newTargets = ImmutableMap.of(
"target1", "target1",
new WeightedPolicySelection( new WeightedPolicySelection(
newWeights[0], new PolicySelection(barLbProvider, newConfigs[0])), newWeights[0], newChildConfig(barLbProvider, newConfigs[0])),
"target2", "target2",
new WeightedPolicySelection( new WeightedPolicySelection(
newWeights[1], new PolicySelection(barLbProvider, newConfigs[1])), newWeights[1], newChildConfig(barLbProvider, newConfigs[1])),
"target3", "target3",
new WeightedPolicySelection( new WeightedPolicySelection(
newWeights[2], new PolicySelection(fooLbProvider, newConfigs[2])), newWeights[2], newChildConfig(fooLbProvider, newConfigs[2])),
"target4", "target4",
new WeightedPolicySelection( new WeightedPolicySelection(
newWeights[3], new PolicySelection(fooLbProvider, newConfigs[3]))); newWeights[3], newChildConfig(fooLbProvider, newConfigs[3])));
weightedTargetLb.handleResolvedAddresses( weightedTargetLb.handleResolvedAddresses(
ResolvedAddresses.newBuilder() ResolvedAddresses.newBuilder()
.setAddresses(ImmutableList.<EquivalentAddressGroup>of()) .setAddresses(ImmutableList.<EquivalentAddressGroup>of())
@ -418,9 +418,9 @@ public class WeightedTargetLoadBalancerTest {
Map<String, WeightedPolicySelection> targets = ImmutableMap.of( Map<String, WeightedPolicySelection> targets = ImmutableMap.of(
"target0", new WeightedPolicySelection( "target0", new WeightedPolicySelection(
weights[0], new PolicySelection(fakeLbProvider, configs[0])), weights[0], newChildConfig(fakeLbProvider, configs[0])),
"target3", new WeightedPolicySelection( "target3", new WeightedPolicySelection(
weights[3], new PolicySelection(fakeLbProvider, configs[3]))); weights[3], newChildConfig(fakeLbProvider, configs[3])));
weightedTargetLb.handleResolvedAddresses( weightedTargetLb.handleResolvedAddresses(
ResolvedAddresses.newBuilder() ResolvedAddresses.newBuilder()
.setAddresses(ImmutableList.<EquivalentAddressGroup>of()) .setAddresses(ImmutableList.<EquivalentAddressGroup>of())
@ -434,6 +434,10 @@ public class WeightedTargetLoadBalancerTest {
} }
private Object newChildConfig(LoadBalancerProvider provider, Object config) {
return GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(provider, config);
}
private static class FakeLoadBalancerProvider extends LoadBalancerProvider { private static class FakeLoadBalancerProvider extends LoadBalancerProvider {
@Override @Override

View File

@ -27,6 +27,7 @@ import io.grpc.LoadBalancer.Helper;
import io.grpc.LoadBalancerProvider; import io.grpc.LoadBalancerProvider;
import io.grpc.LoadBalancerRegistry; import io.grpc.LoadBalancerRegistry;
import io.grpc.NameResolver; import io.grpc.NameResolver;
import io.grpc.util.GracefulSwitchLoadBalancerAccessor;
import io.grpc.xds.WrrLocalityLoadBalancer.WrrLocalityConfig; import io.grpc.xds.WrrLocalityLoadBalancer.WrrLocalityConfig;
import java.util.Map; import java.util.Map;
import org.junit.Test; import org.junit.Test;
@ -64,6 +65,8 @@ public class WrrLocalityLoadBalancerProviderTest {
WrrLocalityLoadBalancerProvider provider = new WrrLocalityLoadBalancerProvider(); WrrLocalityLoadBalancerProvider provider = new WrrLocalityLoadBalancerProvider();
NameResolver.ConfigOrError configOrError = provider.parseLoadBalancingPolicyConfig(rawConfig); NameResolver.ConfigOrError configOrError = provider.parseLoadBalancingPolicyConfig(rawConfig);
WrrLocalityConfig config = (WrrLocalityConfig) configOrError.getConfig(); WrrLocalityConfig config = (WrrLocalityConfig) configOrError.getConfig();
assertThat(config.childPolicy.getProvider().getPolicyName()).isEqualTo("round_robin"); LoadBalancerProvider childProvider =
GracefulSwitchLoadBalancerAccessor.getChildProvider(config.childConfig);
assertThat(childProvider.getPolicyName()).isEqualTo("round_robin");
} }
} }

View File

@ -38,7 +38,7 @@ import io.grpc.LoadBalancerProvider;
import io.grpc.LoadBalancerRegistry; import io.grpc.LoadBalancerRegistry;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.SynchronizationContext; import io.grpc.SynchronizationContext;
import io.grpc.internal.ServiceConfigUtil.PolicySelection; import io.grpc.util.GracefulSwitchLoadBalancer;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedPolicySelection;
import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig; import io.grpc.xds.WeightedTargetLoadBalancerProvider.WeightedTargetConfig;
import io.grpc.xds.WrrLocalityLoadBalancer.WrrLocalityConfig; import io.grpc.xds.WrrLocalityLoadBalancer.WrrLocalityConfig;
@ -112,7 +112,7 @@ public class WrrLocalityLoadBalancerTest {
// A two locality cluster with a mock child LB policy. // A two locality cluster with a mock child LB policy.
String localityOne = "localityOne"; String localityOne = "localityOne";
String localityTwo = "localityTwo"; String localityTwo = "localityTwo";
PolicySelection childPolicy = new PolicySelection(mockChildProvider, null); Object childPolicy = newChildConfig(mockChildProvider, null);
// The child config is delivered wrapped in the wrr_locality config and the locality weights // The child config is delivered wrapped in the wrr_locality config and the locality weights
// in a ResolvedAddresses attribute. // in a ResolvedAddresses attribute.
@ -138,7 +138,7 @@ public class WrrLocalityLoadBalancerTest {
@Test @Test
public void handleResolvedAddresses_noLocalityWeights() { public void handleResolvedAddresses_noLocalityWeights() {
// A two locality cluster with a mock child LB policy. // A two locality cluster with a mock child LB policy.
PolicySelection childPolicy = new PolicySelection(mockChildProvider, null); Object childPolicy = newChildConfig(mockChildProvider, null);
// The child config is delivered wrapped in the wrr_locality config and the locality weights // The child config is delivered wrapped in the wrr_locality config and the locality weights
// in a ResolvedAddresses attribute. // in a ResolvedAddresses attribute.
@ -163,7 +163,7 @@ public class WrrLocalityLoadBalancerTest {
@Test @Test
public void handleNameResolutionError_withChildLb() { public void handleNameResolutionError_withChildLb() {
deliverAddresses(new WrrLocalityConfig(new PolicySelection(mockChildProvider, null)), deliverAddresses(new WrrLocalityConfig(newChildConfig(mockChildProvider, null)),
ImmutableList.of(makeAddress("addr1", "test-locality", 1))); ImmutableList.of(makeAddress("addr1", "test-locality", 1)));
Status status = Status.DEADLINE_EXCEEDED.withDescription("too slow"); Status status = Status.DEADLINE_EXCEEDED.withDescription("too slow");
loadBalancer.handleNameResolutionError(status); loadBalancer.handleNameResolutionError(status);
@ -175,7 +175,7 @@ public class WrrLocalityLoadBalancerTest {
@Test @Test
public void localityWeightAttributeNotPropagated() { public void localityWeightAttributeNotPropagated() {
PolicySelection childPolicy = new PolicySelection(mockChildProvider, null); Object childPolicy = newChildConfig(mockChildProvider, null);
WrrLocalityConfig wlConfig = new WrrLocalityConfig(childPolicy); WrrLocalityConfig wlConfig = new WrrLocalityConfig(childPolicy);
deliverAddresses(wlConfig, ImmutableList.of(makeAddress("addr1", "test-locality", 1))); deliverAddresses(wlConfig, ImmutableList.of(makeAddress("addr1", "test-locality", 1)));
@ -190,7 +190,7 @@ public class WrrLocalityLoadBalancerTest {
@Test @Test
public void shutdown() { public void shutdown() {
deliverAddresses(new WrrLocalityConfig(new PolicySelection(mockChildProvider, null)), deliverAddresses(new WrrLocalityConfig(newChildConfig(mockChildProvider, null)),
ImmutableList.of(makeAddress("addr", "test-locality", 1))); ImmutableList.of(makeAddress("addr", "test-locality", 1)));
loadBalancer.shutdown(); loadBalancer.shutdown();
@ -199,17 +199,19 @@ public class WrrLocalityLoadBalancerTest {
@Test @Test
public void configEquality() { public void configEquality() {
WrrLocalityConfig configOne = new WrrLocalityConfig( WrrLocalityConfig configOne = new WrrLocalityConfig(newChildConfig(mockChildProvider, null));
new PolicySelection(mockChildProvider, null)); WrrLocalityConfig configTwo = new WrrLocalityConfig(newChildConfig(mockChildProvider, null));
WrrLocalityConfig configTwo = new WrrLocalityConfig(
new PolicySelection(mockChildProvider, null));
WrrLocalityConfig differentConfig = new WrrLocalityConfig( WrrLocalityConfig differentConfig = new WrrLocalityConfig(
new PolicySelection(mockChildProvider, "config")); newChildConfig(mockChildProvider, "config"));
new EqualsTester().addEqualityGroup(configOne, configTwo).addEqualityGroup(differentConfig) new EqualsTester().addEqualityGroup(configOne, configTwo).addEqualityGroup(differentConfig)
.testEquals(); .testEquals();
} }
private Object newChildConfig(LoadBalancerProvider provider, Object config) {
return GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(provider, config);
}
private void deliverAddresses(WrrLocalityConfig config, List<EquivalentAddressGroup> addresses) { private void deliverAddresses(WrrLocalityConfig config, List<EquivalentAddressGroup> addresses) {
loadBalancer.handleResolvedAddresses( loadBalancer.handleResolvedAddresses(
ResolvedAddresses.newBuilder().setAddresses(addresses).setLoadBalancingPolicyConfig(config) ResolvedAddresses.newBuilder().setAddresses(addresses).setLoadBalancingPolicyConfig(config)