aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Alexander Polcyn <apolcyn@google.com>2018-10-12 11:56:29 -0700
committerGravatar Alexander Polcyn <apolcyn@google.com>2018-12-12 13:20:51 -0800
commit7dc330f298154571163603a8b568015412767cad (patch)
treeb4a232f562fdfafbd8dfb95d28babb5af33e6f51
parent311ee1eda13a340f1f33638920965f9f753b9d26 (diff)
Disable SRV and TXT lookups for localhost
-rw-r--r--src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc9
-rw-r--r--src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc29
-rw-r--r--test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc5
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer.cc5
-rw-r--r--test/core/iomgr/resolve_address_posix_test.cc13
5 files changed, 55 insertions, 6 deletions
diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
index c8425ae336..fc83fc4488 100644
--- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
+++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
@@ -465,11 +465,16 @@ static grpc_error* blocking_resolve_address_ares(
static grpc_address_resolver_vtable ares_resolver = {
grpc_resolve_address_ares, blocking_resolve_address_ares};
+static bool should_use_ares(const char* resolver_env) {
+ return resolver_env != nullptr && gpr_stricmp(resolver_env, "ares") == 0;
+}
+
void grpc_resolver_dns_ares_init() {
char* resolver_env = gpr_getenv("GRPC_DNS_RESOLVER");
/* TODO(zyc): Turn on c-ares based resolver by default after the address
sorter and the CNAME support are added. */
- if (resolver_env != nullptr && gpr_stricmp(resolver_env, "ares") == 0) {
+ if (should_use_ares(resolver_env)) {
+ gpr_log(GPR_DEBUG, "Using ares dns resolver");
address_sorting_init();
grpc_error* error = grpc_ares_init();
if (error != GRPC_ERROR_NONE) {
@@ -489,7 +494,7 @@ void grpc_resolver_dns_ares_init() {
void grpc_resolver_dns_ares_shutdown() {
char* resolver_env = gpr_getenv("GRPC_DNS_RESOLVER");
- if (resolver_env != nullptr && gpr_stricmp(resolver_env, "ares") == 0) {
+ if (should_use_ares(resolver_env)) {
address_sorting_shutdown();
grpc_ares_cleanup();
}
diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc
index 1b1c2303da..6897756769 100644
--- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc
+++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc
@@ -510,6 +510,28 @@ static bool resolve_as_ip_literal_locked(
return out;
}
+static bool target_matches_localhost_inner(const char* name, char** host,
+ char** port) {
+ if (!gpr_split_host_port(name, host, port)) {
+ gpr_log(GPR_INFO, "Unable to split host and port for name: %s", name);
+ return false;
+ }
+ if (gpr_stricmp(*host, "localhost") == 0) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+static bool target_matches_localhost(const char* name) {
+ char* host = nullptr;
+ char* port = nullptr;
+ bool out = target_matches_localhost_inner(name, &host, &port);
+ gpr_free(host);
+ gpr_free(port);
+ return out;
+}
+
static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
const char* dns_server, const char* name, const char* default_port,
grpc_pollset_set* interested_parties, grpc_closure* on_done,
@@ -536,6 +558,13 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
GRPC_CLOSURE_SCHED(on_done, GRPC_ERROR_NONE);
return r;
}
+ // Don't query for SRV and TXT records if the target is "localhost", so
+ // as to cut down on lookups over the network, especially in tests:
+ // https://github.com/grpc/proposal/pull/79
+ if (target_matches_localhost(name)) {
+ check_grpclb = false;
+ r->service_config_json_out = nullptr;
+ }
// Look up name using c-ares lib.
grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
r, dns_server, name, default_port, interested_parties, check_grpclb,
diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc
index 1a7a7c9ccc..0cf549d01d 100644
--- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc
+++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc
@@ -76,7 +76,10 @@ static grpc_ares_request* my_dns_lookup_ares_locked(
} else {
gpr_mu_unlock(&g_mu);
*addresses = grpc_core::MakeUnique<grpc_core::ServerAddressList>();
- (*addresses)->emplace_back(nullptr, 0, nullptr);
+ grpc_resolved_address dummy_resolved_address;
+ memset(&dummy_resolved_address, 0, sizeof(dummy_resolved_address));
+ dummy_resolved_address.len = 123;
+ (*addresses)->emplace_back(dummy_resolved_address, nullptr);
}
GRPC_CLOSURE_SCHED(on_done, error);
return nullptr;
diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc
index fe47127984..a0b8290475 100644
--- a/test/core/end2end/fuzzers/api_fuzzer.cc
+++ b/test/core/end2end/fuzzers/api_fuzzer.cc
@@ -342,7 +342,10 @@ static void finish_resolve(void* arg, grpc_error* error) {
*r->addrs = addrs;
} else if (r->addresses != nullptr) {
*r->addresses = grpc_core::MakeUnique<grpc_core::ServerAddressList>();
- (*r->addresses)->emplace_back(nullptr, 0, nullptr);
+ grpc_resolved_address dummy_resolved_address;
+ memset(&dummy_resolved_address, 0, sizeof(dummy_resolved_address));
+ dummy_resolved_address.len = 0;
+ (*r->addresses)->emplace_back(dummy_resolved_address, nullptr);
}
GRPC_CLOSURE_SCHED(r->on_done, GRPC_ERROR_NONE);
} else {
diff --git a/test/core/iomgr/resolve_address_posix_test.cc b/test/core/iomgr/resolve_address_posix_test.cc
index ceeb70a108..5785c73e22 100644
--- a/test/core/iomgr/resolve_address_posix_test.cc
+++ b/test/core/iomgr/resolve_address_posix_test.cc
@@ -27,6 +27,8 @@
#include <grpc/support/sync.h>
#include <grpc/support/time.h>
+#include "src/core/lib/gpr/env.h"
+#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/gprpp/thd.h"
#include "src/core/lib/iomgr/executor.h"
@@ -163,8 +165,15 @@ int main(int argc, char** argv) {
{
grpc_core::ExecCtx exec_ctx;
- test_unix_socket();
- test_unix_socket_path_name_too_long();
+ char* resolver_env = gpr_getenv("GRPC_DNS_RESOLVER");
+ // c-ares resolver doesn't support UDS (ability for native DNS resolver
+ // to handle this is only expected to be used by servers, which
+ // unconditionally use the native DNS resolver).
+ if (resolver_env == nullptr || gpr_stricmp(resolver_env, "native") == 0) {
+ test_unix_socket();
+ test_unix_socket_path_name_too_long();
+ }
+ gpr_free(resolver_env);
}
grpc_shutdown();