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