Skip to content

Commit

Permalink
core: Add Attributes.Key for authority in EquivalentAddressGroup (#6126)
Browse files Browse the repository at this point in the history
This enables NameResolvers to dynamically provide authority for each
Subchannel

Fixes #4469
  • Loading branch information
enguerrand authored and ejona86 committed Sep 12, 2019
1 parent b092a29 commit 132e8bc
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 2 deletions.
7 changes: 7 additions & 0 deletions api/src/main/java/io/grpc/EquivalentAddressGroup.java
Expand Up @@ -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<String> ATTR_AUTHORITY_OVERRIDE =
Attributes.Key.create("io.grpc.EquivalentAddressGroup.authorityOverride");
private final List<SocketAddress> addrs;
private final Attributes attrs;

Expand Down
7 changes: 5 additions & 2 deletions core/src/main/java/io/grpc/internal/InternalSubchannel.java
Expand Up @@ -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();
Expand Down
16 changes: 16 additions & 0 deletions core/src/test/java/io/grpc/internal/InternalSubchannelTest.java
Expand Up @@ -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);
Expand Down

0 comments on commit 132e8bc

Please sign in to comment.