api: add getters for NameResolver.Args and NameResolverRegistry in LoadBalancer.Helper (#5685)

Hierarchical LoadBalancers such as xDS will need this to create NameResolvers to resolve locality target names.
This commit is contained in:
Kun Zhang 2019-05-09 15:55:18 -07:00 committed by GitHub
parent 3aa3218fb2
commit 175a423c10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 67 additions and 5 deletions

View File

@ -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();
}
}
/**

View File

@ -84,9 +84,6 @@ public abstract class AbstractManagedChannelImplBuilder
private static final ObjectPool<? extends Executor> 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<? extends Executor> executorPool = DEFAULT_EXECUTOR_POOL;
private final List<ClientInterceptor> 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();
}

View File

@ -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 {

View File

@ -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();

View File

@ -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);