diff --git a/doc/environment_variables.md b/doc/environment_variables.md index 11ac890cd5a8ae2307e45bb1bf883fbe04310247..6c13015baa51f205a01459fad9cbc27856264e20 100644 --- a/doc/environment_variables.md +++ b/doc/environment_variables.md @@ -68,6 +68,6 @@ some configuration as environment variables that can be set. * GRPC_DNS_RESOLVER Declares which DNS resolver to use. Available DNS resolver include: - - ares - a DNS resolver based around the c-ares library + - ares (default) - a DNS resolver based around the c-ares library - native - a DNS resolver based around getaddrinfo(), creates a new thread to perform name resolution diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index f261481fd4ae37d0a0b0e48d594cc36a2afff0ce..670df36f1db45a1b6b7829a07cf13f334eb84655 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -102,7 +102,7 @@ Pod::Spec.new do |s| } s.default_subspecs = 'Interface', 'Implementation' - s.compiler_flags = '-DGRPC_NATIVE_ADDRESS_RESOLVE' + s.compiler_flags = '-DGRPC_ARES=0' # Like many other C libraries, gRPC-Core has its public headers under `include/<libname>/` and its # sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't diff --git a/include/grpc/impl/codegen/port_platform.h b/include/grpc/impl/codegen/port_platform.h index 29b0cb80c4ee7bbcc63c5f6b2dc61d798b48f354..1db69b08e2548675ff301a4cfd906b63a722daa3 100644 --- a/include/grpc/impl/codegen/port_platform.h +++ b/include/grpc/impl/codegen/port_platform.h @@ -360,9 +360,13 @@ typedef unsigned __int64 uint64_t; power of two */ #define GPR_MAX_ALIGNMENT 16 +/* #define GRPC_ARES 0 */ + +#ifndef GRPC_ARES #ifdef GPR_WINDOWS -#ifndef GRPC_NATIVE_ADDRESS_RESOLVE -#define GRPC_NATIVE_ADDRESS_RESOLVE +#define GRPC_ARES 0 +#else +#define GRPC_ARES 1 #endif #endif diff --git a/src/core/ext/client_channel/resolver_registry.c b/src/core/ext/client_channel/resolver_registry.c index 94942069a112a13c82363adbcc3e6aefa1cf7f01..dc8be78764c76a78a5a63197b466284a54cea999 100644 --- a/src/core/ext/client_channel/resolver_registry.c +++ b/src/core/ext/client_channel/resolver_registry.c @@ -77,8 +77,12 @@ void grpc_resolver_registry_set_default_prefix( void grpc_register_resolver_type(grpc_resolver_factory *factory) { int i; for (i = 0; i < g_number_of_resolvers; i++) { - GPR_ASSERT(0 != strcmp(factory->vtable->scheme, - g_all_of_the_resolvers[i]->vtable->scheme)); + if (0 == strcmp(factory->vtable->scheme, + g_all_of_the_resolvers[i]->vtable->scheme)) { + grpc_resolver_factory_unref(g_all_of_the_resolvers[i]); + g_all_of_the_resolvers[i] = factory; + return; + } } GPR_ASSERT(g_number_of_resolvers != MAX_RESOLVERS); grpc_resolver_factory_ref(factory); diff --git a/src/core/ext/client_channel/resolver_registry.h b/src/core/ext/client_channel/resolver_registry.h index 2a95a669f0d47a988b2ca8e5ec7b79b0d232bd21..c216ae1466214f8e8598c2561695476ac92f0ed6 100644 --- a/src/core/ext/client_channel/resolver_registry.h +++ b/src/core/ext/client_channel/resolver_registry.h @@ -43,6 +43,7 @@ void grpc_resolver_registry_shutdown(void); void grpc_resolver_registry_set_default_prefix(const char *default_prefix); /** Register a resolver type. + \a factory will replace a registered factory if they have the same scheme. URI's of \a scheme will be resolved with the given resolver. If \a priority is greater than zero, then the resolver will be eligible to resolve names that are passed in with no scheme. Higher priority diff --git a/src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c b/src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c index e5691942a40fdb019e03307dfaa16e1cf0e301a7..c0c1efbb8635ea3e88a7f898ccd7cc21153bedf0 100644 --- a/src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c +++ b/src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c @@ -32,6 +32,8 @@ */ #include <grpc/support/port_platform.h> +#if GRPC_ARES == 1 + #include <string.h> #include <grpc/support/alloc.h> @@ -277,7 +279,7 @@ static void dns_ares_start_resolving_locked(grpc_exec_ctx *exec_ctx, GPR_ASSERT(!r->resolving); r->resolving = true; r->addresses = NULL; - grpc_resolve_address_ares( + grpc_resolve_address( exec_ctx, r->name_to_resolve, r->default_port, r->base.pollset_set, grpc_closure_create(dns_ares_on_resolved, r), &r->addresses); } @@ -299,7 +301,6 @@ static void dns_ares_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) { gpr_log(GPR_DEBUG, "dns_ares_destroy"); ares_dns_resolver *r = (ares_dns_resolver *)gr; grpc_combiner_destroy(exec_ctx, r->combiner); - grpc_ares_cleanup(); if (r->resolved_result != NULL) { grpc_channel_args_destroy(r->resolved_result); } @@ -311,29 +312,18 @@ static void dns_ares_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) { static grpc_resolver *dns_ares_create(grpc_resolver_args *args, const char *default_port) { - ares_dns_resolver *r; - grpc_error *error = GRPC_ERROR_NONE; - char *proxy_name; // Get name from args. const char *path = args->uri->path; - if (0 != strcmp(args->uri->authority, "")) { gpr_log(GPR_ERROR, "authority based dns uri's not supported"); return NULL; } - - error = grpc_ares_init(); - if (error != GRPC_ERROR_NONE) { - GRPC_LOG_IF_ERROR("ares_library_init() failed", error); - return NULL; - } - if (path[0] == '/') ++path; // Get proxy name, if any. - proxy_name = grpc_get_http_proxy_server(); + char *proxy_name = grpc_get_http_proxy_server(); // Create resolver. - r = gpr_malloc(sizeof(ares_dns_resolver)); + ares_dns_resolver *r = gpr_malloc(sizeof(ares_dns_resolver)); memset(r, 0, sizeof(*r)); grpc_resolver_init(&r->base, &dns_ares_resolver_vtable); r->combiner = grpc_combiner_create(NULL); @@ -389,9 +379,24 @@ static grpc_resolver_factory *dns_ares_resolver_factory_create() { void grpc_resolver_dns_ares_init(void) { char *resolver = gpr_getenv("GRPC_DNS_RESOLVER"); if (resolver == NULL || gpr_stricmp(resolver, "ares") == 0) { + grpc_error *error = grpc_ares_init(); + if (error != GRPC_ERROR_NONE) { + GRPC_LOG_IF_ERROR("ares_library_init() failed", error); + return; + } + grpc_resolve_address = grpc_resolve_address_ares; grpc_register_resolver_type(dns_ares_resolver_factory_create()); } gpr_free(resolver); } +void grpc_resolver_dns_ares_shutdown(void) { grpc_ares_cleanup(); } + +#else /* GRPC_ARES == 1 */ +#include <grpc/support/log.h> + +void grpc_resolver_dns_ares_init(void) {} + void grpc_resolver_dns_ares_shutdown(void) {} + +#endif /* GRPC_ARES == 1 */ diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h index 7165df0afca140bb0da04ec8c49646aafd5d3ff8..334feaa2aba4ec6f802ce388fd12ffd8e183e088 100644 --- a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h +++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h @@ -34,6 +34,8 @@ #ifndef GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_EV_DRIVER_H #define GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_EV_DRIVER_H +#include <ares.h> + #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/pollset_set.h" @@ -48,7 +50,7 @@ void grpc_ares_ev_driver_start(grpc_exec_ctx *exec_ctx, /* Returns the ares_channel owned by \a ev_driver. To bind a c-ares query to \a ev_driver, use the ares_channel owned by \a ev_driver as the arg of the query. */ -void *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver); +ares_channel *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver); /* Creates a new grpc_ares_ev_driver. Returns GRPC_ERROR_NONE if \a ev_driver is created successfully. */ diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c index a4733dcb4bc9d5aca62eb588b8685fa2fc357bf7..68c52e43f06468a186fb0b27bf94a66094aedc2d 100644 --- a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c +++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c @@ -32,11 +32,10 @@ */ #include <grpc/support/port_platform.h> #include "src/core/lib/iomgr/port.h" -#if !defined(GRPC_NATIVE_ADDRESS_RESOLVE) && defined(GRPC_POSIX_SOCKET) +#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET) #include "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h" -#include <ares.h> #include <grpc/support/alloc.h> #include <grpc/support/log.h> #include <grpc/support/string_util.h> @@ -236,7 +235,7 @@ static void on_writable_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_ares_ev_driver_unref(ev_driver); } -void *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver) { +ares_channel *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver) { return &ev_driver->channel; } @@ -327,4 +326,4 @@ void grpc_ares_ev_driver_start(grpc_exec_ctx *exec_ctx, grpc_ares_ev_driver_unref(ev_driver); } -#endif /* !GRPC_NATIVE_ADDRESS_RESOLVE && GRPC_POSIX_SOCKET */ +#endif /* GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET) */ diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c index f90222b2e6da6aea0ac21ba8abe4e22214c8cb99..c8323e740a795a8d739a9ef9d951fe40e427ca23 100644 --- a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c +++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c @@ -32,7 +32,7 @@ */ #include <grpc/support/port_platform.h> -#ifndef GRPC_NATIVE_ADDRESS_RESOLVE +#if GRPC_ARES == 1 #include "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/lib/iomgr/sockaddr.h" @@ -244,8 +244,7 @@ void grpc_resolve_address_ares_impl(grpc_exec_ctx *exec_ctx, const char *name, r->host = host; r->success = false; r->error = GRPC_ERROR_NONE; - ares_channel *channel = - (ares_channel *)grpc_ares_ev_driver_get_channel(r->ev_driver); + ares_channel *channel = grpc_ares_ev_driver_get_channel(r->ev_driver); // An extra reference is put here to avoid destroying the request in // on_done_cb before calling grpc_ares_ev_driver_start. gpr_ref_init(&r->pending_queries, 2); @@ -292,4 +291,4 @@ void grpc_ares_cleanup(void) { gpr_mu_unlock(&g_init_mu); } -#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ +#endif /* GRPC_ARES == 1 */ diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h index 3968a445ab636e1f409098e951a82450435b2ff9..ab00a26b36a7f919a6ea25bd9d29340fb545d898 100644 --- a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h +++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h @@ -34,14 +34,13 @@ #ifndef GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H #define GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H -#include "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/resolve_address.h" -/* Asynchronously resolve addr. Use default_port if a port isn't designated in - addr, otherwise use the port in addr. grpc_ares_init() must be called at +/* Asynchronously resolve addr. Use \a default_port if a port isn't designated + in addr, otherwise use the port in addr. grpc_ares_init() must be called at least once before this function. \a on_done may be called directly in this function without being scheduled with \a exec_ctx, it must not try to acquire locks that are being held by the caller. */ diff --git a/src/core/ext/resolver/dns/native/dns_resolver.c b/src/core/ext/resolver/dns/native/dns_resolver.c index 7cbd6ce95cd0a13dea19050fcc08c2617155742b..a3b4d5b9af9108392eab3e04c665c0a5b44074c6 100644 --- a/src/core/ext/resolver/dns/native/dns_resolver.c +++ b/src/core/ext/resolver/dns/native/dns_resolver.c @@ -310,6 +310,15 @@ void grpc_resolver_dns_native_init(void) { if (resolver != NULL && gpr_stricmp(resolver, "native") == 0) { gpr_log(GPR_DEBUG, "Using native dns resolver"); grpc_register_resolver_type(dns_resolver_factory_create()); + } else { + grpc_resolver_factory *existing_factory = + grpc_resolver_factory_lookup("dns"); + if (existing_factory == NULL) { + gpr_log(GPR_DEBUG, "Using native dns resolver"); + grpc_register_resolver_type(dns_resolver_factory_create()); + } else { + grpc_resolver_factory_unref(existing_factory); + } } gpr_free(resolver); } diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index d52b53dd97b1c948c39ab6c070c5eaa2a64fb808..029e2c33cb05aed2bb0aa4146f59bbbfcd601e8f 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -129,7 +129,7 @@ } s.default_subspecs = 'Interface', 'Implementation' - s.compiler_flags = '-DGRPC_NATIVE_ADDRESS_RESOLVE' + s.compiler_flags = '-DGRPC_ARES=0' # Like many other C libraries, gRPC-Core has its public headers under `include/<libname>/` and its # sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c index 57dfb5cb12e821d7df655291881d53853212f8e2..dd7fa89d692127d2c3ebfe267371678c083b53bf 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c @@ -45,24 +45,46 @@ static gpr_mu g_mu; static bool g_fail_resolution = true; -static int my_resolve_address(const char *name, const char *addr, - grpc_resolved_addresses **addrs, - grpc_error **error) { +// static int my_resolve_address(const char *name, const char *addr, +// grpc_resolved_addresses **addrs, +// grpc_error **error) { +// gpr_mu_lock(&g_mu); +// GPR_ASSERT(0 == strcmp("test", name)); +// if (g_fail_resolution) { +// g_fail_resolution = false; +// gpr_mu_unlock(&g_mu); +// *error = GRPC_ERROR_CREATE("Forced Failure"); +// } else { +// gpr_mu_unlock(&g_mu); +// *addrs = gpr_malloc(sizeof(**addrs)); +// (*addrs)->naddrs = 1; +// (*addrs)->addrs = gpr_malloc(sizeof(*(*addrs)->addrs)); +// (*addrs)->addrs[0].len = 123; +// *error = GRPC_ERROR_NONE; +// } +// return 1; +// } + +static void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, + const char *default_port, + grpc_pollset_set *interested_parties, + grpc_closure *on_done, + grpc_resolved_addresses **addrs) { gpr_mu_lock(&g_mu); - GPR_ASSERT(0 == strcmp("test", name)); + GPR_ASSERT(0 == strcmp("test", addr)); + grpc_error *error = GRPC_ERROR_NONE; if (g_fail_resolution) { g_fail_resolution = false; gpr_mu_unlock(&g_mu); - *error = GRPC_ERROR_CREATE("Forced Failure"); + error = GRPC_ERROR_CREATE("Forced Failure"); } else { gpr_mu_unlock(&g_mu); *addrs = gpr_malloc(sizeof(**addrs)); (*addrs)->naddrs = 1; (*addrs)->addrs = gpr_malloc(sizeof(*(*addrs)->addrs)); (*addrs)->addrs[0].len = 123; - *error = GRPC_ERROR_NONE; } - return 1; + grpc_exec_ctx_sched(exec_ctx, on_done, error, NULL); } static grpc_resolver *create_resolver(const char *name) { @@ -102,7 +124,7 @@ int main(int argc, char **argv) { grpc_init(); gpr_mu_init(&g_mu); - grpc_customized_resolve_address = my_resolve_address; + grpc_resolve_address = my_resolve_address; grpc_resolver *resolver = create_resolver("dns:test"); diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 531c3980b5555493f8adf33f7e4031516fcfca74..746134c85beb8c882d521e1e1498f5d7dc647631 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -39,7 +39,6 @@ #include <grpc/support/log.h> #include <grpc/support/string_util.h> -#include "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/iomgr/resolve_address.h" @@ -362,7 +361,9 @@ static void finish_resolve(grpc_exec_ctx *exec_ctx, void *arg, } void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, - const char *default_port, grpc_closure *on_done, + const char *default_port, + grpc_pollset_set *interested_parties, + grpc_closure *on_done, grpc_resolved_addresses **addresses) { addr_req *r = gpr_malloc(sizeof(*r)); r->addr = gpr_strdup(addr); @@ -374,14 +375,6 @@ void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, finish_resolve, r, gpr_now(GPR_CLOCK_MONOTONIC)); } -void my_resolve_address_async(grpc_exec_ctx *exec_ctx, const char *addr, - const char *default_port, - grpc_pollset_set *interested_parties, - grpc_closure *on_done, - grpc_resolved_addresses **addresses) { - my_resolve_address(exec_ctx, addr, default_port, on_done, addresses); -} - //////////////////////////////////////////////////////////////////////////////// // client connection @@ -664,8 +657,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { grpc_test_only_set_metadata_hash_seed(0); if (squelch) gpr_set_log_function(dont_log); input_stream inp = {data, data + size}; - grpc_resolve_address = my_resolve_address_async; - grpc_resolve_address_ares = my_resolve_address_async; + grpc_resolve_address = my_resolve_address; grpc_tcp_client_connect_impl = my_tcp_client_connect; gpr_now_impl = now_impl; grpc_init(); diff --git a/test/core/end2end/goaway_server_test.c b/test/core/end2end/goaway_server_test.c index 7f9998f36f48242b01e7c935620004c993051a1b..9d9092aa0c648990784d96c6acd70dbcb45934b3 100644 --- a/test/core/end2end/goaway_server_test.c +++ b/test/core/end2end/goaway_server_test.c @@ -46,6 +46,11 @@ static void *tag(intptr_t i) { return (void *)i; } static gpr_mu g_mu; static int g_resolve_port = -1; +static void (*iomgr_resolve_address)(grpc_exec_ctx *exec_ctx, const char *addr, + const char *default_port, + grpc_pollset_set *interested_parties, + grpc_closure *on_done, + grpc_resolved_addresses **addresses); static void set_resolve_port(int port) { gpr_mu_lock(&g_mu); @@ -53,17 +58,22 @@ static void set_resolve_port(int port) { gpr_mu_unlock(&g_mu); } -static int my_resolve_address(const char *name, const char *addr, - grpc_resolved_addresses **addrs, - grpc_error **error) { - if (0 != strcmp(name, "test")) { - return 0; +static void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, + const char *default_port, + grpc_pollset_set *interested_parties, + grpc_closure *on_done, + grpc_resolved_addresses **addrs) { + if (0 != strcmp(addr, "test")) { + iomgr_resolve_address(exec_ctx, addr, default_port, interested_parties, + on_done, addrs); + return; } + grpc_error *error = GRPC_ERROR_NONE; gpr_mu_lock(&g_mu); if (g_resolve_port < 0) { gpr_mu_unlock(&g_mu); - *error = GRPC_ERROR_CREATE("Forced Failure"); + error = GRPC_ERROR_CREATE("Forced Failure"); } else { *addrs = gpr_malloc(sizeof(**addrs)); (*addrs)->naddrs = 1; @@ -75,9 +85,8 @@ static int my_resolve_address(const char *name, const char *addr, sa->sin_port = htons((uint16_t)g_resolve_port); (*addrs)->addrs[0].len = sizeof(*sa); gpr_mu_unlock(&g_mu); - *error = GRPC_ERROR_NONE; } - return 1; + grpc_exec_ctx_sched(exec_ctx, on_done, error, NULL); } int main(int argc, char **argv) { @@ -89,8 +98,9 @@ int main(int argc, char **argv) { grpc_test_init(argc, argv); gpr_mu_init(&g_mu); - grpc_customized_resolve_address = my_resolve_address; grpc_init(); + iomgr_resolve_address = grpc_resolve_address; + grpc_resolve_address = my_resolve_address; int was_cancelled1; int was_cancelled2;