From 077601f59b61442eb39891000c4c075090f5113e Mon Sep 17 00:00:00 2001 From: Jihun Cho Date: Wed, 17 Jun 2020 12:36:14 -0700 Subject: [PATCH] api,core: add LoadBalancer.Helper#createResolvingOobChannelBuilder api (#7136) --- api/src/main/java/io/grpc/LoadBalancer.java | 20 ++++++++++++-- .../io/grpc/internal/ManagedChannelImpl.java | 26 ++++++++++++------- .../util/ForwardingLoadBalancerHelper.java | 6 +++++ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/api/src/main/java/io/grpc/LoadBalancer.java b/api/src/main/java/io/grpc/LoadBalancer.java index e97571c8c63a..d2ed1ad93682 100644 --- a/api/src/main/java/io/grpc/LoadBalancer.java +++ b/api/src/main/java/io/grpc/LoadBalancer.java @@ -1044,8 +1044,7 @@ public void updateOobChannelAddresses(ManagedChannel channel, EquivalentAddressG * {@link ManagedChannelBuilder#forTarget} for the format of a target string. * *

The target string will be resolved by a {@link NameResolver} created according to the - * target string. The out-of-band channel doesn't have load-balancing. If multiple addresses - * are resolved for the target, the first working address will be used. + * target string. * *

The LoadBalancer is responsible for closing unused OOB channels, and closing all OOB * channels within {@link #shutdown}. @@ -1053,6 +1052,23 @@ public void updateOobChannelAddresses(ManagedChannel channel, EquivalentAddressG * @since 1.20.0 */ public ManagedChannel createResolvingOobChannel(String target) { + return createResolvingOobChannelBuilder(target).build(); + } + + /** + * Creates an out-of-band channel builder for LoadBalancer's own RPC needs, e.g., talking to an + * external load-balancer service, that is specified by a target string. See the documentation + * on {@link ManagedChannelBuilder#forTarget} for the format of a target string. + * + *

The target string will be resolved by a {@link NameResolver} created according to the + * target string. + * + *

The LoadBalancer is responsible for closing unused OOB channels, and closing all OOB + * channels within {@link #shutdown}. + * + * @since 1.31.0 + */ + public ManagedChannelBuilder createResolvingOobChannelBuilder(String target) { throw new UnsupportedOperationException("Not implemented"); } diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index 05dee80c6ea7..c23bd51e844f 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -60,6 +60,7 @@ import io.grpc.LoadBalancer.SubchannelPicker; import io.grpc.LoadBalancer.SubchannelStateListener; import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; import io.grpc.Metadata; import io.grpc.MethodDescriptor; import io.grpc.NameResolver; @@ -1260,7 +1261,7 @@ public void run() { } @Override - public ManagedChannel createResolvingOobChannel(String target) { + public ManagedChannelBuilder createResolvingOobChannelBuilder(String target) { final class ResolvingOobChannelBuilder extends AbstractManagedChannelImplBuilder { int defaultPort = -1; @@ -1278,6 +1279,19 @@ public int getDefaultPort() { protected ClientTransportFactory buildTransportFactory() { throw new UnsupportedOperationException(); } + + @Override + public ManagedChannel build() { + // TODO(creamsoup) prevent main channel to shutdown if oob channel is not terminated + return new ManagedChannelImpl( + this, + transportFactory, + backoffPolicyProvider, + balancerRpcExecutorPool, + stopwatchSupplier, + Collections.emptyList(), + timeProvider); + } } checkState(!terminated, "Channel is terminated"); @@ -1291,15 +1305,7 @@ protected ClientTransportFactory buildTransportFactory() { builder.proxyDetector = nameResolverArgs.getProxyDetector(); builder.defaultPort = nameResolverArgs.getDefaultPort(); builder.userAgent = userAgent; - return - new ManagedChannelImpl( - builder, - transportFactory, - backoffPolicyProvider, - balancerRpcExecutorPool, - stopwatchSupplier, - Collections.emptyList(), - timeProvider); + return builder; } @Override diff --git a/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java b/core/src/main/java/io/grpc/util/ForwardingLoadBalancerHelper.java index 95bf66c01917..85c5c7b125c3 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.ManagedChannelBuilder; import io.grpc.NameResolver; import io.grpc.NameResolverRegistry; import io.grpc.SynchronizationContext; @@ -68,6 +69,11 @@ public void updateOobChannelAddresses(ManagedChannel channel, EquivalentAddressG delegate().updateOobChannelAddresses(channel, eag); } + @Override + public ManagedChannelBuilder createResolvingOobChannelBuilder(String target) { + return delegate().createResolvingOobChannelBuilder(target); + } + @Override public ManagedChannel createResolvingOobChannel(String target) { return delegate().createResolvingOobChannel(target);