Skip to content

Commit 6e0748d

Browse files
authored
xds: refactor XdsConfig to use PolicySelection
1 parent 99b6d01 commit 6e0748d

File tree

8 files changed

+205
-264
lines changed

8 files changed

+205
-264
lines changed

xds/src/main/java/io/grpc/xds/CdsLoadBalancer.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
import io.grpc.EquivalentAddressGroup;
2828
import io.grpc.InternalLogId;
2929
import io.grpc.LoadBalancer;
30+
import io.grpc.LoadBalancerProvider;
3031
import io.grpc.LoadBalancerRegistry;
3132
import io.grpc.Status;
3233
import io.grpc.internal.ObjectPool;
33-
import io.grpc.internal.ServiceConfigUtil.LbConfig;
34+
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
3435
import io.grpc.util.ForwardingLoadBalancerHelper;
3536
import io.grpc.util.GracefulSwitchLoadBalancer;
3637
import io.grpc.xds.CdsLoadBalancerProvider.CdsConfig;
@@ -283,10 +284,13 @@ public void onClusterChanged(ClusterUpdate newUpdate) {
283284
checkArgument(
284285
newUpdate.getLbPolicy().equals("round_robin"), "can only support round_robin policy");
285286

287+
LoadBalancerProvider lbProvider = lbRegistry.getProvider(newUpdate.getLbPolicy());
288+
Object lbConfig =
289+
lbProvider.parseLoadBalancingPolicyConfig(ImmutableMap.<String, Object>of()).getConfig();
286290
final XdsConfig edsConfig =
287291
new XdsConfig(
288292
/* cluster = */ newUpdate.getClusterName(),
289-
new LbConfig(newUpdate.getLbPolicy(), ImmutableMap.<String, Object>of()),
293+
new PolicySelection(lbProvider, ImmutableMap.<String, Object>of(), lbConfig),
290294
/* fallbackPolicy = */ null,
291295
/* edsServiceName = */ newUpdate.getEdsServiceName(),
292296
/* lrsServerName = */ newUpdate.getLrsServerName());

xds/src/main/java/io/grpc/xds/EdsLoadBalancer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,10 @@ public void handleResolvedAddresses(ResolvedAddresses resolvedAddresses) {
121121
"Received EDS lb config: cluster={0}, child_policy={1}, fallback_policy={2}, "
122122
+ "eds_service_name={3}, report_load={4}",
123123
newXdsConfig.cluster,
124-
newXdsConfig.childPolicy != null ? newXdsConfig.childPolicy.getPolicyName() : "",
125-
newXdsConfig.fallbackPolicy != null ? newXdsConfig.fallbackPolicy.getPolicyName() : "",
124+
newXdsConfig.endpointPickingPolicy != null
125+
? newXdsConfig.endpointPickingPolicy.getProvider().getPolicyName() : "",
126+
newXdsConfig.fallbackPolicy != null
127+
? newXdsConfig.fallbackPolicy.getProvider().getPolicyName() : "",
126128
newXdsConfig.edsServiceName,
127129
newXdsConfig.lrsServerName != null);
128130
}

xds/src/main/java/io/grpc/xds/FallbackLb.java

Lines changed: 6 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -19,37 +19,24 @@
1919
import static com.google.common.base.Preconditions.checkNotNull;
2020
import static io.grpc.ConnectivityState.TRANSIENT_FAILURE;
2121

22-
import com.google.common.annotations.VisibleForTesting;
23-
import io.grpc.Attributes;
2422
import io.grpc.EquivalentAddressGroup;
2523
import io.grpc.LoadBalancer;
26-
import io.grpc.LoadBalancerRegistry;
27-
import io.grpc.NameResolver.ConfigOrError;
2824
import io.grpc.Status;
29-
import io.grpc.internal.ServiceConfigUtil.LbConfig;
25+
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
3026
import io.grpc.util.ForwardingLoadBalancer;
3127
import io.grpc.util.GracefulSwitchLoadBalancer;
3228
import io.grpc.xds.XdsLoadBalancerProvider.XdsConfig;
3329
import io.grpc.xds.XdsSubchannelPickers.ErrorPicker;
3430
import java.util.List;
35-
import java.util.Map;
3631

3732
/** Fallback load balancer. Handles fallback policy changes. */
3833
final class FallbackLb extends ForwardingLoadBalancer {
3934

4035
private final Helper fallbackLbHelper;
41-
private final LoadBalancerRegistry lbRegistry;
4236
private final GracefulSwitchLoadBalancer fallbackPolicyLb;
4337

4438
FallbackLb(Helper fallbackLbHelper) {
45-
this(checkNotNull(fallbackLbHelper, "fallbackLbHelper"),
46-
LoadBalancerRegistry.getDefaultRegistry());
47-
}
48-
49-
@VisibleForTesting
50-
FallbackLb(Helper fallbackLbHelper, LoadBalancerRegistry lbRegistry) {
51-
this.fallbackLbHelper = fallbackLbHelper;
52-
this.lbRegistry = lbRegistry;
39+
this.fallbackLbHelper = checkNotNull(fallbackLbHelper, "fallbackLbHelper");
5340
fallbackPolicyLb = new GracefulSwitchLoadBalancer(fallbackLbHelper);
5441
}
5542

@@ -58,55 +45,18 @@ protected LoadBalancer delegate() {
5845
return fallbackPolicyLb;
5946
}
6047

61-
@SuppressWarnings("deprecation")
6248
@Override
6349
public void handleResolvedAddresses(ResolvedAddresses resolvedAddresses) {
64-
Attributes attributes = resolvedAddresses.getAttributes();
65-
XdsConfig xdsConfig;
66-
Object lbConfig = resolvedAddresses.getLoadBalancingPolicyConfig();
67-
if (lbConfig != null) {
68-
if (!(lbConfig instanceof XdsConfig)) {
69-
fallbackLbHelper.updateBalancingState(
70-
TRANSIENT_FAILURE,
71-
new ErrorPicker(Status.UNAVAILABLE.withDescription(
72-
"Load balancing config '" + lbConfig + "' is not an XdsConfig")));
73-
return;
74-
}
75-
xdsConfig = (XdsConfig) lbConfig;
76-
} else {
77-
// In the future, in all cases xdsConfig can be obtained directly by
78-
// resolvedAddresses.getLoadBalancingPolicyConfig().
79-
Map<String, ?> newRawLbConfig = attributes.get(ATTR_LOAD_BALANCING_CONFIG);
80-
if (newRawLbConfig == null) {
81-
// This will not happen when the service config error handling is implemented.
82-
// For now simply go to TRANSIENT_FAILURE.
83-
fallbackLbHelper.updateBalancingState(
84-
TRANSIENT_FAILURE,
85-
new ErrorPicker(
86-
Status.UNAVAILABLE.withDescription("ATTR_LOAD_BALANCING_CONFIG not available")));
87-
return;
88-
}
89-
ConfigOrError cfg =
90-
XdsLoadBalancerProvider.parseLoadBalancingConfigPolicy(newRawLbConfig, lbRegistry);
91-
if (cfg.getError() != null) {
92-
// This will not happen when the service config error handling is implemented.
93-
// For now simply go to TRANSIENT_FAILURE.
94-
fallbackLbHelper.updateBalancingState(TRANSIENT_FAILURE, new ErrorPicker(cfg.getError()));
95-
return;
96-
}
97-
xdsConfig = (XdsConfig) cfg.getConfig();
98-
}
99-
100-
LbConfig fallbackPolicy = xdsConfig.fallbackPolicy;
50+
XdsConfig xdsConfig = (XdsConfig) resolvedAddresses.getLoadBalancingPolicyConfig();
51+
PolicySelection fallbackPolicy = xdsConfig.fallbackPolicy;
10152
if (fallbackPolicy == null) {
10253
// In the latest xDS design, fallback is not supported.
10354
fallbackLbHelper.updateBalancingState(
10455
TRANSIENT_FAILURE,
10556
new ErrorPicker(Status.UNAVAILABLE.withDescription("Fallback is not supported")));
10657
return;
10758
}
108-
String newFallbackPolicyName = fallbackPolicy.getPolicyName();
109-
fallbackPolicyLb.switchTo(lbRegistry.getProvider(newFallbackPolicyName));
59+
fallbackPolicyLb.switchTo(fallbackPolicy.getProvider());
11060

11161
List<EquivalentAddressGroup> servers = resolvedAddresses.getAddresses();
11262
// TODO(zhangkun83): FIXME(#5496): this is a temporary hack.
@@ -119,8 +69,7 @@ public void handleResolvedAddresses(ResolvedAddresses resolvedAddresses) {
11969
// TODO(carl-mastrangelo): propagate the load balancing config policy
12070
ResolvedAddresses fallbackResolvedAddresses = resolvedAddresses.toBuilder()
12171
.setAddresses(servers)
122-
.setAttributes(attributes.toBuilder()
123-
.set(ATTR_LOAD_BALANCING_CONFIG, fallbackPolicy.getRawConfigValue()).build())
72+
.setLoadBalancingPolicyConfig(fallbackPolicy.getConfig())
12473
.build();
12574
fallbackPolicyLb.handleResolvedAddresses(fallbackResolvedAddresses);
12675
}

xds/src/main/java/io/grpc/xds/XdsLoadBalancerProvider.java

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
package io.grpc.xds;
1818

19-
import com.google.common.annotations.VisibleForTesting;
19+
import static com.google.common.base.Preconditions.checkNotNull;
20+
2021
import com.google.common.base.MoreObjects;
2122
import com.google.common.base.Objects;
2223
import com.google.common.collect.ImmutableMap;
@@ -30,6 +31,8 @@
3031
import io.grpc.internal.JsonUtil;
3132
import io.grpc.internal.ServiceConfigUtil;
3233
import io.grpc.internal.ServiceConfigUtil.LbConfig;
34+
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
35+
import java.util.ArrayList;
3336
import java.util.List;
3437
import java.util.Map;
3538
import javax.annotation.Nullable;
@@ -42,10 +45,7 @@
4245
@Internal
4346
public final class XdsLoadBalancerProvider extends LoadBalancerProvider {
4447

45-
static final String XDS_POLICY_NAME = "xds_experimental";
46-
47-
private static final LbConfig DEFAULT_FALLBACK_POLICY =
48-
new LbConfig("round_robin", ImmutableMap.<String, Void>of());
48+
private static final String XDS_POLICY_NAME = "xds_experimental";
4949

5050
@Override
5151
public boolean isAvailable() {
@@ -78,8 +78,38 @@ static ConfigOrError parseLoadBalancingConfigPolicy(
7878
Map<String, ?> rawLoadBalancingPolicyConfig, LoadBalancerRegistry registry) {
7979
try {
8080
String cluster = JsonUtil.getString(rawLoadBalancingPolicyConfig, "cluster");
81-
LbConfig childPolicy = selectChildPolicy(rawLoadBalancingPolicyConfig, registry);
82-
LbConfig fallbackPolicy = selectFallbackPolicy(rawLoadBalancingPolicyConfig, registry);
81+
82+
LbConfig roundRobinConfig = new LbConfig("round_robin", ImmutableMap.<String, Object>of());
83+
List<LbConfig> endpointPickingConfigs = ServiceConfigUtil.unwrapLoadBalancingConfigList(
84+
JsonUtil.getListOfObjects(rawLoadBalancingPolicyConfig, "endpointPickingPolicy"));
85+
if (endpointPickingConfigs == null) {
86+
endpointPickingConfigs = new ArrayList<>(1);
87+
} else {
88+
endpointPickingConfigs = new ArrayList<>(endpointPickingConfigs);
89+
}
90+
endpointPickingConfigs.add(roundRobinConfig);
91+
ConfigOrError childConfigOrError =
92+
ServiceConfigUtil.selectLbPolicyFromList(endpointPickingConfigs, registry);
93+
if (childConfigOrError.getError() != null) {
94+
return childConfigOrError;
95+
}
96+
PolicySelection childPolicy = (PolicySelection) childConfigOrError.getConfig();
97+
98+
List<LbConfig> fallbackConfigs = ServiceConfigUtil.unwrapLoadBalancingConfigList(
99+
JsonUtil.getListOfObjects(rawLoadBalancingPolicyConfig, "fallbackPolicy"));
100+
if (fallbackConfigs == null) {
101+
fallbackConfigs = new ArrayList<>(1);
102+
} else {
103+
fallbackConfigs = new ArrayList<>(fallbackConfigs);
104+
}
105+
fallbackConfigs.add(roundRobinConfig);
106+
ConfigOrError fallbackConfigOrError =
107+
ServiceConfigUtil.selectLbPolicyFromList(fallbackConfigs, registry);
108+
if (fallbackConfigOrError.getError() != null) {
109+
return fallbackConfigOrError;
110+
}
111+
PolicySelection fallbackPolicy = (PolicySelection) fallbackConfigOrError.getConfig();
112+
83113
String edsServiceName = JsonUtil.getString(rawLoadBalancingPolicyConfig, "edsServiceName");
84114
String lrsServerName =
85115
JsonUtil.getString(rawLoadBalancingPolicyConfig, "lrsLoadReportingServerName");
@@ -92,51 +122,16 @@ static ConfigOrError parseLoadBalancingConfigPolicy(
92122
}
93123
}
94124

95-
@VisibleForTesting
96-
static LbConfig selectFallbackPolicy(
97-
Map<String, ?> rawLoadBalancingPolicyConfig, LoadBalancerRegistry lbRegistry) {
98-
List<LbConfig> fallbackConfigs = ServiceConfigUtil.unwrapLoadBalancingConfigList(
99-
JsonUtil.getListOfObjects(rawLoadBalancingPolicyConfig, "fallbackPolicy"));
100-
LbConfig fallbackPolicy = selectSupportedLbPolicy(fallbackConfigs, lbRegistry);
101-
return fallbackPolicy == null ? DEFAULT_FALLBACK_POLICY : fallbackPolicy;
102-
}
103-
104-
@Nullable
105-
@VisibleForTesting
106-
static LbConfig selectChildPolicy(
107-
Map<String, ?> rawLoadBalancingPolicyConfig, LoadBalancerRegistry lbRegistry) {
108-
List<LbConfig> childConfigs = ServiceConfigUtil.unwrapLoadBalancingConfigList(
109-
JsonUtil.getListOfObjects(rawLoadBalancingPolicyConfig, "childPolicy"));
110-
return selectSupportedLbPolicy(childConfigs, lbRegistry);
111-
}
112-
113-
@Nullable
114-
private static LbConfig selectSupportedLbPolicy(
115-
@Nullable List<LbConfig> lbConfigs, LoadBalancerRegistry lbRegistry) {
116-
if (lbConfigs == null) {
117-
return null;
118-
}
119-
for (LbConfig lbConfig : lbConfigs) {
120-
String lbPolicy = lbConfig.getPolicyName();
121-
if (lbRegistry.getProvider(lbPolicy) != null) {
122-
return lbConfig;
123-
}
124-
}
125-
return null;
126-
}
127-
128125
/**
129126
* Represents a successfully parsed and validated LoadBalancingConfig for XDS.
130127
*/
131128
static final class XdsConfig {
132129
// FIXME(chengyuanzhang): make cluster name required.
133130
@Nullable
134131
final String cluster;
135-
// TODO(carl-mastrangelo): make these Object's containing the fully parsed child configs.
136-
@Nullable
137-
final LbConfig childPolicy;
132+
final PolicySelection endpointPickingPolicy;
138133
@Nullable
139-
final LbConfig fallbackPolicy;
134+
final PolicySelection fallbackPolicy;
140135
// Optional. Name to use in EDS query. If not present, defaults to the server name from the
141136
// target URI.
142137
@Nullable
@@ -149,12 +144,12 @@ static final class XdsConfig {
149144

150145
XdsConfig(
151146
@Nullable String cluster,
152-
@Nullable LbConfig childPolicy,
153-
@Nullable LbConfig fallbackPolicy,
147+
PolicySelection endpointPickingPolicy,
148+
@Nullable PolicySelection fallbackPolicy,
154149
@Nullable String edsServiceName,
155150
@Nullable String lrsServerName) {
156151
this.cluster = cluster;
157-
this.childPolicy = childPolicy;
152+
this.endpointPickingPolicy = checkNotNull(endpointPickingPolicy, "endpointPickingPolicy");
158153
this.fallbackPolicy = fallbackPolicy;
159154
this.edsServiceName = edsServiceName;
160155
this.lrsServerName = lrsServerName;
@@ -164,7 +159,7 @@ static final class XdsConfig {
164159
public String toString() {
165160
return MoreObjects.toStringHelper(this)
166161
.add("cluster", cluster)
167-
.add("childPolicy", childPolicy)
162+
.add("endpointPickingPolicy", endpointPickingPolicy)
168163
.add("fallbackPolicy", fallbackPolicy)
169164
.add("edsServiceName", edsServiceName)
170165
.add("lrsServerName", lrsServerName)
@@ -178,15 +173,16 @@ public boolean equals(Object obj) {
178173
}
179174
XdsConfig that = (XdsConfig) obj;
180175
return Objects.equal(this.cluster, that.cluster)
181-
&& Objects.equal(this.childPolicy, that.childPolicy)
176+
&& Objects.equal(this.endpointPickingPolicy, that.endpointPickingPolicy)
182177
&& Objects.equal(this.fallbackPolicy, that.fallbackPolicy)
183178
&& Objects.equal(this.edsServiceName, that.edsServiceName)
184179
&& Objects.equal(this.lrsServerName, that.lrsServerName);
185180
}
186181

187182
@Override
188183
public int hashCode() {
189-
return Objects.hashCode(cluster, childPolicy, fallbackPolicy, edsServiceName, lrsServerName);
184+
return Objects.hashCode(
185+
cluster, endpointPickingPolicy, fallbackPolicy, edsServiceName, lrsServerName);
190186
}
191187
}
192188
}

0 commit comments

Comments
 (0)