diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index b2d79b17ae3a..94473a9bf5ad 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -1399,14 +1399,12 @@ public void run() { Attributes effectiveAttrs = resolutionResult.getAttributes(); // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match. if (NameResolverListener.this.helper == ManagedChannelImpl.this.lbHelper) { - if (effectiveServiceConfig != validServiceConfig) { - Map healthCheckingConfig = - effectiveServiceConfig.getHealthCheckingConfig(); - if (healthCheckingConfig != null) { - effectiveAttrs = effectiveAttrs.toBuilder() - .set(LoadBalancer.ATTR_HEALTH_CHECKING_CONFIG, healthCheckingConfig) - .build(); - } + Map healthCheckingConfig = + effectiveServiceConfig.getHealthCheckingConfig(); + if (healthCheckingConfig != null) { + effectiveAttrs = effectiveAttrs.toBuilder() + .set(LoadBalancer.ATTR_HEALTH_CHECKING_CONFIG, healthCheckingConfig) + .build(); } Status handleResult = helper.lb.tryHandleResolvedAddresses( diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java index 100c5fea9266..89e5be89a4e1 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java @@ -3918,6 +3918,36 @@ public void notUseDefaultImmediatelyIfEnableLookUp() throws Exception { .build()); } + @Test + public void healthCheckingConfigPropagated() throws Exception { + LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider); + try { + FakeNameResolverFactory nameResolverFactory = + new FakeNameResolverFactory.Builder(expectedUri) + .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) + .build(); + channelBuilder.nameResolverFactory(nameResolverFactory); + + Map rawServiceConfig = + parseConfig("{\"healthCheckConfig\": {\"serviceName\": \"service1\"}}"); + ManagedChannelServiceConfig managedChannelServiceConfig = + createManagedChannelServiceConfig(rawServiceConfig, null); + nameResolverFactory.nextConfigOrError.set( + ConfigOrError.fromConfig(managedChannelServiceConfig)); + + createChannel(); + + ArgumentCaptor resultCaptor = + ArgumentCaptor.forClass(ResolvedAddresses.class); + verify(mockLoadBalancer).handleResolvedAddresses(resultCaptor.capture()); + assertThat(resultCaptor.getValue().getAttributes() + .get(LoadBalancer.ATTR_HEALTH_CHECKING_CONFIG)) + .containsExactly("serviceName", "service1"); + } finally { + LoadBalancerRegistry.getDefaultRegistry().deregister(mockLoadBalancerProvider); + } + } + private static final class ChannelBuilder extends AbstractManagedChannelImplBuilder {