core: add flags for selectively enabling grpclb

This commit is contained in:
Carl Mastrangelo 2018-07-27 15:24:43 -07:00 committed by GitHub
parent 75b48b4dfe
commit 9b200eb7be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 19 deletions

View File

@ -82,10 +82,19 @@ final class DnsNameResolver extends NameResolver {
private static final String GRPCLB_NAME_PREFIX = "_grpclb._tcp.";
private static final String JNDI_PROPERTY =
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi", "false");
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi", "true");
private static final String JNDI_SRV_PROPERTY =
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_grpclb", "false");
private static final String JNDI_TXT_PROPERTY =
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_service_config", "false");
@VisibleForTesting
static boolean enableJndi = Boolean.parseBoolean(JNDI_PROPERTY);
@VisibleForTesting
static boolean enableSrv = Boolean.parseBoolean(JNDI_SRV_PROPERTY);
@VisibleForTesting
static boolean enableTxt = Boolean.parseBoolean(JNDI_TXT_PROPERTY);
private static final ResourceResolverFactory resourceResolverFactory =
getResourceResolverFactory(DnsNameResolver.class.getClassLoader());
@ -195,7 +204,8 @@ final class DnsNameResolver extends NameResolver {
if (enableJndi) {
resourceResolver = getResourceResolver();
}
resolutionResults = resolveAll(addressResolver, resourceResolver, host);
resolutionResults =
resolveAll(addressResolver, resourceResolver, enableSrv, enableTxt, host);
} catch (Exception e) {
savedListener.onError(
Status.UNAVAILABLE.withDescription("Unable to resolve host " + host).withCause(e));
@ -267,7 +277,11 @@ final class DnsNameResolver extends NameResolver {
@VisibleForTesting
static ResolutionResults resolveAll(
AddressResolver addressResolver, @Nullable ResourceResolver resourceResolver, String name) {
AddressResolver addressResolver,
@Nullable ResourceResolver resourceResolver,
boolean requestSrvRecords,
boolean requestTxtRecords,
String name) {
List<? extends InetAddress> addresses = Collections.emptyList();
Exception addressesException = null;
List<EquivalentAddressGroup> balancerAddresses = Collections.emptyList();
@ -281,17 +295,26 @@ final class DnsNameResolver extends NameResolver {
addressesException = e;
}
if (resourceResolver != null) {
try {
balancerAddresses = resourceResolver.resolveSrv(addressResolver, GRPCLB_NAME_PREFIX + name);
} catch (Exception e) {
balancerAddressesException = e;
}
// Only do the TXT record lookup if one of the above address resolutions succeeded.
if (!(balancerAddressesException != null && addressesException != null)) {
if (requestSrvRecords) {
try {
txtRecords = resourceResolver.resolveTxt(SERVICE_CONFIG_NAME_PREFIX + name);
balancerAddresses =
resourceResolver.resolveSrv(addressResolver, GRPCLB_NAME_PREFIX + name);
} catch (Exception e) {
txtRecordsException = e;
balancerAddressesException = e;
}
}
if (requestTxtRecords) {
boolean balancerLookupFailedOrNotAttempted =
!requestSrvRecords || balancerAddressesException != null;
boolean dontResolveTxt =
(addressesException != null) && balancerLookupFailedOrNotAttempted;
// Only do the TXT record lookup if one of the above address resolutions succeeded.
if (!dontResolveTxt) {
try {
txtRecords = resourceResolver.resolveTxt(SERVICE_CONFIG_NAME_PREFIX + name);
} catch (Exception e) {
txtRecordsException = e;
}
}
}
}

View File

@ -192,8 +192,11 @@ public class DnsNameResolverTest {
when(mockResolver.resolveAddress(Matchers.anyString()))
.thenReturn(Collections.<InetAddress>singletonList(backendAddr));
ResourceResolver resourceResolver = null;
boolean resovleSrv = true;
boolean resolveTxt = true;
ResolutionResults res = DnsNameResolver.resolveAll(mockResolver, resourceResolver, hostname);
ResolutionResults res = DnsNameResolver.resolveAll(
mockResolver, resourceResolver, resovleSrv, resolveTxt, hostname);
assertThat(res.addresses).containsExactly(backendAddr);
assertThat(res.balancerAddresses).isEmpty();
assertThat(res.txtRecords).isEmpty();
@ -214,9 +217,11 @@ public class DnsNameResolverTest {
.thenReturn(Collections.singletonList("service config"));
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
.thenReturn(Collections.singletonList(balancerAddr));
boolean resovleSrv = true;
boolean resolveTxt = true;
ResolutionResults res =
DnsNameResolver.resolveAll(mockAddressResolver, mockResourceResolver, hostname);
ResolutionResults res = DnsNameResolver.resolveAll(
mockAddressResolver, mockResourceResolver, resovleSrv, resolveTxt, hostname);
assertThat(res.addresses).containsExactly(backendAddr);
assertThat(res.balancerAddresses).containsExactly(balancerAddr);
assertThat(res.txtRecords).containsExactly("service config");
@ -238,9 +243,11 @@ public class DnsNameResolverTest {
.thenReturn(Collections.<String>emptyList());
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
.thenReturn(Collections.singletonList(balancerAddr));
boolean resovleSrv = true;
boolean resolveTxt = true;
ResolutionResults res =
DnsNameResolver.resolveAll(mockAddressResolver, mockResourceResolver, hostname);
ResolutionResults res = DnsNameResolver.resolveAll(
mockAddressResolver, mockResourceResolver, resovleSrv, resolveTxt, hostname);
assertThat(res.addresses).isEmpty();
assertThat(res.balancerAddresses).containsExactly(balancerAddr);
assertThat(res.txtRecords).isEmpty();
@ -261,9 +268,11 @@ public class DnsNameResolverTest {
.thenReturn(Collections.singletonList("service config"));
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
.thenThrow(new Exception("something like javax.naming.NamingException"));
boolean resovleSrv = true;
boolean resolveTxt = true;
ResolutionResults res =
DnsNameResolver.resolveAll(mockAddressResolver, mockResourceResolver, hostname);
ResolutionResults res = DnsNameResolver.resolveAll(
mockAddressResolver, mockResourceResolver, resovleSrv, resolveTxt, hostname);
assertThat(res.addresses).containsExactly(backendAddr);
assertThat(res.balancerAddresses).isEmpty();
assertThat(res.txtRecords).containsExactly("service config");