Skip to content

Commit 0454b9e

Browse files
committed
xds: Avoid switchTo in PriorityLb
1 parent dfb22ba commit 0454b9e

File tree

6 files changed

+79
-76
lines changed

6 files changed

+79
-76
lines changed

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import io.grpc.internal.BackoffPolicy;
3838
import io.grpc.internal.ExponentialBackoffPolicy;
3939
import io.grpc.internal.ObjectPool;
40-
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
4140
import io.grpc.util.ForwardingLoadBalancerHelper;
4241
import io.grpc.util.GracefulSwitchLoadBalancer;
4342
import io.grpc.util.OutlierDetectionLoadBalancer.OutlierDetectionLoadBalancerConfig;
@@ -726,8 +725,8 @@ private static PriorityChildConfig generateDnsBasedPriorityChildConfig(
726725
dropOverloads, endpointLbConfig, tlsContext, filterMetadata);
727726
LoadBalancerProvider clusterImplLbProvider =
728727
lbRegistry.getProvider(XdsLbPolicies.CLUSTER_IMPL_POLICY_NAME);
729-
PolicySelection clusterImplPolicy =
730-
new PolicySelection(clusterImplLbProvider, clusterImplConfig);
728+
Object clusterImplPolicy = GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
729+
clusterImplLbProvider, clusterImplConfig);
731730
return new PriorityChildConfig(clusterImplPolicy, false /* ignoreReresolution*/);
732731
}
733732

@@ -751,15 +750,16 @@ private static Map<String, PriorityChildConfig> generateEdsBasedPriorityChildCon
751750
dropOverloads, endpointLbConfig, tlsContext, filterMetadata);
752751
LoadBalancerProvider clusterImplLbProvider =
753752
lbRegistry.getProvider(XdsLbPolicies.CLUSTER_IMPL_POLICY_NAME);
754-
PolicySelection priorityChildPolicy =
755-
new PolicySelection(clusterImplLbProvider, clusterImplConfig);
753+
Object priorityChildPolicy = GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
754+
clusterImplLbProvider, clusterImplConfig);
756755

757756
// If outlier detection has been configured we wrap the child policy in the outlier detection
758757
// load balancer.
759758
if (outlierDetection != null) {
760759
LoadBalancerProvider outlierDetectionProvider = lbRegistry.getProvider(
761760
"outlier_detection_experimental");
762-
priorityChildPolicy = new PolicySelection(outlierDetectionProvider,
761+
priorityChildPolicy = GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
762+
outlierDetectionProvider,
763763
buildOutlierDetectionLbConfig(outlierDetection, priorityChildPolicy));
764764
}
765765

@@ -776,12 +776,11 @@ private static Map<String, PriorityChildConfig> generateEdsBasedPriorityChildCon
776776
* understands.
777777
*/
778778
private static OutlierDetectionLoadBalancerConfig buildOutlierDetectionLbConfig(
779-
OutlierDetection outlierDetection, PolicySelection childPolicy) {
779+
OutlierDetection outlierDetection, Object childConfig) {
780780
OutlierDetectionLoadBalancerConfig.Builder configBuilder
781781
= new OutlierDetectionLoadBalancerConfig.Builder();
782782

783-
configBuilder.setChildConfig(GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(
784-
childPolicy.getProvider(), childPolicy.getConfig()));
783+
configBuilder.setChildConfig(childConfig);
785784

786785
if (outlierDetection.intervalNanos() != null) {
787786
configBuilder.setIntervalNanos(outlierDetection.intervalNanos());

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

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,9 @@
2525
import io.grpc.ConnectivityState;
2626
import io.grpc.InternalLogId;
2727
import io.grpc.LoadBalancer;
28-
import io.grpc.LoadBalancerProvider;
2928
import io.grpc.Status;
3029
import io.grpc.SynchronizationContext;
3130
import io.grpc.SynchronizationContext.ScheduledHandle;
32-
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
3331
import io.grpc.util.ForwardingLoadBalancerHelper;
3432
import io.grpc.util.GracefulSwitchLoadBalancer;
3533
import io.grpc.xds.PriorityLoadBalancerProvider.PriorityLbConfig;
@@ -208,7 +206,6 @@ private final class ChildLbState {
208206
// Timer to delay shutdown and deletion of the priority. Scheduled whenever the child is
209207
// deactivated.
210208
@Nullable ScheduledHandle deletionTimer;
211-
@Nullable String policy;
212209
ConnectivityState connectivityState = CONNECTING;
213210
SubchannelPicker picker = new FixedResultPicker(PickResult.withNoResult());
214211

@@ -285,17 +282,10 @@ void tearDown() {
285282
void updateResolvedAddresses() {
286283
PriorityLbConfig config =
287284
(PriorityLbConfig) resolvedAddresses.getLoadBalancingPolicyConfig();
288-
PolicySelection childPolicySelection = config.childConfigs.get(priority).policySelection;
289-
LoadBalancerProvider lbProvider = childPolicySelection.getProvider();
290-
String newPolicy = lbProvider.getPolicyName();
291-
if (!newPolicy.equals(policy)) {
292-
policy = newPolicy;
293-
lb.switchTo(lbProvider);
294-
}
295285
lb.handleResolvedAddresses(
296286
resolvedAddresses.toBuilder()
297287
.setAddresses(AddressFilter.filter(resolvedAddresses.getAddresses(), priority))
298-
.setLoadBalancingPolicyConfig(childPolicySelection.getConfig())
288+
.setLoadBalancingPolicyConfig(config.childConfigs.get(priority).childConfig)
299289
.build());
300290
}
301291

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import io.grpc.LoadBalancerProvider;
2727
import io.grpc.NameResolver.ConfigOrError;
2828
import io.grpc.Status;
29-
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
3029
import java.util.Collections;
3130
import java.util.HashSet;
3231
import java.util.List;
@@ -90,18 +89,18 @@ public String toString() {
9089
}
9190

9291
static final class PriorityChildConfig {
93-
final PolicySelection policySelection;
92+
final Object childConfig;
9493
final boolean ignoreReresolution;
9594

96-
PriorityChildConfig(PolicySelection policySelection, boolean ignoreReresolution) {
97-
this.policySelection = checkNotNull(policySelection, "policySelection");
95+
PriorityChildConfig(Object childConfig, boolean ignoreReresolution) {
96+
this.childConfig = checkNotNull(childConfig, "childConfig");
9897
this.ignoreReresolution = ignoreReresolution;
9998
}
10099

101100
@Override
102101
public String toString() {
103102
return MoreObjects.toStringHelper(this)
104-
.add("policySelection", policySelection)
103+
.add("childConfig", childConfig)
105104
.add("ignoreReresolution", ignoreReresolution)
106105
.toString();
107106
}

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

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,11 @@ public void edsClustersWithRingHashEndpointLbPolicy() {
286286
PriorityChildConfig priorityChildConfig =
287287
Iterables.getOnlyElement(priorityLbConfig.childConfigs.values());
288288
assertThat(priorityChildConfig.ignoreReresolution).isTrue();
289-
assertThat(priorityChildConfig.policySelection.getProvider().getPolicyName())
289+
assertThat(GracefulSwitchLoadBalancerAccessor.getChildProvider(priorityChildConfig.childConfig)
290+
.getPolicyName())
290291
.isEqualTo(CLUSTER_IMPL_POLICY_NAME);
291-
ClusterImplConfig clusterImplConfig =
292-
(ClusterImplConfig) priorityChildConfig.policySelection.getConfig();
292+
ClusterImplConfig clusterImplConfig = (ClusterImplConfig)
293+
GracefulSwitchLoadBalancerAccessor.getChildConfig(priorityChildConfig.childConfig);
293294
assertClusterImplConfig(clusterImplConfig, CLUSTER1, EDS_SERVICE_NAME1, LRS_SERVER_INFO, 100L,
294295
tlsContext, Collections.<DropOverload>emptyList(), "ring_hash_experimental");
295296
RingHashConfig ringHashConfig = (RingHashConfig)
@@ -326,10 +327,11 @@ public void edsClustersWithLeastRequestEndpointLbPolicy() {
326327
assertThat(priorityLbConfig.priorities).containsExactly(CLUSTER1 + "[child1]");
327328
PriorityChildConfig priorityChildConfig =
328329
Iterables.getOnlyElement(priorityLbConfig.childConfigs.values());
329-
assertThat(priorityChildConfig.policySelection.getProvider().getPolicyName())
330+
assertThat(GracefulSwitchLoadBalancerAccessor.getChildProvider(priorityChildConfig.childConfig)
331+
.getPolicyName())
330332
.isEqualTo(CLUSTER_IMPL_POLICY_NAME);
331-
ClusterImplConfig clusterImplConfig =
332-
(ClusterImplConfig) priorityChildConfig.policySelection.getConfig();
333+
ClusterImplConfig clusterImplConfig = (ClusterImplConfig)
334+
GracefulSwitchLoadBalancerAccessor.getChildConfig(priorityChildConfig.childConfig);
333335
assertClusterImplConfig(clusterImplConfig, CLUSTER1, EDS_SERVICE_NAME1, LRS_SERVER_INFO, 100L,
334336
tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME);
335337
WrrLocalityConfig wrrLocalityConfig = (WrrLocalityConfig)
@@ -373,10 +375,11 @@ public void edsClustersWithOutlierDetection() {
373375
Iterables.getOnlyElement(priorityLbConfig.childConfigs.values());
374376

375377
// The child config for priority should be outlier detection.
376-
assertThat(priorityChildConfig.policySelection.getProvider().getPolicyName())
378+
assertThat(GracefulSwitchLoadBalancerAccessor.getChildProvider(priorityChildConfig.childConfig)
379+
.getPolicyName())
377380
.isEqualTo("outlier_detection_experimental");
378-
OutlierDetectionLoadBalancerConfig outlierDetectionConfig =
379-
(OutlierDetectionLoadBalancerConfig) priorityChildConfig.policySelection.getConfig();
381+
OutlierDetectionLoadBalancerConfig outlierDetectionConfig = (OutlierDetectionLoadBalancerConfig)
382+
GracefulSwitchLoadBalancerAccessor.getChildConfig(priorityChildConfig.childConfig);
380383

381384
// The outlier detection config should faithfully represent what came down from xDS.
382385
assertThat(outlierDetectionConfig.intervalNanos).isEqualTo(outlierDetection.intervalNanos());
@@ -480,10 +483,11 @@ public void onlyEdsClusters_receivedEndpoints() {
480483

481484
PriorityChildConfig priorityChildConfig1 = priorityLbConfig.childConfigs.get(priority1);
482485
assertThat(priorityChildConfig1.ignoreReresolution).isTrue();
483-
assertThat(priorityChildConfig1.policySelection.getProvider().getPolicyName())
486+
assertThat(GracefulSwitchLoadBalancerAccessor.getChildProvider(priorityChildConfig1.childConfig)
487+
.getPolicyName())
484488
.isEqualTo(CLUSTER_IMPL_POLICY_NAME);
485-
ClusterImplConfig clusterImplConfig1 =
486-
(ClusterImplConfig) priorityChildConfig1.policySelection.getConfig();
489+
ClusterImplConfig clusterImplConfig1 = (ClusterImplConfig)
490+
GracefulSwitchLoadBalancerAccessor.getChildConfig(priorityChildConfig1.childConfig);
487491
assertClusterImplConfig(clusterImplConfig1, CLUSTER2, EDS_SERVICE_NAME2, LRS_SERVER_INFO, 200L,
488492
tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME);
489493
WrrLocalityConfig wrrLocalityConfig1 = (WrrLocalityConfig)
@@ -494,10 +498,11 @@ public void onlyEdsClusters_receivedEndpoints() {
494498

495499
PriorityChildConfig priorityChildConfig2 = priorityLbConfig.childConfigs.get(priority2);
496500
assertThat(priorityChildConfig2.ignoreReresolution).isTrue();
497-
assertThat(priorityChildConfig2.policySelection.getProvider().getPolicyName())
501+
assertThat(GracefulSwitchLoadBalancerAccessor.getChildProvider(priorityChildConfig2.childConfig)
502+
.getPolicyName())
498503
.isEqualTo(CLUSTER_IMPL_POLICY_NAME);
499-
ClusterImplConfig clusterImplConfig2 =
500-
(ClusterImplConfig) priorityChildConfig2.policySelection.getConfig();
504+
ClusterImplConfig clusterImplConfig2 = (ClusterImplConfig)
505+
GracefulSwitchLoadBalancerAccessor.getChildConfig(priorityChildConfig2.childConfig);
501506
assertClusterImplConfig(clusterImplConfig2, CLUSTER2, EDS_SERVICE_NAME2, LRS_SERVER_INFO, 200L,
502507
tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME);
503508
WrrLocalityConfig wrrLocalityConfig2 = (WrrLocalityConfig)
@@ -508,10 +513,11 @@ public void onlyEdsClusters_receivedEndpoints() {
508513

509514
PriorityChildConfig priorityChildConfig3 = priorityLbConfig.childConfigs.get(priority3);
510515
assertThat(priorityChildConfig3.ignoreReresolution).isTrue();
511-
assertThat(priorityChildConfig3.policySelection.getProvider().getPolicyName())
516+
assertThat(GracefulSwitchLoadBalancerAccessor.getChildProvider(priorityChildConfig3.childConfig)
517+
.getPolicyName())
512518
.isEqualTo(CLUSTER_IMPL_POLICY_NAME);
513-
ClusterImplConfig clusterImplConfig3 =
514-
(ClusterImplConfig) priorityChildConfig3.policySelection.getConfig();
519+
ClusterImplConfig clusterImplConfig3 = (ClusterImplConfig)
520+
GracefulSwitchLoadBalancerAccessor.getChildConfig(priorityChildConfig3.childConfig);
515521
assertClusterImplConfig(clusterImplConfig3, CLUSTER1, EDS_SERVICE_NAME1, LRS_SERVER_INFO, 100L,
516522
tlsContext, Collections.<DropOverload>emptyList(), WRR_LOCALITY_POLICY_NAME);
517523
WrrLocalityConfig wrrLocalityConfig3 = (WrrLocalityConfig)
@@ -779,10 +785,11 @@ public void onlyLogicalDnsCluster_endpointsResolved() {
779785
String priority = Iterables.getOnlyElement(priorityLbConfig.priorities);
780786
PriorityChildConfig priorityChildConfig = priorityLbConfig.childConfigs.get(priority);
781787
assertThat(priorityChildConfig.ignoreReresolution).isFalse();
782-
assertThat(priorityChildConfig.policySelection.getProvider().getPolicyName())
788+
assertThat(GracefulSwitchLoadBalancerAccessor.getChildProvider(priorityChildConfig.childConfig)
789+
.getPolicyName())
783790
.isEqualTo(CLUSTER_IMPL_POLICY_NAME);
784-
ClusterImplConfig clusterImplConfig =
785-
(ClusterImplConfig) priorityChildConfig.policySelection.getConfig();
791+
ClusterImplConfig clusterImplConfig = (ClusterImplConfig)
792+
GracefulSwitchLoadBalancerAccessor.getChildConfig(priorityChildConfig.childConfig);
786793
assertClusterImplConfig(clusterImplConfig, CLUSTER_DNS, null, LRS_SERVER_INFO, 300L, null,
787794
Collections.<DropOverload>emptyList(), "pick_first");
788795
assertAddressesEqual(Arrays.asList(endpoint1, endpoint2), childBalancer.addresses);

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import com.google.common.collect.ImmutableList;
2222
import com.google.common.collect.ImmutableMap;
2323
import io.grpc.LoadBalancerProvider;
24-
import io.grpc.internal.ServiceConfigUtil.PolicySelection;
24+
import io.grpc.util.GracefulSwitchLoadBalancer;
2525
import io.grpc.xds.PriorityLoadBalancerProvider.PriorityLbConfig;
2626
import io.grpc.xds.PriorityLoadBalancerProvider.PriorityLbConfig.PriorityChildConfig;
2727
import java.util.List;
@@ -45,7 +45,7 @@ public void priorityLbConfig_emptyPriorities() {
4545
ImmutableMap.of(
4646
"p0",
4747
new PriorityChildConfig(
48-
new PolicySelection(mock(LoadBalancerProvider.class), null), true));
48+
newChildConfig(mock(LoadBalancerProvider.class), null), true));
4949
List<String> priorities = ImmutableList.of();
5050

5151
thrown.expect(IllegalArgumentException.class);
@@ -59,10 +59,14 @@ public void priorityLbConfig_missingChildConfig() {
5959
ImmutableMap.of(
6060
"p1",
6161
new PriorityChildConfig(
62-
new PolicySelection(mock(LoadBalancerProvider.class), null), true));
62+
newChildConfig(mock(LoadBalancerProvider.class), null), true));
6363
List<String> priorities = ImmutableList.of("p0", "p1");
6464

6565
thrown.expect(IllegalArgumentException.class);
6666
new PriorityLbConfig(childConfigs, priorities);
6767
}
68+
69+
private Object newChildConfig(LoadBalancerProvider provider, Object config) {
70+
return GracefulSwitchLoadBalancer.createLoadBalancingPolicyConfig(provider, config);
71+
}
6872
}

0 commit comments

Comments
 (0)