From 9e4c8eb8e84123d275bc72f048c96cb1f8ce5acc Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Fri, 18 Nov 2016 01:06:57 -0800 Subject: [PATCH] Address review comments --- doc/environment_variables.md | 2 +- gRPC-Core.podspec | 2 +- include/grpc/impl/codegen/port_platform.h | 8 +++- .../ext/client_channel/resolver_registry.c | 8 +++- .../ext/client_channel/resolver_registry.h | 1 + .../resolver/dns/c_ares/dns_resolver_ares.c | 35 +++++++++-------- .../resolver/dns/c_ares/grpc_ares_ev_driver.h | 4 +- .../dns/c_ares/grpc_ares_ev_driver_posix.c | 7 ++-- .../resolver/dns/c_ares/grpc_ares_wrapper.c | 7 ++-- .../resolver/dns/c_ares/grpc_ares_wrapper.h | 5 +-- .../ext/resolver/dns/native/dns_resolver.c | 9 +++++ templates/gRPC-Core.podspec.template | 2 +- .../dns_resolver_connectivity_test.c | 38 +++++++++++++++---- test/core/end2end/fuzzers/api_fuzzer.c | 16 ++------ test/core/end2end/goaway_server_test.c | 28 +++++++++----- 15 files changed, 109 insertions(+), 63 deletions(-) diff --git a/doc/environment_variables.md b/doc/environment_variables.md index 11ac890cd5a..6c13015baa5 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 f261481fd4a..670df36f1db 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//` 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 29b0cb80c4e..1db69b08e25 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 94942069a11..dc8be78764c 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 2a95a669f0d..c216ae14662 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 e5691942a40..c0c1efbb863 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 +#if GRPC_ARES == 1 + #include #include @@ -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 + +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 7165df0afca..334feaa2aba 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 + #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 a4733dcb4bc..68c52e43f06 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 #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 #include #include #include @@ -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 f90222b2e6d..c8323e740a7 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 -#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 3968a445ab6..ab00a26b36a 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 7cbd6ce95cd..a3b4d5b9af9 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 d52b53dd97b..029e2c33cb0 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//` 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 57dfb5cb12e..dd7fa89d692 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 531c3980b55..746134c85be 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -39,7 +39,6 @@ #include #include -#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 7f9998f36f4..9d9092aa0c6 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;