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() { public ChannelLogger getChannelLogger() {
throw new UnsupportedOperationException(); 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 = private static final ObjectPool<? extends Executor> DEFAULT_EXECUTOR_POOL =
SharedResourcePool.forResource(GrpcUtil.SHARED_CHANNEL_EXECUTOR); 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 = private static final DecompressorRegistry DEFAULT_DECOMPRESSOR_REGISTRY =
DecompressorRegistry.getDefaultInstance(); DecompressorRegistry.getDefaultInstance();
@ -99,9 +96,10 @@ public abstract class AbstractManagedChannelImplBuilder
ObjectPool<? extends Executor> executorPool = DEFAULT_EXECUTOR_POOL; ObjectPool<? extends Executor> executorPool = DEFAULT_EXECUTOR_POOL;
private final List<ClientInterceptor> interceptors = new ArrayList<>(); private final List<ClientInterceptor> interceptors = new ArrayList<>();
final NameResolverRegistry nameResolverRegistry = NameResolverRegistry.getDefaultRegistry();
// Access via getter, which may perform authority override as needed // 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; final String target;
@ -238,7 +236,7 @@ public abstract class AbstractManagedChannelImplBuilder
if (resolverFactory != null) { if (resolverFactory != null) {
this.nameResolverFactory = resolverFactory; this.nameResolverFactory = resolverFactory;
} else { } else {
this.nameResolverFactory = DEFAULT_NAME_RESOLVER_FACTORY; this.nameResolverFactory = nameResolverRegistry.asFactory();
} }
return thisT(); return thisT();
} }

View File

@ -63,6 +63,7 @@ import io.grpc.MethodDescriptor;
import io.grpc.NameResolver; import io.grpc.NameResolver;
import io.grpc.NameResolver.ConfigOrError; import io.grpc.NameResolver.ConfigOrError;
import io.grpc.NameResolver.ResolutionResult; import io.grpc.NameResolver.ResolutionResult;
import io.grpc.NameResolverRegistry;
import io.grpc.ProxyDetector; import io.grpc.ProxyDetector;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.SynchronizationContext; import io.grpc.SynchronizationContext;
@ -128,6 +129,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
private final InternalLogId logId; private final InternalLogId logId;
private final String target; private final String target;
private final NameResolverRegistry nameResolverRegistry;
private final NameResolver.Factory nameResolverFactory; private final NameResolver.Factory nameResolverFactory;
private final NameResolver.Args nameResolverArgs; private final NameResolver.Args nameResolverArgs;
private final AutoConfiguredLoadBalancerFactory loadBalancerFactory; private final AutoConfiguredLoadBalancerFactory loadBalancerFactory;
@ -559,6 +561,7 @@ final class ManagedChannelImpl extends ManagedChannel implements
builder.proxyDetector != null ? builder.proxyDetector : GrpcUtil.getDefaultProxyDetector(); builder.proxyDetector != null ? builder.proxyDetector : GrpcUtil.getDefaultProxyDetector();
this.retryEnabled = builder.retryEnabled && !builder.temporarilyDisableRetry; this.retryEnabled = builder.retryEnabled && !builder.temporarilyDisableRetry;
this.loadBalancerFactory = new AutoConfiguredLoadBalancerFactory(builder.defaultLbPolicy); this.loadBalancerFactory = new AutoConfiguredLoadBalancerFactory(builder.defaultLbPolicy);
this.nameResolverRegistry = builder.nameResolverRegistry;
this.nameResolverArgs = NameResolver.Args.newBuilder() this.nameResolverArgs = NameResolver.Args.newBuilder()
.setDefaultPort(builder.getDefaultPort()) .setDefaultPort(builder.getDefaultPort())
.setProxyDetector(proxyDetector) .setProxyDetector(proxyDetector)
@ -1294,6 +1297,16 @@ final class ManagedChannelImpl extends ManagedChannel implements
public ChannelLogger getChannelLogger() { public ChannelLogger getChannelLogger() {
return channelLogger; return channelLogger;
} }
@Override
public NameResolver.Args getNameResolverArgs() {
return nameResolverArgs;
}
@Override
public NameResolverRegistry getNameResolverRegistry() {
return nameResolverRegistry;
}
} }
private final class NameResolverListener extends NameResolver.Listener2 { 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.LoadBalancer;
import io.grpc.ManagedChannel; import io.grpc.ManagedChannel;
import io.grpc.NameResolver; import io.grpc.NameResolver;
import io.grpc.NameResolverRegistry;
import io.grpc.SynchronizationContext; import io.grpc.SynchronizationContext;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
@ -107,6 +108,16 @@ public abstract class ForwardingLoadBalancerHelper extends LoadBalancer.Helper {
return delegate().getChannelLogger(); return delegate().getChannelLogger();
} }
@Override
public NameResolver.Args getNameResolverArgs() {
return delegate().getNameResolverArgs();
}
@Override
public NameResolverRegistry getNameResolverRegistry() {
return delegate().getNameResolverRegistry();
}
@Override @Override
public String toString() { public String toString() {
return MoreObjects.toStringHelper(this).add("delegate", delegate()).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;
import io.grpc.NameResolver.ConfigOrError; import io.grpc.NameResolver.ConfigOrError;
import io.grpc.NameResolver.ResolutionResult; import io.grpc.NameResolver.ResolutionResult;
import io.grpc.NameResolverRegistry;
import io.grpc.ProxiedSocketAddress; import io.grpc.ProxiedSocketAddress;
import io.grpc.ProxyDetector; import io.grpc.ProxyDetector;
import io.grpc.SecurityLevel; 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 @Test
public void refreshNameResolution_whenSubchannelConnectionFailed_notIdle() { public void refreshNameResolution_whenSubchannelConnectionFailed_notIdle() {
subtestNameResolutionRefreshWhenConnectionFailed(false, false); subtestNameResolutionRefreshWhenConnectionFailed(false, false);