From c2d3017f0209bc958c05a64b0a4a321203b34ce9 Mon Sep 17 00:00:00 2001 From: edr Date: Tue, 10 Sep 2019 14:18:39 +0200 Subject: [PATCH 1/3] core: Add Attributes.Key for authority in EquivalentAddressGroup (#4469) This enables NameResolvers to dynamically provide authority for each Subchannel --- .../java/io/grpc/EquivalentAddressGroup.java | 6 ++++++ .../io/grpc/internal/InternalSubchannel.java | 7 +++++-- .../io/grpc/internal/InternalSubchannelTest.java | 16 ++++++++++++++++ 3 files changed, 27 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..75e6fe6f824 100644 --- a/api/src/main/java/io/grpc/EquivalentAddressGroup.java +++ b/api/src/main/java/io/grpc/EquivalentAddressGroup.java @@ -35,6 +35,12 @@ @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 + public static final Attributes.Key ATTR_AUTHORITY_OVERRIDE = + Attributes.Key.create("io.grpc.grpclb.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); From ffd524003ee467cc1d7cfed44c9c30811fda411d Mon Sep 17 00:00:00 2001 From: edr Date: Tue, 10 Sep 2019 14:50:30 +0200 Subject: [PATCH 2/3] core: Add @ExperimentalApi reference to EquivalentAddressGroup.ATTR_AUTHORITY_OVERRIDE --- api/src/main/java/io/grpc/EquivalentAddressGroup.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/io/grpc/EquivalentAddressGroup.java b/api/src/main/java/io/grpc/EquivalentAddressGroup.java index 75e6fe6f824..9e6573993f7 100644 --- a/api/src/main/java/io/grpc/EquivalentAddressGroup.java +++ b/api/src/main/java/io/grpc/EquivalentAddressGroup.java @@ -39,6 +39,7 @@ 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.grpclb.authorityOverride"); private final List addrs; From a4bcea1ff03a82095591ffdea7540063aa8943a0 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Wed, 11 Sep 2019 15:43:19 -0700 Subject: [PATCH 3/3] s/grpclb/EquivalentAddressGroup/ --- api/src/main/java/io/grpc/EquivalentAddressGroup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/io/grpc/EquivalentAddressGroup.java b/api/src/main/java/io/grpc/EquivalentAddressGroup.java index 9e6573993f7..2fa1099e249 100644 --- a/api/src/main/java/io/grpc/EquivalentAddressGroup.java +++ b/api/src/main/java/io/grpc/EquivalentAddressGroup.java @@ -41,7 +41,7 @@ public final class EquivalentAddressGroup { @Attr @ExperimentalApi("https://github.com/grpc/grpc-java/issues/6138") public static final Attributes.Key ATTR_AUTHORITY_OVERRIDE = - Attributes.Key.create("io.grpc.grpclb.authorityOverride"); + Attributes.Key.create("io.grpc.EquivalentAddressGroup.authorityOverride"); private final List addrs; private final Attributes attrs;