From 4a2c5d6e9c0f90de961bc60f2549582e5da1e803 Mon Sep 17 00:00:00 2001 From: Kun Zhang Date: Thu, 5 Mar 2020 09:27:55 -0800 Subject: [PATCH] core: fix a bug in health check config propgation. (#6804) The condition "effectiveServiceConfig != validServiceConfig" should have been deleted in commit 2162ad043677e3cbaac969b96fd4faa05448874b. The condition was there before that commit because NAME_RESOLVER_SERVICE_CONFIG was already in "attrs", thus it needed to be re-added only if "effectiveServiceConfig" differs from the original "validServiceConfig". In contrast, ATTR_HEALTH_CHECKING_CONFIG is not in the original "attrs" and always needs to be added. --- .../io/grpc/internal/ManagedChannelImpl.java | 14 ++++----- .../grpc/internal/ManagedChannelImplTest.java | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index b2d79b17ae3..94473a9bf5a 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 100c5fea926..89e5be89a4e 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 {