Skip to content

Commit 6cddc61

Browse files
committed
in-progress changes.
1 parent 459208c commit 6cddc61

File tree

5 files changed

+97
-100
lines changed

5 files changed

+97
-100
lines changed

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

Lines changed: 64 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@
1919
import static com.google.common.base.Preconditions.checkNotNull;
2020
import static io.grpc.ConnectivityState.TRANSIENT_FAILURE;
2121
import static io.grpc.xds.XdsLbPolicies.CLUSTER_RESOLVER_POLICY_NAME;
22+
import static io.grpc.xds.XdsLbPolicies.PRIORITY_POLICY_NAME;
23+
import static java.util.Objects.requireNonNull;
2224

2325
import com.google.common.annotations.VisibleForTesting;
2426
import com.google.common.collect.ImmutableList;
2527
import com.google.errorprone.annotations.CheckReturnValue;
2628
import io.grpc.InternalLogId;
2729
import io.grpc.LoadBalancer;
30+
import io.grpc.LoadBalancerProvider;
2831
import io.grpc.LoadBalancerRegistry;
2932
import io.grpc.NameResolver;
3033
import io.grpc.Status;
3134
import io.grpc.StatusOr;
35+
import io.grpc.xds.PriorityLoadBalancerProvider;
36+
import io.grpc.xds.PriorityLoadBalancerProvider.PriorityLbConfig.PriorityChildConfig;
3237
import io.grpc.util.GracefulSwitchLoadBalancer;
3338
import io.grpc.xds.CdsLoadBalancerProvider.CdsConfig;
3439
import io.grpc.xds.ClusterResolverLoadBalancerProvider.ClusterResolverConfig;
@@ -44,7 +49,10 @@
4449
import java.util.ArrayList;
4550
import java.util.Arrays;
4651
import java.util.Collections;
52+
import java.util.HashMap;
4753
import java.util.List;
54+
import java.util.Map;
55+
import java.util.Objects;
4856

4957
/**
5058
* Load balancer for cds_experimental LB policy. One instance per top-level cluster.
@@ -91,7 +99,7 @@ public Status acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
9199
if (clusterSubscription == null) {
92100
// Should be impossible, because XdsDependencyManager wouldn't have generated this
93101
return fail(Status.INTERNAL.withDescription(
94-
errorPrefix() + "Unable to find non-dynamic root cluster"));
102+
errorPrefix() + "Unable to find non-dynamic cluster"));
95103
}
96104
// The dynamic cluster must not have loaded yet
97105
return Status.OK;
@@ -100,64 +108,9 @@ public Status acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
100108
return fail(clusterConfigOr.getStatus());
101109
}
102110
XdsClusterConfig clusterConfig = clusterConfigOr.getValue();
103-
List<String> leafNames;
104-
if (clusterConfig.getChildren() instanceof AggregateConfig) {
105-
leafNames = ((AggregateConfig) clusterConfig.getChildren()).getLeafNames();
106-
} else if (clusterConfig.getChildren() instanceof EndpointConfig) {
107-
leafNames = ImmutableList.of(clusterName);
108-
} else {
109-
return fail(Status.INTERNAL.withDescription(
110-
errorPrefix() + "Unexpected cluster children type: "
111-
+ clusterConfig.getChildren().getClass()));
112-
}
113-
if (leafNames.isEmpty()) {
114-
// Should be impossible, because XdsClusterResource validated this
115-
return fail(Status.UNAVAILABLE.withDescription(
116-
errorPrefix() + "Zero leaf clusters for root cluster " + clusterName));
117-
}
118-
119-
Status noneFoundError = Status.INTERNAL
120-
.withDescription(errorPrefix() + "No leaves and no error; this is a bug");
121-
List<DiscoveryMechanism> instances = new ArrayList<>();
122-
for (String leafName : leafNames) {
123-
StatusOr<XdsClusterConfig> leafConfigOr = xdsConfig.getClusters().get(leafName);
124-
if (!leafConfigOr.hasValue()) {
125-
noneFoundError = leafConfigOr.getStatus();
126-
continue;
127-
}
128-
if (!(leafConfigOr.getValue().getChildren() instanceof EndpointConfig)) {
129-
noneFoundError = Status.INTERNAL.withDescription(
130-
errorPrefix() + "Unexpected child " + leafName + " cluster children type: "
131-
+ leafConfigOr.getValue().getChildren().getClass());
132-
continue;
133-
}
134-
CdsUpdate result = leafConfigOr.getValue().getClusterResource();
135-
DiscoveryMechanism instance;
136-
if (result.clusterType() == ClusterType.EDS) {
137-
instance = DiscoveryMechanism.forEds(
138-
leafName,
139-
result.edsServiceName(),
140-
result.lrsServerInfo(),
141-
result.maxConcurrentRequests(),
142-
result.upstreamTlsContext(),
143-
result.filterMetadata(),
144-
result.outlierDetection());
145-
} else {
146-
instance = DiscoveryMechanism.forLogicalDns(
147-
leafName,
148-
result.dnsHostName(),
149-
result.lrsServerInfo(),
150-
result.maxConcurrentRequests(),
151-
result.upstreamTlsContext(),
152-
result.filterMetadata());
153-
}
154-
instances.add(instance);
155-
}
156-
if (instances.isEmpty()) {
157-
return fail(noneFoundError);
158-
}
159111

160112
NameResolver.ConfigOrError configOrError;
113+
Object childConfig;
161114
if (clusterConfig.getChildren() instanceof EndpointConfig) {
162115
// The LB policy config is provided in service_config.proto/JSON format.
163116
configOrError =
@@ -168,19 +121,64 @@ public Status acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
168121
return fail(Status.INTERNAL.withDescription(
169122
errorPrefix() + "Unable to parse the LB config: " + configOrError.getError()));
170123
}
124+
CdsUpdate result = clusterConfig.getClusterResource();
125+
DiscoveryMechanism instance;
126+
if (result.clusterType() == ClusterType.EDS) {
127+
instance = DiscoveryMechanism.forEds(
128+
clusterName,
129+
result.edsServiceName(),
130+
result.lrsServerInfo(),
131+
result.maxConcurrentRequests(),
132+
result.upstreamTlsContext(),
133+
result.filterMetadata(),
134+
result.outlierDetection());
135+
} else {
136+
instance = DiscoveryMechanism.forLogicalDns(
137+
clusterName,
138+
result.dnsHostName(),
139+
result.lrsServerInfo(),
140+
result.maxConcurrentRequests(),
141+
result.upstreamTlsContext(),
142+
result.filterMetadata());
143+
}
144+
childConfig = new ClusterResolverConfig(
145+
instance,
146+
configOrError.getConfig(),
147+
clusterConfig.getClusterResource().isHttp11ProxyAvailable());
148+
if (childLb == null) {
149+
childLb = lbRegistry.getProvider(CLUSTER_RESOLVER_POLICY_NAME).newLoadBalancer(helper);
150+
}
151+
} else if (clusterConfig.getChildren() instanceof AggregateConfig) {
152+
LoadBalancerProvider priorityLbProvider = lbRegistry.getProvider(PRIORITY_POLICY_NAME);
153+
if (childLb == null) {
154+
childLb = priorityLbProvider.newLoadBalancer(helper);
155+
}
156+
Map<String, PriorityChildConfig> priorityChildConfigs = new HashMap<>();
157+
for (String childCluster: requireNonNull(clusterConfig.getClusterResource().prioritizedClusterNames())) {
158+
priorityChildConfigs.put(childCluster, new PriorityChildConfig(
159+
GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
160+
priorityLbProvider, getCdsPolicyConfig(childCluster)), false));
161+
}
162+
childConfig = new PriorityLoadBalancerProvider.PriorityLbConfig(
163+
Collections.unmodifiableMap(priorityChildConfigs),
164+
Collections.unmodifiableList(
165+
requireNonNull(clusterConfig.getClusterResource().prioritizedClusterNames())));
171166
} else {
172-
167+
return fail(Status.INTERNAL.withDescription(
168+
errorPrefix() + "Unexpected cluster children type: "
169+
+ clusterConfig.getChildren().getClass()));
173170
}
174171

175-
ClusterResolverConfig config = new ClusterResolverConfig(
176-
Collections.unmodifiableList(instances),
177-
configOrError.getConfig(),
178-
clusterConfig.getClusterResource().isHttp11ProxyAvailable());
179-
if (childLb == null) {
180-
childLb = lbRegistry.getProvider(CLUSTER_RESOLVER_POLICY_NAME).newLoadBalancer(helper);
181-
}
182172
return childLb.acceptResolvedAddresses(
183-
resolvedAddresses.toBuilder().setLoadBalancingPolicyConfig(config).build());
173+
resolvedAddresses.toBuilder().setLoadBalancingPolicyConfig(childConfig).build());
174+
}
175+
176+
private String getCdsPolicyConfig(String cluster) {
177+
return String.format("{\n" +
178+
" \"cds_experimental\": {\n" +
179+
" \"cluster\": \"%s\"\n" +
180+
" }\n" +
181+
" }\n", cluster);
184182
}
185183

186184
@Override

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

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -185,21 +185,20 @@ public Status acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
185185
ClusterResolverConfig config =
186186
(ClusterResolverConfig) resolvedAddresses.getLoadBalancingPolicyConfig();
187187
endpointLbConfig = config.lbConfig;
188-
for (DiscoveryMechanism instance : config.discoveryMechanisms) {
189-
clusters.add(instance.cluster);
190-
ClusterState state;
191-
if (instance.type == DiscoveryMechanism.Type.EDS) {
192-
state = new EdsClusterState(instance.cluster, instance.edsServiceName,
193-
instance.lrsServerInfo, instance.maxConcurrentRequests, instance.tlsContext,
194-
instance.filterMetadata, instance.outlierDetection);
195-
} else { // logical DNS
196-
state = new LogicalDnsClusterState(instance.cluster, instance.dnsHostName,
197-
instance.lrsServerInfo, instance.maxConcurrentRequests, instance.tlsContext,
198-
instance.filterMetadata);
199-
}
200-
clusterStates.put(instance.cluster, state);
201-
state.start();
202-
}
188+
DiscoveryMechanism instance = config.discoveryMechanism;
189+
clusters.add(instance.cluster);
190+
ClusterState state;
191+
if (instance.type == DiscoveryMechanism.Type.EDS) {
192+
state = new EdsClusterState(instance.cluster, instance.edsServiceName,
193+
instance.lrsServerInfo, instance.maxConcurrentRequests, instance.tlsContext,
194+
instance.filterMetadata, instance.outlierDetection);
195+
} else { // logical DNS
196+
state = new LogicalDnsClusterState(instance.cluster, instance.dnsHostName,
197+
instance.lrsServerInfo, instance.maxConcurrentRequests, instance.tlsContext,
198+
instance.filterMetadata);
199+
}
200+
clusterStates.put(instance.cluster, state);
201+
state.start();
203202
return Status.OK;
204203
}
205204

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ public LoadBalancer newLoadBalancer(Helper helper) {
7070
}
7171

7272
static final class ClusterResolverConfig {
73-
// Ordered list of clusters to be resolved.
74-
final List<DiscoveryMechanism> discoveryMechanisms;
73+
// Clusters to be resolved.
74+
final DiscoveryMechanism discoveryMechanism;
7575
// GracefulSwitch configuration
7676
final Object lbConfig;
7777
private final boolean isHttp11ProxyAvailable;
7878

79-
ClusterResolverConfig(List<DiscoveryMechanism> discoveryMechanisms, Object lbConfig,
80-
boolean isHttp11ProxyAvailable) {
81-
this.discoveryMechanisms = checkNotNull(discoveryMechanisms, "discoveryMechanisms");
79+
ClusterResolverConfig(DiscoveryMechanism discoveryMechanism, Object lbConfig,
80+
boolean isHttp11ProxyAvailable) {
81+
this.discoveryMechanism = checkNotNull(discoveryMechanism, "discoveryMechanism");
8282
this.lbConfig = checkNotNull(lbConfig, "lbConfig");
8383
this.isHttp11ProxyAvailable = isHttp11ProxyAvailable;
8484
}
@@ -89,7 +89,7 @@ boolean isHttp11ProxyAvailable() {
8989

9090
@Override
9191
public int hashCode() {
92-
return Objects.hash(discoveryMechanisms, lbConfig);
92+
return Objects.hash(discoveryMechanism, lbConfig);
9393
}
9494

9595
@Override
@@ -101,14 +101,14 @@ public boolean equals(Object o) {
101101
return false;
102102
}
103103
ClusterResolverConfig that = (ClusterResolverConfig) o;
104-
return discoveryMechanisms.equals(that.discoveryMechanisms)
104+
return discoveryMechanism.equals(that.discoveryMechanism)
105105
&& lbConfig.equals(that.lbConfig);
106106
}
107107

108108
@Override
109109
public String toString() {
110110
return MoreObjects.toStringHelper(this)
111-
.add("discoveryMechanisms", discoveryMechanisms)
111+
.add("discoveryMechanism", discoveryMechanism)
112112
.add("lbConfig", lbConfig)
113113
.toString();
114114
}

xds/src/test/java/io/grpc/xds/CdsLoadBalancer2Test.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ public void discoverTopLevelEdsCluster() {
246246
FakeLoadBalancer childBalancer = Iterables.getOnlyElement(childBalancers);
247247
assertThat(childBalancer.name).isEqualTo(CLUSTER_RESOLVER_POLICY_NAME);
248248
ClusterResolverConfig childLbConfig = (ClusterResolverConfig) childBalancer.config;
249-
assertThat(childLbConfig.discoveryMechanisms).isEqualTo(
249+
assertThat(childLbConfig.discoveryMechanism).isEqualTo(
250250
Arrays.asList(
251251
DiscoveryMechanism.forEds(
252252
CLUSTER, EDS_SERVICE_NAME, lrsServerInfo, 100L, upstreamTlsContext,
@@ -296,7 +296,7 @@ public void discoverTopLevelLogicalDnsCluster() {
296296
FakeLoadBalancer childBalancer = Iterables.getOnlyElement(childBalancers);
297297
assertThat(childBalancer.name).isEqualTo(CLUSTER_RESOLVER_POLICY_NAME);
298298
ClusterResolverConfig childLbConfig = (ClusterResolverConfig) childBalancer.config;
299-
assertThat(childLbConfig.discoveryMechanisms).isEqualTo(
299+
assertThat(childLbConfig.discoveryMechanism).isEqualTo(
300300
Arrays.asList(
301301
DiscoveryMechanism.forLogicalDns(
302302
CLUSTER, "dns.example.com:1111", lrsServerInfo, 100L, upstreamTlsContext,
@@ -332,7 +332,7 @@ public void nonAggregateCluster_resourceUpdate() {
332332
assertThat(childBalancers).hasSize(1);
333333
FakeLoadBalancer childBalancer = Iterables.getOnlyElement(childBalancers);
334334
ClusterResolverConfig childLbConfig = (ClusterResolverConfig) childBalancer.config;
335-
assertThat(childLbConfig.discoveryMechanisms).isEqualTo(
335+
assertThat(childLbConfig.discoveryMechanism).isEqualTo(
336336
Arrays.asList(
337337
DiscoveryMechanism.forEds(
338338
CLUSTER, EDS_SERVICE_NAME, null, 100L, null, Collections.emptyMap(), null)));
@@ -348,7 +348,7 @@ public void nonAggregateCluster_resourceUpdate() {
348348
assertThat(childBalancers).hasSize(1);
349349
childBalancer = Iterables.getOnlyElement(childBalancers);
350350
childLbConfig = (ClusterResolverConfig) childBalancer.config;
351-
assertThat(childLbConfig.discoveryMechanisms).isEqualTo(
351+
assertThat(childLbConfig.discoveryMechanism).isEqualTo(
352352
Arrays.asList(
353353
DiscoveryMechanism.forEds(
354354
CLUSTER, EDS_SERVICE_NAME, null, 200L, null, Collections.emptyMap(), null)));
@@ -363,7 +363,7 @@ public void nonAggregateCluster_resourceRevoked() {
363363
assertThat(childBalancers).hasSize(1);
364364
FakeLoadBalancer childBalancer = Iterables.getOnlyElement(childBalancers);
365365
ClusterResolverConfig childLbConfig = (ClusterResolverConfig) childBalancer.config;
366-
assertThat(childLbConfig.discoveryMechanisms).isEqualTo(
366+
assertThat(childLbConfig.discoveryMechanism).isEqualTo(
367367
Arrays.asList(
368368
DiscoveryMechanism.forEds(
369369
CLUSTER, EDS_SERVICE_NAME, null, null, null, Collections.emptyMap(), null)));
@@ -395,7 +395,7 @@ public void dynamicCluster() {
395395
assertThat(childBalancers).hasSize(1);
396396
FakeLoadBalancer childBalancer = Iterables.getOnlyElement(childBalancers);
397397
ClusterResolverConfig childLbConfig = (ClusterResolverConfig) childBalancer.config;
398-
assertThat(childLbConfig.discoveryMechanisms).isEqualTo(
398+
assertThat(childLbConfig.discoveryMechanism).isEqualTo(
399399
Arrays.asList(
400400
DiscoveryMechanism.forEds(
401401
clusterName, EDS_SERVICE_NAME, null, null, null, Collections.emptyMap(), null)));
@@ -462,7 +462,7 @@ public void discoverAggregateCluster() {
462462
assertThat(childBalancer.name).isEqualTo(CLUSTER_RESOLVER_POLICY_NAME);
463463
ClusterResolverConfig childLbConfig = (ClusterResolverConfig) childBalancer.config;
464464
// Clusters are resolved recursively, later duplicates removed: [cluster3, cluster4, cluster2]
465-
assertThat(childLbConfig.discoveryMechanisms).isEqualTo(
465+
assertThat(childLbConfig.discoveryMechanism).isEqualTo(
466466
Arrays.asList(
467467
DiscoveryMechanism.forEds(
468468
cluster3, EDS_SERVICE_NAME, null, 100L, null, Collections.emptyMap(), null),

xds/src/test/java/io/grpc/xds/ClusterResolverLoadBalancerTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public void tearDown() {
244244
@Test
245245
public void edsClustersWithRingHashEndpointLbPolicy() {
246246
ClusterResolverConfig config = new ClusterResolverConfig(
247-
Collections.singletonList(edsDiscoveryMechanism1), ringHash, false);
247+
edsDiscoveryMechanism1, ringHash, false);
248248
deliverLbConfig(config);
249249
assertThat(xdsClient.watchers.keySet()).containsExactly(EDS_SERVICE_NAME1);
250250
assertThat(childBalancers).isEmpty();
@@ -310,7 +310,7 @@ public void edsClustersWithRingHashEndpointLbPolicy() {
310310
@Test
311311
public void edsClustersWithLeastRequestEndpointLbPolicy() {
312312
ClusterResolverConfig config = new ClusterResolverConfig(
313-
Collections.singletonList(edsDiscoveryMechanism1), leastRequest, false);
313+
edsDiscoveryMechanism1, leastRequest, false);
314314
deliverLbConfig(config);
315315
assertThat(xdsClient.watchers.keySet()).containsExactly(EDS_SERVICE_NAME1);
316316
assertThat(childBalancers).isEmpty();
@@ -357,7 +357,7 @@ public void edsClustersWithLeastRequestEndpointLbPolicy() {
357357
@Test
358358
public void edsClustersEndpointHostname_addedToAddressAttribute() {
359359
ClusterResolverConfig config = new ClusterResolverConfig(
360-
Collections.singletonList(edsDiscoveryMechanismWithOutlierDetection), leastRequest, false);
360+
edsDiscoveryMechanismWithOutlierDetection, leastRequest, false);
361361
deliverLbConfig(config);
362362
assertThat(xdsClient.watchers.keySet()).containsExactly(EDS_SERVICE_NAME1);
363363
assertThat(childBalancers).isEmpty();
@@ -431,7 +431,7 @@ public void endpointAddressRewritten_whenProxyMetadataIsInEndpointMetadata() {
431431
@Test
432432
public void endpointAddressRewritten_whenProxyMetadataIsInLocalityMetadata() {
433433
ClusterResolverConfig config = new ClusterResolverConfig(
434-
Collections.singletonList(edsDiscoveryMechanismWithOutlierDetection), leastRequest, true);
434+
edsDiscoveryMechanismWithOutlierDetection, leastRequest, true);
435435
deliverLbConfig(config);
436436
assertThat(xdsClient.watchers.keySet()).containsExactly(EDS_SERVICE_NAME1);
437437
assertThat(childBalancers).isEmpty();

0 commit comments

Comments
 (0)