diff --git a/api/src/main/java/io/grpc/LoadBalancer.java b/api/src/main/java/io/grpc/LoadBalancer.java index f48bf9bf16..36568a85f4 100644 --- a/api/src/main/java/io/grpc/LoadBalancer.java +++ b/api/src/main/java/io/grpc/LoadBalancer.java @@ -861,6 +861,25 @@ public abstract class LoadBalancer { public ChannelLogger getChannelLogger() { throw new UnsupportedOperationException(); } + + /** + * Returns the {@link NameResolver.Args} that the Channel uses to create {@link NameResolver}s. + * + * @since 1.22.0 + */ + public NameResolver.Args getNameResolverArgs() { + throw new UnsupportedOperationException(); + } + + /** + * Returns the {@link NameResolverRegistry} that the Channel uses to look for {@link + * NameResolver}s. + * + * @since 1.22.0 + */ + public NameResolverRegistry getNameResolverRegistry() { + throw new UnsupportedOperationException(); + } } /** diff --git a/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java index 60312e1c7d..14417b6b26 100644 --- a/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java @@ -84,9 +84,6 @@ public abstract class AbstractManagedChannelImplBuilder private static final ObjectPool DEFAULT_EXECUTOR_POOL = SharedResourcePool.forResource(GrpcUtil.SHARED_CHANNEL_EXECUTOR); - private static final NameResolver.Factory DEFAULT_NAME_RESOLVER_FACTORY = - NameResolverRegistry.getDefaultRegistry().asFactory(); - private static final DecompressorRegistry DEFAULT_DECOMPRESSOR_REGISTRY = DecompressorRegistry.getDefaultInstance(); @@ -99,9 +96,10 @@ public abstract class AbstractManagedChannelImplBuilder ObjectPool executorPool = DEFAULT_EXECUTOR_POOL; private final List interceptors = new ArrayList<>(); + final NameResolverRegistry nameResolverRegistry = NameResolverRegistry.getDefaultRegistry(); // Access via getter, which may perform authority override as needed - private NameResolver.Factory nameResolverFactory = DEFAULT_NAME_RESOLVER_FACTORY; + private NameResolver.Factory nameResolverFactory = nameResolverRegistry.asFactory(); final String target; @@ -238,7 +236,7 @@ public abstract class AbstractManagedChannelImplBuilder if (resolverFactory != null) { this.nameResolverFactory = resolverFactory; } else { - this.nameResolverFactory = DEFAULT_NAME_RESOLVER_FACTORY; + this.nameResolverFactory = nameResolverRegistry.asFactory(); } return thisT(); } diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index c372511cb2..d8a97a202a 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -63,6 +63,7 @@ import io.grpc.MethodDescriptor; import io.grpc.NameResolver; import io.grpc.NameResolver.ConfigOrError; import io.grpc.NameResolver.ResolutionResult; +import io.grpc.NameResolverRegistry; import io.grpc.ProxyDetector; import io.grpc.Status; import io.grpc.SynchronizationContext; @@ -128,6 +129,7 @@ final class ManagedChannelImpl extends ManagedChannel implements private final InternalLogId logId; private final String target; + private final NameResolverRegistry nameResolverRegistry; private final NameResolver.Factory nameResolverFactory; private final NameResolver.Args nameResolverArgs; private final AutoConfiguredLoadBalancerFactory loadBalancerFactory; @@ -559,6 +561,7 @@ final class ManagedChannelImpl extends ManagedChannel implements builder.proxyDetector != null ? builder.proxyDetector : GrpcUtil.getDefaultProxyDetector(); this.retryEnabled = builder.retryEnabled && !builder.temporarilyDisableRetry; this.loadBalancerFactory = new AutoConfiguredLoadBalancerFactory(builder.defaultLbPolicy); + this.nameResolverRegistry = builder.nameResolverRegistry; this.nameResolverArgs = NameResolver.Args.newBuilder() .setDefaultPort(builder.getDefaultPort()) .setProxyDetector(proxyDetector) @@ -1294,6 +1297,16 @@ final class ManagedChannelImpl extends ManagedChannel implements public ChannelLogger getChannelLogger() { return channelLogger; } + + @Override + public NameResolver.Args getNameResolverArgs() { + return nameResolverArgs; + } + + @Override + public NameResolverRegistry getNameResolverRegistry() { + return nameResolverRegistry; + } } private final class NameResolverListener extends NameResolver.Listener2 { diff --git a/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java b/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java index aeac77db00..e963a05ce9 100644 --- a/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java +++ b/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java @@ -27,6 +27,7 @@ import io.grpc.LoadBalancer.SubchannelPicker; import io.grpc.LoadBalancer; import io.grpc.ManagedChannel; import io.grpc.NameResolver; +import io.grpc.NameResolverRegistry; import io.grpc.SynchronizationContext; import java.util.List; import java.util.concurrent.ScheduledExecutorService; @@ -107,6 +108,16 @@ public abstract class ForwardingLoadBalancerHelper extends LoadBalancer.Helper { return delegate().getChannelLogger(); } + @Override + public NameResolver.Args getNameResolverArgs() { + return delegate().getNameResolverArgs(); + } + + @Override + public NameResolverRegistry getNameResolverRegistry() { + return delegate().getNameResolverRegistry(); + } + @Override public String toString() { return MoreObjects.toStringHelper(this).add("delegate", delegate()).toString(); diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java index b933d72632..67f9273fe9 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java @@ -93,6 +93,7 @@ import io.grpc.MethodDescriptor.MethodType; import io.grpc.NameResolver; import io.grpc.NameResolver.ConfigOrError; import io.grpc.NameResolver.ResolutionResult; +import io.grpc.NameResolverRegistry; import io.grpc.ProxiedSocketAddress; import io.grpc.ProxyDetector; import io.grpc.SecurityLevel; @@ -1602,6 +1603,26 @@ public class ManagedChannelImplTest { } } + @Test + public void lbHelper_getNameResolverArgs() { + createChannel(); + + NameResolver.Args args = helper.getNameResolverArgs(); + assertThat(args.getDefaultPort()).isEqualTo(DEFAULT_PORT); + assertThat(args.getProxyDetector()).isSameInstanceAs(GrpcUtil.DEFAULT_PROXY_DETECTOR); + assertThat(args.getSynchronizationContext()) + .isSameInstanceAs(helper.getSynchronizationContext()); + assertThat(args.getServiceConfigParser()).isNotNull(); + } + + @Test + public void lbHelper_getNameResolverRegistry() { + createChannel(); + + assertThat(helper.getNameResolverRegistry()) + .isSameInstanceAs(NameResolverRegistry.getDefaultRegistry()); + } + @Test public void refreshNameResolution_whenSubchannelConnectionFailed_notIdle() { subtestNameResolutionRefreshWhenConnectionFailed(false, false);