From 132e8bc8dd1876ab67fb2ede8d98d6e4aa225059 Mon Sep 17 00:00:00 2001 From: edr Date: Thu, 12 Sep 2019 05:35:18 +0200 Subject: [PATCH] core: Add Attributes.Key for authority in EquivalentAddressGroup (#6126) This enables NameResolvers to dynamically provide authority for each Subchannel Fixes #4469 --- .../java/io/grpc/EquivalentAddressGroup.java | 7 +++++++ .../io/grpc/internal/InternalSubchannel.java | 7 +++++-- .../io/grpc/internal/InternalSubchannelTest.java | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/io/grpc/EquivalentAddressGroup.java b/api/src/main/java/io/grpc/EquivalentAddressGroup.java index 3c48c938bb2..2fa1099e249 100644 --- a/api/src/main/java/io/grpc/EquivalentAddressGroup.java +++ b/api/src/main/java/io/grpc/EquivalentAddressGroup.java @@ -35,6 +35,13 @@ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1770") public final class EquivalentAddressGroup { + /** + * The authority to be used when constructing Subchannels for this EquivalentAddressGroup. + */ + @Attr + @ExperimentalApi("https://github.com/grpc/grpc-java/issues/6138") + public static final Attributes.Key ATTR_AUTHORITY_OVERRIDE = + Attributes.Key.create("io.grpc.EquivalentAddressGroup.authorityOverride"); private final List addrs; private final Attributes attrs; diff --git a/core/src/main/java/io/grpc/internal/InternalSubchannel.java b/core/src/main/java/io/grpc/internal/InternalSubchannel.java index d9474528666..d84c7710384 100644 --- a/core/src/main/java/io/grpc/internal/InternalSubchannel.java +++ b/core/src/main/java/io/grpc/internal/InternalSubchannel.java @@ -231,10 +231,13 @@ private void startNewTransport() { address = proxiedAddr.getTargetAddress(); } + Attributes currentEagAttributes = addressIndex.getCurrentEagAttributes(); + String eagChannelAuthority = currentEagAttributes + .get(EquivalentAddressGroup.ATTR_AUTHORITY_OVERRIDE); ClientTransportFactory.ClientTransportOptions options = new ClientTransportFactory.ClientTransportOptions() - .setAuthority(authority) - .setEagAttributes(addressIndex.getCurrentEagAttributes()) + .setAuthority(eagChannelAuthority != null ? eagChannelAuthority : authority) + .setEagAttributes(currentEagAttributes) .setUserAgent(userAgent) .setHttpConnectProxiedSocketAddress(proxiedAddr); TransportLogger transportLogger = new TransportLogger(); diff --git a/core/src/test/java/io/grpc/internal/InternalSubchannelTest.java b/core/src/test/java/io/grpc/internal/InternalSubchannelTest.java index 4d942954b9b..985be0f68a9 100644 --- a/core/src/test/java/io/grpc/internal/InternalSubchannelTest.java +++ b/core/src/test/java/io/grpc/internal/InternalSubchannelTest.java @@ -176,6 +176,22 @@ public void constructor_eagListWithNull_throws() { isA(TransportLogger.class)); } + @Test public void eagAuthorityOverride_propagatesToTransport() { + SocketAddress addr = new SocketAddress() {}; + String overriddenAuthority = "authority-override"; + Attributes attr = Attributes.newBuilder() + .set(EquivalentAddressGroup.ATTR_AUTHORITY_OVERRIDE, overriddenAuthority).build(); + createInternalSubchannel(new EquivalentAddressGroup(Arrays.asList(addr), attr)); + + // First attempt + assertNull(internalSubchannel.obtainActiveTransport()); + assertEquals(CONNECTING, internalSubchannel.getState()); + verify(mockTransportFactory).newClientTransport( + eq(addr), + eq(createClientTransportOptions().setAuthority(overriddenAuthority).setEagAttributes(attr)), + isA(TransportLogger.class)); + } + @Test public void singleAddressReconnect() { SocketAddress addr = mock(SocketAddress.class); createInternalSubchannel(addr);