From ac92961668d41a4842fbe2459ac924ff7689ba25 Mon Sep 17 00:00:00 2001 From: Carl Mastrangelo Date: Fri, 8 Dec 2017 16:56:10 -0800 Subject: [PATCH 1/5] query for DNS records --- core/src/main/java/io/grpc/Grpc.java | 8 ++ .../io/grpc/internal/DnsNameResolver.java | 113 +++++++++++++++--- .../io/grpc/internal/ManagedChannelImpl.java | 45 +++---- .../io/grpc/internal/DnsNameResolverTest.java | 25 +++- 4 files changed, 150 insertions(+), 41 deletions(-) diff --git a/core/src/main/java/io/grpc/Grpc.java b/core/src/main/java/io/grpc/Grpc.java index 8d3d4cc5282..79d1a6001f0 100644 --- a/core/src/main/java/io/grpc/Grpc.java +++ b/core/src/main/java/io/grpc/Grpc.java @@ -17,6 +17,7 @@ package io.grpc; import java.net.SocketAddress; +import java.util.List; import javax.net.ssl.SSLSession; /** @@ -40,4 +41,11 @@ private Grpc() { @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1710") public static final Attributes.Key TRANSPORT_ATTR_SSL_SESSION = Attributes.Key.of("ssl-session"); + + /** + * Attribute key TXT DNS records. + */ + @ExperimentalApi("https://github.com/grpc/grpc-java/issues/9999") + public static final Attributes.Key> NAME_RESOLVER_ATTR_TXT = + Attributes.Key.of("dns-txt"); } diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolver.java b/core/src/main/java/io/grpc/internal/DnsNameResolver.java index a0faf90300e..9e8c7334855 100644 --- a/core/src/main/java/io/grpc/internal/DnsNameResolver.java +++ b/core/src/main/java/io/grpc/internal/DnsNameResolver.java @@ -20,14 +20,18 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import com.google.common.base.Verify; import io.grpc.Attributes; import io.grpc.EquivalentAddressGroup; +import io.grpc.Grpc; import io.grpc.NameResolver; import io.grpc.Status; import io.grpc.internal.SharedResourceHolder.Resource; import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.net.URI; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -38,6 +42,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import javax.naming.NamingEnumeration; @@ -49,7 +54,7 @@ * A DNS-based {@link NameResolver}. * *

Each {@code A} or {@code AAAA} record emits an {@link EquivalentAddressGroup} in the list - * passed to {@link NameResolver.Listener#onUpdate} + * passed to {@link NameResolver.Listener#onAddresses(List, Attributes)} * * @see DnsNameResolverProvider */ @@ -59,8 +64,13 @@ final class DnsNameResolver extends NameResolver { private static final boolean JNDI_AVAILABLE = jndiAvailable(); + // From https://github.com/grpc/proposal/blob/master/A2-service-configs-in-dns.md + private static final String SERVICE_CONFIG_NAME_PREFIX = "_grpc_config."; + // From https://github.com/grpc/proposal/blob/master/A5-grpclb-in-dns.md + private static final String GRPCLB_NAME_PREFIX = "_grpclb._tcp."; + @VisibleForTesting - static boolean enableJndi = false; + static boolean enableJndi = true; private DelegateResolver delegateResolver = pickDelegateResolver(); @@ -157,6 +167,7 @@ public void run() { } ResolutionResults resolvedInetAddrs; try { + logger.log(Level.SEVERE, "RESOVLING"); resolvedInetAddrs = delegateResolver.resolve(host); } catch (Exception e) { synchronized (DnsNameResolver.this) { @@ -174,11 +185,18 @@ public void run() { return; } // Each address forms an EAG - ArrayList servers = new ArrayList(); + List servers = new ArrayList(); for (InetAddress inetAddr : resolvedInetAddrs.addresses) { servers.add(new EquivalentAddressGroup(new InetSocketAddress(inetAddr, port))); } - savedListener.onAddresses(servers, Attributes.EMPTY); + servers.addAll(resolvedInetAddrs.srvRecords); + + Attributes.Builder attrs = Attributes.newBuilder(); + if (!resolvedInetAddrs.txtRecords.isEmpty()) { + attrs.set(Grpc.NAME_RESOLVER_ATTR_TXT, + Collections.unmodifiableList(new ArrayList(resolvedInetAddrs.txtRecords))); + } + savedListener.onAddresses(servers, attrs.build()); } finally { synchronized (DnsNameResolver.this) { resolving = false; @@ -278,10 +296,15 @@ abstract static class DelegateResolver { static final class ResolutionResults { final List addresses; final List txtRecords; + final List srvRecords; - ResolutionResults(List addresses, List txtRecords) { + ResolutionResults( + List addresses, + List txtRecords, + List srvRecords) { this.addresses = Collections.unmodifiableList(checkNotNull(addresses, "addresses")); this.txtRecords = Collections.unmodifiableList(checkNotNull(txtRecords, "txtRecords")); + this.srvRecords = Collections.unmodifiableList(checkNotNull(srvRecords, "srvRecords")); } } @@ -305,14 +328,16 @@ ResolutionResults resolve(String host) throws Exception { ResolutionResults jdkResults = jdkResovler.resolve(host); List addresses = jdkResults.addresses; List txtRecords = Collections.emptyList(); + List srvRecords = Collections.emptyList(); try { ResolutionResults jdniResults = jndiResovler.resolve(host); txtRecords = jdniResults.txtRecords; + srvRecords = jdniResults.srvRecords; } catch (Exception e) { logger.log(Level.SEVERE, "Failed to resolve TXT results", e); } - return new ResolutionResults(addresses, txtRecords); + return new ResolutionResults(addresses, txtRecords, srvRecords); } } @@ -328,7 +353,8 @@ static final class JdkResolver extends DelegateResolver { ResolutionResults resolve(String host) throws Exception { return new ResolutionResults( Arrays.asList(InetAddress.getAllByName(host)), - Collections.emptyList()); + Collections.emptyList(), + Collections.emptyList()); } } @@ -340,26 +366,82 @@ ResolutionResults resolve(String host) throws Exception { @VisibleForTesting static final class JndiResolver extends DelegateResolver { - private static final String[] rrTypes = new String[]{"TXT"}; + private static final Pattern whitespace = Pattern.compile("\\s*"); @Override ResolutionResults resolve(String host) throws NamingException { + List serviceConfigTxtRecords = Collections.emptyList(); + String serviceConfigHostname = SERVICE_CONFIG_NAME_PREFIX + host; + if (logger.isLoggable(Level.FINER)) { + logger.log( + Level.FINER, "About to query TXT records for {0}", new Object[]{serviceConfigHostname}); + } + try { + serviceConfigTxtRecords = getAllRecords("TXT", "dns:///" + serviceConfigHostname); + } catch (NamingException e) { + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "Unable to look up " + serviceConfigHostname, e); + } + } + + String grpclbHostname = GRPCLB_NAME_PREFIX + host; + if (logger.isLoggable(Level.FINER)) { + logger.log( + Level.FINER, "About to query SRV records for {0}", new Object[]{grpclbHostname}); + } + List balancerAddresses = Collections.emptyList(); + try { + List grpclbSrvRecords = getAllRecords("SRV", "dns:///" + grpclbHostname); + balancerAddresses = new ArrayList(grpclbSrvRecords.size()); + for (String srvRecord : grpclbSrvRecords) { + try { + String[] parts = whitespace.split(srvRecord); + Verify.verify(parts.length == 8, "Bad SRV Record: %s, ", srvRecord); + String srvHostname = parts[7]; + int port = Integer.parseInt(parts[6]); + + InetAddress[] addrs = InetAddress.getAllByName(srvHostname); + List sockaddrs = new ArrayList(addrs.length); + for (InetAddress addr : addrs) { + sockaddrs.add(new InetSocketAddress(addr, port)); + } + balancerAddresses.add( + new EquivalentAddressGroup( + Collections.unmodifiableList(sockaddrs), Attributes.newBuilder().build())); + } catch (UnknownHostException e) { + logger.log(Level.WARNING, "Can't find address for SRV record" + srvRecord, e); + } catch (RuntimeException e) { + logger.log(Level.WARNING, "Failed to construct SRV record" + srvRecord, e); + } + } + } catch (NamingException e) { + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "Unable to look up " + serviceConfigHostname, e); + } + } + + return new ResolutionResults( + /*addresses=*/ Collections.emptyList(), + serviceConfigTxtRecords, + Collections.unmodifiableList(balancerAddresses)); + } + + private List getAllRecords(String recordType, String name) throws NamingException { InitialDirContext dirContext = new InitialDirContext(); - javax.naming.directory.Attributes attrs = dirContext.getAttributes("dns:///" + host, rrTypes); - List addresses = new ArrayList(); - List txtRecords = new ArrayList(); + String[] rrType = new String[]{recordType}; + javax.naming.directory.Attributes attrs = dirContext.getAttributes(name, rrType); + List records = new ArrayList(); NamingEnumeration rrGroups = attrs.getAll(); try { while (rrGroups.hasMore()) { Attribute rrEntry = rrGroups.next(); - assert Arrays.asList(rrTypes).contains(rrEntry.getID()); + assert Arrays.asList(rrType).contains(rrEntry.getID()); NamingEnumeration rrValues = rrEntry.getAll(); try { while (rrValues.hasMore()) { - String rrValue = (String) rrValues.next(); - txtRecords.add(rrValue); + records.add(String.valueOf(rrValues.next())); } } finally { rrValues.close(); @@ -368,8 +450,7 @@ ResolutionResults resolve(String host) throws NamingException { } finally { rrGroups.close(); } - - return new ResolutionResults(addresses, txtRecords); + return records; } } } diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index 9de8bf96afc..6e79096723b 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -890,27 +890,32 @@ public void onAddresses(final List servers, final Attrib onError(Status.UNAVAILABLE.withDescription("NameResolver returned an empty list")); return; } - logger.log(Level.FINE, "[{0}] resolved address: {1}, config={2}", - new Object[] {getLogId(), servers, config}); - helper.runSerialized(new Runnable() { - @Override - public void run() { - // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match. - if (NameResolverListenerImpl.this.helper != ManagedChannelImpl.this.lbHelper) { - return; - } - try { - balancer.handleResolvedAddressGroups(servers, config); - } catch (Throwable e) { - logger.log( - Level.WARNING, "[" + getLogId() + "] Unexpected exception from LoadBalancer", e); - // It must be a bug! Push the exception back to LoadBalancer in the hope that it may - // be propagated to the application. - balancer.handleNameResolutionError(Status.INTERNAL.withCause(e) - .withDescription("Thrown from handleResolvedAddresses(): " + e)); - } + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "[{0}] resolved address: {1}, config={2}", + new Object[]{getLogId(), servers, config}); + } + + final class NamesResolved implements Runnable { + @Override + public void run() { + // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match. + if (NameResolverListenerImpl.this.helper != ManagedChannelImpl.this.lbHelper) { + return; } - }); + try { + balancer.handleResolvedAddressGroups(servers, config); + } catch (Throwable e) { + logger.log( + Level.WARNING, "[" + getLogId() + "] Unexpected exception from LoadBalancer", e); + // It must be a bug! Push the exception back to LoadBalancer in the hope that it may + // be propagated to the application. + balancer.handleNameResolutionError(Status.INTERNAL.withCause(e) + .withDescription("Thrown from handleResolvedAddresses(): " + e)); + } + } + } + + helper.runSerialized(new NamesResolved()); } @Override diff --git a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java index ee0324f1de9..74b3ba026b5 100644 --- a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java +++ b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java @@ -323,15 +323,25 @@ public void compositeResolverPrefersJdkAddressJndiTxt() throws Exception { DelegateResolver resolver = new DnsNameResolver.CompositeResolver(jdkDelegate, jndiDelegate); List jdkAnswer = createAddressList(2); - jdkDelegate.addAnswer(jdkAnswer, Arrays.asList("jdktxt")); + jdkDelegate.addAnswer( + jdkAnswer, + Arrays.asList("jdktxt"), + Collections.emptyList()); List jdniAnswer = createAddressList(2); - jndiDelegate.addAnswer(jdniAnswer, Arrays.asList("jnditxt")); + jndiDelegate.addAnswer( + jdniAnswer, + Arrays.asList("jnditxt"), + Collections.singletonList( + new EquivalentAddressGroup( + Collections.singletonList(new SocketAddress() {}), + Attributes.EMPTY))); ResolutionResults results = resolver.resolve("abc"); assertThat(results.addresses).containsExactlyElementsIn(jdkAnswer).inOrder(); assertThat(results.txtRecords).containsExactly("jnditxt"); + assertThat(results.srvRecords).hasSize(1); } @Test @@ -418,14 +428,19 @@ private static class MockResolver extends DnsNameResolver.DelegateResolver { private final Queue invocations = new LinkedList(); MockResolver addAnswer(List addresses) { - return addAnswer(addresses, null); + return addAnswer(addresses, null, null); } - MockResolver addAnswer(List addresses, List txtRecords) { + MockResolver addAnswer( + List addresses, + List txtRecords, + List balancerAddresses) { answers.add( new ResolutionResults( addresses, - MoreObjects.firstNonNull(txtRecords, Collections.emptyList()))); + MoreObjects.firstNonNull(txtRecords, Collections.emptyList()), + MoreObjects.firstNonNull( + balancerAddresses, Collections.emptyList()))); return this; } From 5804242fc6d31806741e1647d83b43486cf48e9d Mon Sep 17 00:00:00 2001 From: Carl Mastrangelo Date: Fri, 8 Dec 2017 18:04:37 -0800 Subject: [PATCH 2/5] move grpc attributes --- core/src/main/java/io/grpc/Grpc.java | 8 ---- .../io/grpc/internal/DnsNameResolver.java | 19 +++++---- .../java/io/grpc/internal/GrpcAttributes.java | 41 +++++++++++++++++++ .../java/io/grpc/grpclb/GrpclbConstants.java | 7 ---- .../io/grpc/grpclb/GrpclbLoadBalancer.java | 3 +- .../grpc/grpclb/GrpclbLoadBalancerTest.java | 3 +- 6 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 core/src/main/java/io/grpc/internal/GrpcAttributes.java diff --git a/core/src/main/java/io/grpc/Grpc.java b/core/src/main/java/io/grpc/Grpc.java index 79d1a6001f0..8d3d4cc5282 100644 --- a/core/src/main/java/io/grpc/Grpc.java +++ b/core/src/main/java/io/grpc/Grpc.java @@ -17,7 +17,6 @@ package io.grpc; import java.net.SocketAddress; -import java.util.List; import javax.net.ssl.SSLSession; /** @@ -41,11 +40,4 @@ private Grpc() { @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1710") public static final Attributes.Key TRANSPORT_ATTR_SSL_SESSION = Attributes.Key.of("ssl-session"); - - /** - * Attribute key TXT DNS records. - */ - @ExperimentalApi("https://github.com/grpc/grpc-java/issues/9999") - public static final Attributes.Key> NAME_RESOLVER_ATTR_TXT = - Attributes.Key.of("dns-txt"); } diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolver.java b/core/src/main/java/io/grpc/internal/DnsNameResolver.java index 9e8c7334855..4b4464d5cca 100644 --- a/core/src/main/java/io/grpc/internal/DnsNameResolver.java +++ b/core/src/main/java/io/grpc/internal/DnsNameResolver.java @@ -23,7 +23,6 @@ import com.google.common.base.Verify; import io.grpc.Attributes; import io.grpc.EquivalentAddressGroup; -import io.grpc.Grpc; import io.grpc.NameResolver; import io.grpc.Status; import io.grpc.internal.SharedResourceHolder.Resource; @@ -167,7 +166,6 @@ public void run() { } ResolutionResults resolvedInetAddrs; try { - logger.log(Level.SEVERE, "RESOVLING"); resolvedInetAddrs = delegateResolver.resolve(host); } catch (Exception e) { synchronized (DnsNameResolver.this) { @@ -193,7 +191,8 @@ public void run() { Attributes.Builder attrs = Attributes.newBuilder(); if (!resolvedInetAddrs.txtRecords.isEmpty()) { - attrs.set(Grpc.NAME_RESOLVER_ATTR_TXT, + attrs.set( + GrpcAttributes.NAME_RESOLVER_ATTR_TXT, Collections.unmodifiableList(new ArrayList(resolvedInetAddrs.txtRecords))); } savedListener.onAddresses(servers, attrs.build()); @@ -366,7 +365,7 @@ ResolutionResults resolve(String host) throws Exception { @VisibleForTesting static final class JndiResolver extends DelegateResolver { - private static final Pattern whitespace = Pattern.compile("\\s*"); + private static final Pattern whitespace = Pattern.compile("\\s+"); @Override ResolutionResults resolve(String host) throws NamingException { @@ -397,18 +396,20 @@ ResolutionResults resolve(String host) throws NamingException { for (String srvRecord : grpclbSrvRecords) { try { String[] parts = whitespace.split(srvRecord); - Verify.verify(parts.length == 8, "Bad SRV Record: %s, ", srvRecord); - String srvHostname = parts[7]; - int port = Integer.parseInt(parts[6]); + Verify.verify(parts.length == 4, "Bad SRV Record: %s, ", srvRecord); + String srvHostname = parts[3]; + int port = Integer.parseInt(parts[2]); InetAddress[] addrs = InetAddress.getAllByName(srvHostname); List sockaddrs = new ArrayList(addrs.length); for (InetAddress addr : addrs) { sockaddrs.add(new InetSocketAddress(addr, port)); } + Attributes attrs = Attributes.newBuilder() + .set(GrpcAttributes.ATTR_LB_ADDR_AUTHORITY, srvHostname) + .build(); balancerAddresses.add( - new EquivalentAddressGroup( - Collections.unmodifiableList(sockaddrs), Attributes.newBuilder().build())); + new EquivalentAddressGroup(Collections.unmodifiableList(sockaddrs), attrs)); } catch (UnknownHostException e) { logger.log(Level.WARNING, "Can't find address for SRV record" + srvRecord, e); } catch (RuntimeException e) { diff --git a/core/src/main/java/io/grpc/internal/GrpcAttributes.java b/core/src/main/java/io/grpc/internal/GrpcAttributes.java new file mode 100644 index 00000000000..0967b2af7a3 --- /dev/null +++ b/core/src/main/java/io/grpc/internal/GrpcAttributes.java @@ -0,0 +1,41 @@ +/* + * Copyright 2017, gRPC Authors All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.grpc.internal; + +import io.grpc.Attributes; +import java.util.List; + +/** + * Special attributes that are only useful to gRPC. + */ +public final class GrpcAttributes { + /** + * Attribute key TXT DNS records. + */ + public static final Attributes.Key> NAME_RESOLVER_ATTR_TXT = + Attributes.Key.of("dns-txt"); + + /** + * The naming authority of a gRPC LB server address. It is an address-group-level attribute, + * present when the address group is a LoadBalancer. + */ + public static final Attributes.Key ATTR_LB_ADDR_AUTHORITY = + Attributes.Key.of("io.grpc.grpclb.lbAddrAuthority"); + + + private GrpcAttributes() {} +} diff --git a/grpclb/src/main/java/io/grpc/grpclb/GrpclbConstants.java b/grpclb/src/main/java/io/grpc/grpclb/GrpclbConstants.java index 99745aac7a4..4e720746600 100644 --- a/grpclb/src/main/java/io/grpc/grpclb/GrpclbConstants.java +++ b/grpclb/src/main/java/io/grpc/grpclb/GrpclbConstants.java @@ -40,13 +40,6 @@ public enum LbPolicy { public static final Attributes.Key ATTR_LB_POLICY = Attributes.Key.of("io.grpc.grpclb.lbPolicy"); - /** - * The naming authority of an LB server address. It is an address-group-level attribute, present - * when the address group is a LoadBalancer. - */ - public static final Attributes.Key ATTR_LB_ADDR_AUTHORITY = - Attributes.Key.of("io.grpc.grpclb.lbAddrAuthority"); - /** * The opaque token given by the remote balancer for each returned server address. The client * will send this token with any requests sent to the associated server. diff --git a/grpclb/src/main/java/io/grpc/grpclb/GrpclbLoadBalancer.java b/grpclb/src/main/java/io/grpc/grpclb/GrpclbLoadBalancer.java index ec7326eecbd..adc280bb5da 100644 --- a/grpclb/src/main/java/io/grpc/grpclb/GrpclbLoadBalancer.java +++ b/grpclb/src/main/java/io/grpc/grpclb/GrpclbLoadBalancer.java @@ -27,6 +27,7 @@ import io.grpc.LoadBalancer; import io.grpc.Status; import io.grpc.grpclb.GrpclbConstants.LbPolicy; +import io.grpc.internal.GrpcAttributes; import io.grpc.internal.ObjectPool; import java.util.ArrayList; import java.util.Collections; @@ -104,7 +105,7 @@ public void handleResolvedAddressGroups( List newLbAddressGroups = new ArrayList(); List newBackendServers = new ArrayList(); for (EquivalentAddressGroup server : updatedServers) { - String lbAddrAuthority = server.getAttributes().get(GrpclbConstants.ATTR_LB_ADDR_AUTHORITY); + String lbAddrAuthority = server.getAttributes().get(GrpcAttributes.ATTR_LB_ADDR_AUTHORITY); if (lbAddrAuthority != null) { newLbAddressGroups.add(new LbAddressGroup(server, lbAddrAuthority)); } else { diff --git a/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java b/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java index 3feb985f93f..41c081a1cea 100644 --- a/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java +++ b/grpclb/src/test/java/io/grpc/grpclb/GrpclbLoadBalancerTest.java @@ -71,6 +71,7 @@ import io.grpc.inprocess.InProcessChannelBuilder; import io.grpc.inprocess.InProcessServerBuilder; import io.grpc.internal.FakeClock; +import io.grpc.internal.GrpcAttributes; import io.grpc.internal.ObjectPool; import io.grpc.internal.SerializingExecutor; import io.grpc.stub.StreamObserver; @@ -1623,7 +1624,7 @@ private static String lbAuthority(int unused) { private static Attributes lbAttributes(String authority) { return Attributes.newBuilder() - .set(GrpclbConstants.ATTR_LB_ADDR_AUTHORITY, authority) + .set(GrpcAttributes.ATTR_LB_ADDR_AUTHORITY, authority) .build(); } From e6985e8676533ba0469bcd8b92dd813565b843df Mon Sep 17 00:00:00 2001 From: Carl Mastrangelo Date: Mon, 11 Dec 2017 10:36:41 -0800 Subject: [PATCH 3/5] put jni behind flag --- core/src/main/java/io/grpc/internal/DnsNameResolver.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolver.java b/core/src/main/java/io/grpc/internal/DnsNameResolver.java index 4b4464d5cca..2ac003d7e62 100644 --- a/core/src/main/java/io/grpc/internal/DnsNameResolver.java +++ b/core/src/main/java/io/grpc/internal/DnsNameResolver.java @@ -68,8 +68,11 @@ final class DnsNameResolver extends NameResolver { // From https://github.com/grpc/proposal/blob/master/A5-grpclb-in-dns.md private static final String GRPCLB_NAME_PREFIX = "_grpclb._tcp."; + private static final String jndiProperty = + System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi", "false"); + @VisibleForTesting - static boolean enableJndi = true; + static boolean enableJndi = Boolean.parseBoolean(jndiProperty); private DelegateResolver delegateResolver = pickDelegateResolver(); From dd701beb994c63ab92bdccd3e12d1d4f3ec243c9 Mon Sep 17 00:00:00 2001 From: Carl Mastrangelo Date: Mon, 18 Dec 2017 13:59:39 -0800 Subject: [PATCH 4/5] resolve comments --- .../java/io/grpc/internal/DnsNameResolver.java | 17 +++++++++-------- .../java/io/grpc/internal/GrpcAttributes.java | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolver.java b/core/src/main/java/io/grpc/internal/DnsNameResolver.java index 2ac003d7e62..9ca30f2c2de 100644 --- a/core/src/main/java/io/grpc/internal/DnsNameResolver.java +++ b/core/src/main/java/io/grpc/internal/DnsNameResolver.java @@ -190,12 +190,12 @@ public void run() { for (InetAddress inetAddr : resolvedInetAddrs.addresses) { servers.add(new EquivalentAddressGroup(new InetSocketAddress(inetAddr, port))); } - servers.addAll(resolvedInetAddrs.srvRecords); + servers.addAll(resolvedInetAddrs.balancerAddresses); Attributes.Builder attrs = Attributes.newBuilder(); if (!resolvedInetAddrs.txtRecords.isEmpty()) { attrs.set( - GrpcAttributes.NAME_RESOLVER_ATTR_TXT, + GrpcAttributes.NAME_RESOLVER_ATTR_DNS_TXT, Collections.unmodifiableList(new ArrayList(resolvedInetAddrs.txtRecords))); } savedListener.onAddresses(servers, attrs.build()); @@ -298,15 +298,16 @@ abstract static class DelegateResolver { static final class ResolutionResults { final List addresses; final List txtRecords; - final List srvRecords; + final List balancerAddresses; ResolutionResults( List addresses, List txtRecords, - List srvRecords) { + List balancerAddresses) { this.addresses = Collections.unmodifiableList(checkNotNull(addresses, "addresses")); this.txtRecords = Collections.unmodifiableList(checkNotNull(txtRecords, "txtRecords")); - this.srvRecords = Collections.unmodifiableList(checkNotNull(srvRecords, "srvRecords")); + this.balancerAddresses = + Collections.unmodifiableList(checkNotNull(balancerAddresses, "balancerAddresses")); } } @@ -330,16 +331,16 @@ ResolutionResults resolve(String host) throws Exception { ResolutionResults jdkResults = jdkResovler.resolve(host); List addresses = jdkResults.addresses; List txtRecords = Collections.emptyList(); - List srvRecords = Collections.emptyList(); + List balancerAddresses = Collections.emptyList(); try { ResolutionResults jdniResults = jndiResovler.resolve(host); txtRecords = jdniResults.txtRecords; - srvRecords = jdniResults.srvRecords; + balancerAddresses = jdniResults.balancerAddresses; } catch (Exception e) { logger.log(Level.SEVERE, "Failed to resolve TXT results", e); } - return new ResolutionResults(addresses, txtRecords, srvRecords); + return new ResolutionResults(addresses, txtRecords, balancerAddresses); } } diff --git a/core/src/main/java/io/grpc/internal/GrpcAttributes.java b/core/src/main/java/io/grpc/internal/GrpcAttributes.java index 0967b2af7a3..b6d5e8a86aa 100644 --- a/core/src/main/java/io/grpc/internal/GrpcAttributes.java +++ b/core/src/main/java/io/grpc/internal/GrpcAttributes.java @@ -26,7 +26,7 @@ public final class GrpcAttributes { /** * Attribute key TXT DNS records. */ - public static final Attributes.Key> NAME_RESOLVER_ATTR_TXT = + public static final Attributes.Key> NAME_RESOLVER_ATTR_DNS_TXT = Attributes.Key.of("dns-txt"); /** From 4f7a2fdc7d1e43d7681a2a3e88edd7fe6f16095f Mon Sep 17 00:00:00 2001 From: Carl Mastrangelo Date: Mon, 18 Dec 2017 14:46:57 -0800 Subject: [PATCH 5/5] test fix --- core/src/test/java/io/grpc/internal/DnsNameResolverTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java index 74b3ba026b5..7183217e3b1 100644 --- a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java +++ b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java @@ -341,7 +341,7 @@ public void compositeResolverPrefersJdkAddressJndiTxt() throws Exception { assertThat(results.addresses).containsExactlyElementsIn(jdkAnswer).inOrder(); assertThat(results.txtRecords).containsExactly("jnditxt"); - assertThat(results.srvRecords).hasSize(1); + assertThat(results.balancerAddresses).hasSize(1); } @Test