diff --git a/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java b/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java index 6d2f232cf380..bb720d804992 100644 --- a/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java +++ b/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java @@ -152,7 +152,6 @@ private final class ClusterResolverLbState extends LoadBalancer { private final Helper helper; private final List clusters = new ArrayList<>(); private final Map clusterStates = new HashMap<>(); - private final Map localityWeights = new HashMap<>(); private PolicySelection endpointLbPolicy; private ResolvedAddresses resolvedAddresses; private LoadBalancer childLb; @@ -206,6 +205,8 @@ private void handleEndpointResourceUpdate() { List addresses = new ArrayList<>(); Map priorityChildConfigs = new HashMap<>(); List priorities = new ArrayList<>(); // totally ordered priority list + Map localityWeights = new HashMap<>(); + Status endpointNotFound = Status.OK; for (String cluster : clusters) { ClusterState state = clusterStates.get(cluster); @@ -217,6 +218,7 @@ private void handleEndpointResourceUpdate() { addresses.addAll(state.result.addresses); priorityChildConfigs.putAll(state.result.priorityChildConfigs); priorities.addAll(state.result.priorities); + localityWeights.putAll(state.result.localityWeights); } else { endpointNotFound = state.status; } @@ -248,7 +250,8 @@ private void handleEndpointResourceUpdate() { .setLoadBalancingPolicyConfig(childConfig) .setAddresses(Collections.unmodifiableList(addresses)) .setAttributes(resolvedAddresses.getAttributes().toBuilder() - .set(InternalXdsAttributes.ATTR_LOCALITY_WEIGHTS, localityWeights).build()) + .set(InternalXdsAttributes.ATTR_LOCALITY_WEIGHTS, + Collections.unmodifiableMap(localityWeights)).build()) .build()); } @@ -318,6 +321,7 @@ private abstract class ClusterState { // Most recently resolved addresses and config, or null if resource not exists. @Nullable protected ClusterResolutionResult result; + protected boolean shutdown; private ClusterState(String name, @Nullable ServerInfo lrsServerInfo, @@ -377,6 +381,7 @@ public void run() { } Map localityLbEndpoints = update.localityLbEndpointsMap; + Map localityWeights = new HashMap<>(); List dropOverloads = update.dropPolicies; List addresses = new ArrayList<>(); Map> prioritizedLocalityWeights = new HashMap<>(); @@ -429,7 +434,8 @@ public void run() { endpointLbPolicy, lbRegistry, prioritizedLocalityWeights, dropOverloads); status = Status.OK; resolved = true; - result = new ClusterResolutionResult(addresses, priorityChildConfigs, priorities); + result = new ClusterResolutionResult(addresses, priorityChildConfigs, priorities, + localityWeights); handleEndpointResourceUpdate(); } } @@ -635,18 +641,24 @@ private static class ClusterResolutionResult { private final Map priorityChildConfigs; // List of priority names ordered in descending priorities. private final List priorities; + // Most recent view on how localities in the cluster should be wighted. Only set for EDS + // clusters that support the concept. + @Nullable + private final Map localityWeights; ClusterResolutionResult(List addresses, String priority, PriorityChildConfig config) { this(addresses, Collections.singletonMap(priority, config), - Collections.singletonList(priority)); + Collections.singletonList(priority), new HashMap<>()); } ClusterResolutionResult(List addresses, - Map configs, List priorities) { + Map configs, List priorities, + Map localityWeights) { this.addresses = addresses; this.priorityChildConfigs = configs; this.priorities = priorities; + this.localityWeights = localityWeights; } }