From 8917aecf56265e09df657de79dd7ec28e704e3f6 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 9 Aug 2016 18:41:31 -0700 Subject: Fix api_fuzzer failure, add proper cleanup --- test/core/end2end/fuzzers/api_fuzzer.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'test/core/end2end/fuzzers') diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 13b8bf7561..1d47f1b2a7 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -38,6 +38,7 @@ #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" @@ -225,6 +226,14 @@ void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, finish_resolve, r, gpr_now(GPR_CLOCK_MONOTONIC)); } +grpc_ares_request *my_resolve_address_async( + grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port, + grpc_pollset_set *pollset_set, grpc_closure *on_done, + grpc_resolved_addresses **addresses) { + my_resolve_address(exec_ctx, addr, default_port, on_done, addresses); + return NULL; +} + //////////////////////////////////////////////////////////////////////////////// // client connection @@ -507,6 +516,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (squelch) gpr_set_log_function(dont_log); input_stream inp = {data, data + size}; grpc_resolve_address = my_resolve_address; + grpc_resolve_address_ares = my_resolve_address_async; grpc_tcp_client_connect_impl = my_tcp_client_connect; gpr_now_impl = now_impl; grpc_init(); -- cgit v1.2.3 From 299dd8d7471cbd72d76f514f9e7d976e84f242c0 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 16 Aug 2016 21:40:13 -0700 Subject: Disable c-ares on windows --- include/grpc/impl/codegen/port_platform.h | 6 ++++ src/core/ext/resolver/dns/c_ares/dns_resolver.c | 29 ++++++++++++----- .../ext/resolver/dns/c_ares/grpc_ares_ev_driver.h | 5 +++ .../dns/c_ares/grpc_ares_ev_driver_posix.c | 4 ++- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.c | 36 +++++++++------------- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.h | 17 +++++++--- test/core/end2end/fuzzers/api_fuzzer.c | 12 +++++--- tools/run_tests/sources_and_headers.json | 1 - vsprojects/vcxproj/ares/ares.vcxproj | 1 - vsprojects/vcxproj/ares/ares.vcxproj.filters | 3 -- 10 files changed, 69 insertions(+), 45 deletions(-) (limited to 'test/core/end2end/fuzzers') diff --git a/include/grpc/impl/codegen/port_platform.h b/include/grpc/impl/codegen/port_platform.h index 7c67bad5ae..933c4c97ae 100644 --- a/include/grpc/impl/codegen/port_platform.h +++ b/include/grpc/impl/codegen/port_platform.h @@ -431,6 +431,12 @@ typedef unsigned __int64 uint64_t; power of two */ #define GPR_MAX_ALIGNMENT 16 +#ifdef GPR_WINDOWS +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE +#define GRPC_NATIVE_ADDRESS_RESOLVE +#endif +#endif + #ifndef GRPC_MUST_USE_RESULT #ifdef __GNUC__ #define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result)) diff --git a/src/core/ext/resolver/dns/c_ares/dns_resolver.c b/src/core/ext/resolver/dns/c_ares/dns_resolver.c index 67c094db16..9f7b15335f 100644 --- a/src/core/ext/resolver/dns/c_ares/dns_resolver.c +++ b/src/core/ext/resolver/dns/c_ares/dns_resolver.c @@ -88,8 +88,6 @@ typedef struct { /** currently resolving addresses */ grpc_resolved_addresses *addresses; - grpc_ares_request *request; - grpc_polling_entity *pollent; } dns_resolver; @@ -229,19 +227,25 @@ static void dns_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver, gpr_log(GPR_ERROR, "dns_start_resolving_locked"); GRPC_RESOLVER_REF(&r->base, "dns-resolving"); GPR_ASSERT(!r->resolving); + r->resolving = 1; + r->addresses = NULL; + r->pollent = NULL; +#ifdef GRPC_NATIVE_ADDRESS_RESOLVE + grpc_resolve_address(exec_ctx, r->name, r->default_port, + grpc_closure_create(dns_on_resolved, r), + &r->addresses); +#else if (pollent) { r->pollent = pollent; grpc_polling_entity_add_to_pollset_set(exec_ctx, pollent, r->base.pollset_set); } else { gpr_log(GPR_ERROR, "pollent is NULL"); - r->pollent = NULL; } - r->resolving = 1; - r->addresses = NULL; - r->request = grpc_resolve_address_ares( + grpc_resolve_address_ares( exec_ctx, r->name, r->default_port, r->base.pollset_set, grpc_closure_create(dns_on_resolved, r), &r->addresses); +#endif } else { dns_maybe_finish_next_locked(exec_ctx, r); } @@ -255,9 +259,14 @@ static void dns_start_resolving_locked(grpc_exec_ctx *exec_ctx, GPR_ASSERT(!r->resolving); r->resolving = 1; r->addresses = NULL; - r->request = grpc_resolve_address_ares( +#ifdef GRPC_NATIVE_ADDRESS_RESOLVE + grpc_resolve_address(exec_ctx, r->name, r->default_port, + grpc_closure_create(dns_on_resolved, r), &r->addresses); +#else + grpc_resolve_address_ares( exec_ctx, r->name, r->default_port, r->base.pollset_set, grpc_closure_create(dns_on_resolved, r), &r->addresses); +#endif // grpc_resolve_address(exec_ctx, r->name, r->default_port, // grpc_closure_create(dns_on_resolved, r), &r->addresses); } @@ -279,7 +288,9 @@ static void dns_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx, static void dns_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) { dns_resolver *r = (dns_resolver *)gr; gpr_mu_destroy(&r->mu); +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE grpc_ares_cleanup(); +#endif if (r->resolved_config) { grpc_client_config_unref(exec_ctx, r->resolved_config); } @@ -294,7 +305,7 @@ static grpc_resolver *dns_create(grpc_resolver_args *args, const char *default_port, const char *lb_policy_name) { dns_resolver *r; - grpc_error *error; + grpc_error *error = GRPC_ERROR_NONE; const char *path = args->uri->path; if (0 != strcmp(args->uri->authority, "")) { @@ -302,7 +313,9 @@ static grpc_resolver *dns_create(grpc_resolver_args *args, return NULL; } +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE error = grpc_ares_init(); +#endif if (error != GRPC_ERROR_NONE) { GRPC_LOG_IF_ERROR("ares_library_init() failed", error); return NULL; 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 813d5aa6d7..25ba5e59de 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,9 @@ #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 +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE + #include #include "src/core/lib/iomgr/exec_ctx.h" @@ -51,4 +54,6 @@ grpc_error *grpc_ares_ev_driver_create(grpc_ares_ev_driver **ev_driver, grpc_pollset_set *pollset_set); void grpc_ares_ev_driver_destroy(grpc_ares_ev_driver *ev_driver); +#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ + #endif /* GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_EV_DRIVER_H */ 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 eea346e575..f7d46407b0 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 @@ -31,6 +31,7 @@ * */ #include +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE #ifdef GPR_POSIX_SOCKET #include "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h" @@ -201,4 +202,5 @@ void grpc_ares_notify_on_event(grpc_exec_ctx *exec_ctx, gpr_log(GPR_ERROR, "eof notify_on_event"); } -#endif +#endif /* GPR_POSIX_SOCKET */ +#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ 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 203c98a50e..43dbde361f 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,18 +32,10 @@ */ #include - -#ifdef GPR_POSIX_SOCKET -#include -#endif - -#ifdef GPR_WINSOCK_SOCKET -#include -#endif +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE #include "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h" -// #include "src/core/lib/iomgr/ev_posix.h" -// #include "src/core/lib/iomgr/sockaddr.h" +#include "src/core/lib/iomgr/sockaddr.h" #include #include @@ -67,7 +59,7 @@ static gpr_once g_basic_init = GPR_ONCE_INIT; static gpr_mu g_init_mu; -struct grpc_ares_request { +typedef struct grpc_ares_request { char *name; char *host; char *port; @@ -79,7 +71,7 @@ struct grpc_ares_request { void *arg; int pending_quries; grpc_ares_ev_driver *ev_driver; -}; +} grpc_ares_request; static void do_basic_init(void) { gpr_mu_init(&g_init_mu); } @@ -228,10 +220,11 @@ static int try_fake_resolve(const char *name, const char *port, return 0; } -grpc_ares_request *grpc_resolve_address_ares_impl( - grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, - grpc_pollset_set *pollset_set, grpc_closure *on_done, - grpc_resolved_addresses **addrs) { +void grpc_resolve_address_ares_impl(grpc_exec_ctx *exec_ctx, const char *name, + const char *default_port, + grpc_pollset_set *pollset_set, + grpc_closure *on_done, + grpc_resolved_addresses **addrs) { char *host; char *port; grpc_error *err; @@ -241,7 +234,7 @@ grpc_ares_request *grpc_resolve_address_ares_impl( if ((err = grpc_customized_resolve_address(name, default_port, addrs)) != GRPC_ERROR_CANCELLED) { grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL); - return NULL; + return; } if (name[0] == 'u' && name[1] == 'n' && name[2] == 'i' && name[3] == 'x' && @@ -249,7 +242,7 @@ grpc_ares_request *grpc_resolve_address_ares_impl( grpc_exec_ctx_sched(exec_ctx, on_done, grpc_resolve_unix_domain_address(name + 5, addrs), NULL); - return NULL; + return; } /* parse name, splitting it into host and port parts */ @@ -275,7 +268,7 @@ grpc_ares_request *grpc_resolve_address_ares_impl( err = grpc_ares_ev_driver_create(&ev_driver, pollset_set); if (err != GRPC_ERROR_NONE) { grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL); - return NULL; + return; } r = gpr_malloc(sizeof(grpc_ares_request)); r->ev_driver = ev_driver; @@ -293,10 +286,9 @@ grpc_ares_request *grpc_resolve_address_ares_impl( done: gpr_free(host); gpr_free(port); - return r; } -grpc_ares_request *(*grpc_resolve_address_ares)( +void (*grpc_resolve_address_ares)( grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, grpc_pollset_set *pollset_set, grpc_closure *on_done, grpc_resolved_addresses **addrs) = grpc_resolve_address_ares_impl; @@ -318,3 +310,5 @@ void grpc_ares_cleanup(void) { ares_library_cleanup(); gpr_mu_unlock(&g_init_mu); } + +#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ 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 5ff324e2b9..753eb12b96 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,21 +34,28 @@ #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 +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE + #include #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" -typedef struct grpc_ares_request grpc_ares_request; +// typedef struct grpc_ares_request grpc_ares_request; -extern grpc_ares_request *(*grpc_resolve_address_ares)( - grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port, - grpc_pollset_set *pollset_set, grpc_closure *on_done, - grpc_resolved_addresses **addresses); +extern void (*grpc_resolve_address_ares)(grpc_exec_ctx *exec_ctx, + const char *addr, + const char *default_port, + grpc_pollset_set *pollset_set, + grpc_closure *on_done, + grpc_resolved_addresses **addresses); grpc_error *grpc_ares_init(void); void grpc_ares_cleanup(void); +#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ + #endif /* GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H */ diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 5231105c54..a7f4ca55b0 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -226,12 +226,12 @@ void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, finish_resolve, r, gpr_now(GPR_CLOCK_MONOTONIC)); } -grpc_ares_request *my_resolve_address_async( - grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port, - grpc_pollset_set *pollset_set, grpc_closure *on_done, - grpc_resolved_addresses **addresses) { +void my_resolve_address_async(grpc_exec_ctx *exec_ctx, const char *addr, + const char *default_port, + grpc_pollset_set *pollset_set, + grpc_closure *on_done, + grpc_resolved_addresses **addresses) { my_resolve_address(exec_ctx, addr, default_port, on_done, addresses); - return NULL; } //////////////////////////////////////////////////////////////////////////////// @@ -516,7 +516,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (squelch) gpr_set_log_function(dont_log); input_stream inp = {data, data + size}; grpc_resolve_address = my_resolve_address; +#ifndef GRPC_NATIVE_ADDRESS_RESOLVE grpc_resolve_address_ares = my_resolve_address_async; +#endif grpc_tcp_client_connect_impl = my_tcp_client_connect; gpr_now_impl = now_impl; grpc_init(); diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index a1ab743c69..a186f55b55 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -5409,7 +5409,6 @@ "third_party/c-ares/ares_strdup.h", "third_party/c-ares/ares_version.h", "third_party/c-ares/bitncmp.h", - "third_party/c-ares/selectbridge.h", "third_party/c-ares/setup_once.h" ], "language": "c", diff --git a/vsprojects/vcxproj/ares/ares.vcxproj b/vsprojects/vcxproj/ares/ares.vcxproj index d6ad8edf28..eb2f369d83 100644 --- a/vsprojects/vcxproj/ares/ares.vcxproj +++ b/vsprojects/vcxproj/ares/ares.vcxproj @@ -166,7 +166,6 @@ - diff --git a/vsprojects/vcxproj/ares/ares.vcxproj.filters b/vsprojects/vcxproj/ares/ares.vcxproj.filters index e935e211fe..b733289163 100644 --- a/vsprojects/vcxproj/ares/ares.vcxproj.filters +++ b/vsprojects/vcxproj/ares/ares.vcxproj.filters @@ -207,9 +207,6 @@ third_party\c-ares - - third_party\c-ares - third_party\c-ares -- cgit v1.2.3 From dcd78be8c32f9f241cda97a0339f401feea7ae7f Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Fri, 19 Aug 2016 11:12:54 -0700 Subject: Remove improper ifdef --- BUILD | 3 ++ CMakeLists.txt | 2 + Makefile | 2 + binding.gyp | 1 + build.yaml | 1 + config.m4 | 1 + gRPC-Core.podspec | 1 + grpc.gemspec | 1 + package.xml | 1 + .../ext/resolver/dns/c_ares/dns_resolver_ares.c | 8 +-- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.c | 4 +- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.h | 7 +-- .../dns/c_ares/grpc_ares_wrapper_fallback.c | 60 ++++++++++++++++++++++ .../security/credentials/fake/fake_credentials.c | 1 + .../security/credentials/fake/fake_credentials.h | 2 - src/python/grpcio/grpc_core_dependencies.py | 1 + test/core/end2end/fuzzers/api_fuzzer.c | 2 - tools/doxygen/Doxyfile.core.internal | 1 + tools/run_tests/sources_and_headers.json | 3 +- vsprojects/vcxproj/grpc/grpc.vcxproj | 2 + vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 3 ++ .../vcxproj/grpc_unsecure/grpc_unsecure.vcxproj | 2 + .../grpc_unsecure/grpc_unsecure.vcxproj.filters | 3 ++ 23 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c (limited to 'test/core/end2end/fuzzers') diff --git a/BUILD b/BUILD index 5379cc9503..c4694deb4c 100644 --- a/BUILD +++ b/BUILD @@ -489,6 +489,7 @@ cc_library( "src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c", "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c", "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c", + "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c", "src/core/ext/resolver/dns/native/dns_resolver.c", "src/core/ext/resolver/sockaddr/sockaddr_resolver.c", "src/core/ext/load_reporting/load_reporting.c", @@ -1185,6 +1186,7 @@ cc_library( "src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c", "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c", "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c", + "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c", "src/core/ext/resolver/dns/native/dns_resolver.c", "src/core/ext/resolver/sockaddr/sockaddr_resolver.c", "src/core/ext/load_reporting/load_reporting.c", @@ -1990,6 +1992,7 @@ objc_library( "src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c", "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c", "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c", + "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c", "src/core/ext/resolver/dns/native/dns_resolver.c", "src/core/ext/resolver/sockaddr/sockaddr_resolver.c", "src/core/ext/load_reporting/load_reporting.c", diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c4b0f50e1..0fc980debd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -453,6 +453,7 @@ add_library(grpc src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c + src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c src/core/ext/resolver/dns/native/dns_resolver.c src/core/ext/resolver/sockaddr/sockaddr_resolver.c src/core/ext/load_reporting/load_reporting.c @@ -904,6 +905,7 @@ add_library(grpc_unsecure src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c + src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c src/core/ext/resolver/dns/native/dns_resolver.c src/core/ext/resolver/sockaddr/sockaddr_resolver.c src/core/ext/load_reporting/load_reporting.c diff --git a/Makefile b/Makefile index 822138daf3..ad290a998e 100644 --- a/Makefile +++ b/Makefile @@ -2756,6 +2756,7 @@ LIBGRPC_SRC = \ src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c \ + src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c \ src/core/ext/resolver/dns/native/dns_resolver.c \ src/core/ext/resolver/sockaddr/sockaddr_resolver.c \ src/core/ext/load_reporting/load_reporting.c \ @@ -3455,6 +3456,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c \ + src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c \ src/core/ext/resolver/dns/native/dns_resolver.c \ src/core/ext/resolver/sockaddr/sockaddr_resolver.c \ src/core/ext/load_reporting/load_reporting.c \ diff --git a/binding.gyp b/binding.gyp index 4046226f87..6c6b3cfc79 100644 --- a/binding.gyp +++ b/binding.gyp @@ -742,6 +742,7 @@ 'src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c', 'src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c', 'src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c', + 'src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c', 'src/core/ext/resolver/dns/native/dns_resolver.c', 'src/core/ext/resolver/sockaddr/sockaddr_resolver.c', 'src/core/ext/load_reporting/load_reporting.c', diff --git a/build.yaml b/build.yaml index 6af423bfb6..6513bd39a8 100644 --- a/build.yaml +++ b/build.yaml @@ -426,6 +426,7 @@ filegroups: - src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c - src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c - src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c + - src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c plugin: grpc_resolver_dns_ares uses: - grpc_base diff --git a/config.m4 b/config.m4 index 86e6aa88c2..dbab8258b5 100644 --- a/config.m4 +++ b/config.m4 @@ -257,6 +257,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c \ + src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c \ src/core/ext/resolver/dns/native/dns_resolver.c \ src/core/ext/resolver/sockaddr/sockaddr_resolver.c \ src/core/ext/load_reporting/load_reporting.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 32b42b9520..a46aa46cb8 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -589,6 +589,7 @@ Pod::Spec.new do |s| 'src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c', 'src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c', 'src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c', + 'src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c', 'src/core/ext/resolver/dns/native/dns_resolver.c', 'src/core/ext/resolver/sockaddr/sockaddr_resolver.c', 'src/core/ext/load_reporting/load_reporting.c', diff --git a/grpc.gemspec b/grpc.gemspec index 7ac2599934..a3acc3d460 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -508,6 +508,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c ) s.files += %w( src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c ) s.files += %w( src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c ) + s.files += %w( src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c ) s.files += %w( src/core/ext/resolver/dns/native/dns_resolver.c ) s.files += %w( src/core/ext/resolver/sockaddr/sockaddr_resolver.c ) s.files += %w( src/core/ext/load_reporting/load_reporting.c ) diff --git a/package.xml b/package.xml index 9ef4e940e3..1c38772161 100644 --- a/package.xml +++ b/package.xml @@ -516,6 +516,7 @@ + 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 9f7b15335f..ae358149a0 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 @@ -230,12 +230,7 @@ static void dns_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver, r->resolving = 1; r->addresses = NULL; r->pollent = NULL; -#ifdef GRPC_NATIVE_ADDRESS_RESOLVE - grpc_resolve_address(exec_ctx, r->name, r->default_port, - grpc_closure_create(dns_on_resolved, r), - &r->addresses); -#else - if (pollent) { + if (grpc_ares_need_poll_entity() && pollent) { r->pollent = pollent; grpc_polling_entity_add_to_pollset_set(exec_ctx, pollent, r->base.pollset_set); @@ -245,7 +240,6 @@ static void dns_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver, grpc_resolve_address_ares( exec_ctx, r->name, r->default_port, r->base.pollset_set, grpc_closure_create(dns_on_resolved, r), &r->addresses); -#endif } else { dns_maybe_finish_next_locked(exec_ctx, r); } 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 cec4daab2f..3d5eab0b4e 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 @@ -80,8 +80,6 @@ static void do_basic_init(void) { gpr_mu_init(&g_init_mu); } static void destroy_request(grpc_ares_request *request) { grpc_ares_ev_driver_destroy(request->ev_driver); - // ares_cancel(request->channel); - // ares_destroy(request->channel); gpr_free(request->name); gpr_free(request->host); gpr_free(request->port); @@ -318,4 +316,6 @@ void grpc_ares_cleanup(void) { gpr_mu_unlock(&g_init_mu); } +int grpc_ares_need_poll_entity(void) { return 1; } + #endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ 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 753eb12b96..8fe3376aed 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 @@ -35,16 +35,12 @@ #define GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H #include -#ifndef GRPC_NATIVE_ADDRESS_RESOLVE -#include #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" -// typedef struct grpc_ares_request grpc_ares_request; - extern void (*grpc_resolve_address_ares)(grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port, @@ -56,6 +52,7 @@ grpc_error *grpc_ares_init(void); void grpc_ares_cleanup(void); -#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ +/* TODO(zyc): remove this temporary hack after we can build c-ares on windows */ +int grpc_ares_need_poll_entity(void); #endif /* GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H */ diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c new file mode 100644 index 0000000000..77c5044dae --- /dev/null +++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c @@ -0,0 +1,60 @@ +/* + * + * Copyright 2016, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* TODO(zyc): remove this fallback after we can build c-ares on windows */ + +#include +#ifdef GRPC_NATIVE_ADDRESS_RESOLVE + +#include "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h" + +void grpc_resolve_address_ares_impl(grpc_exec_ctx *exec_ctx, const char *name, + const char *default_port, + grpc_pollset_set *pollset_set, + grpc_closure *on_done, + grpc_resolved_addresses **addrs) { + grpc_resolve_address(exec_ctx, name, default_port, on_done, addrs); +} + +void (*grpc_resolve_address_ares)( + grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, + grpc_pollset_set *pollset_set, grpc_closure *on_done, + grpc_resolved_addresses **addrs) = grpc_resolve_address_ares_impl; + +grpc_error *grpc_ares_init(void) { return GRPC_ERROR_NONE; } + +void grpc_ares_cleanup(void) {} + +int grpc_ares_need_poll_entity(void) { return 0; } + +#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ diff --git a/src/core/lib/security/credentials/fake/fake_credentials.c b/src/core/lib/security/credentials/fake/fake_credentials.c index 93c25a6196..cefc8d55a7 100644 --- a/src/core/lib/security/credentials/fake/fake_credentials.c +++ b/src/core/lib/security/credentials/fake/fake_credentials.c @@ -37,6 +37,7 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/iomgr/executor.h" +#include "src/core/lib/iomgr/timer.h" #include #include diff --git a/src/core/lib/security/credentials/fake/fake_credentials.h b/src/core/lib/security/credentials/fake/fake_credentials.h index 15e5cd5e57..9cf38084a3 100644 --- a/src/core/lib/security/credentials/fake/fake_credentials.h +++ b/src/core/lib/security/credentials/fake/fake_credentials.h @@ -34,7 +34,6 @@ #ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_FAKE_FAKE_CREDENTIALS_H #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_FAKE_FAKE_CREDENTIALS_H -#include "src/core/lib/iomgr/timer.h" #include "src/core/lib/security/credentials/credentials.h" /* -- Fake transport security credentials. -- */ @@ -51,7 +50,6 @@ grpc_server_credentials *grpc_fake_transport_security_server_credentials_create( typedef struct { grpc_call_credentials base; grpc_credentials_md_store *md_store; - grpc_timer timer; int is_async; } grpc_md_only_test_credentials; diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 1d31433193..037c50d0d3 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -251,6 +251,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c', 'src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c', 'src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c', + 'src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c', 'src/core/ext/resolver/dns/native/dns_resolver.c', 'src/core/ext/resolver/sockaddr/sockaddr_resolver.c', 'src/core/ext/load_reporting/load_reporting.c', diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index a7f4ca55b0..303a15c756 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -516,9 +516,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (squelch) gpr_set_log_function(dont_log); input_stream inp = {data, data + size}; grpc_resolve_address = my_resolve_address; -#ifndef GRPC_NATIVE_ADDRESS_RESOLVE grpc_resolve_address_ares = my_resolve_address_async; -#endif grpc_tcp_client_connect_impl = my_tcp_client_connect; gpr_now_impl = now_impl; grpc_init(); diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index fd5c963ee0..0121f81d28 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1127,6 +1127,7 @@ src/core/ext/lb_policy/round_robin/round_robin.c \ src/core/ext/resolver/dns/c_ares/dns_resolver_ares.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c \ src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c \ +src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c \ src/core/ext/resolver/dns/native/dns_resolver.c \ src/core/ext/resolver/sockaddr/sockaddr_resolver.c \ src/core/ext/load_reporting/load_reporting.c \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 80c67e4cb4..783da22ff2 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -6303,7 +6303,8 @@ "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h", "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c", "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c", - "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h" + "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h", + "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c" ], "third_party": false, "type": "filegroup" diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index f16e284503..4ac594b7cd 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -814,6 +814,8 @@ + + diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index 6d9c88ef5f..4d26f78d38 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -529,6 +529,9 @@ src\core\ext\resolver\dns\c_ares + + src\core\ext\resolver\dns\c_ares + src\core\ext\resolver\dns\native diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index f9f6550bc4..575214ded7 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -705,6 +705,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index 9a23008e24..a35b971027 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -418,6 +418,9 @@ src\core\ext\resolver\dns\c_ares + + src\core\ext\resolver\dns\c_ares + src\core\ext\resolver\dns\native -- cgit v1.2.3 From e8d830930182f52c5381117746395b303099b5c2 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Thu, 27 Oct 2016 17:30:17 -0700 Subject: Refactor grpc_ares_ev_driver --- .../ext/resolver/dns/c_ares/dns_resolver_ares.c | 31 ++- .../ext/resolver/dns/c_ares/grpc_ares_ev_driver.h | 19 +- .../dns/c_ares/grpc_ares_ev_driver_posix.c | 268 ++++++++++++++------- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.c | 19 +- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.h | 3 +- test/core/end2end/fuzzers/api_fuzzer.c | 2 +- 6 files changed, 227 insertions(+), 115 deletions(-) (limited to 'test/core/end2end/fuzzers') 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 7b46ba5366..4695ba061c 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 @@ -41,6 +41,7 @@ #include "src/core/ext/client_channel/http_connect_handshaker.h" #include "src/core/ext/client_channel/lb_policy_registry.h" #include "src/core/ext/client_channel/resolver_registry.h" +#include "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h" #include "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" @@ -84,6 +85,8 @@ typedef struct { /** currently resolving addresses */ grpc_resolved_addresses *addresses; + + grpc_ares_ev_driver *ev_driver; } ares_dns_resolver; static void dns_ares_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *r); @@ -198,18 +201,20 @@ static void dns_ares_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver, grpc_closure *on_complete) { ares_dns_resolver *r = (ares_dns_resolver *)resolver; gpr_mu_lock(&r->mu); + gpr_log(GPR_DEBUG, "dns_ares_next is called."); GPR_ASSERT(!r->next_completion); r->next_completion = on_complete; r->target_result = target_result; if (r->resolved_version == 0 && !r->resolving) { gpr_backoff_reset(&r->backoff_state); - GRPC_RESOLVER_REF(&r->base, "dns-resolving"); - GPR_ASSERT(!r->resolving); - r->resolving = true; - r->addresses = NULL; - grpc_resolve_address_ares( - exec_ctx, r->name_to_resolve, r->default_port, r->base.pollset_set, - grpc_closure_create(dns_ares_on_resolved, r), &r->addresses); + dns_ares_start_resolving_locked(exec_ctx, r); + // GRPC_RESOLVER_REF(&r->base, "dns-resolving"); + // GPR_ASSERT(!r->resolving); + // r->resolving = true; + // r->addresses = NULL; + // grpc_resolve_address_ares( + // exec_ctx, r->name_to_resolve, r->default_port, r->ev_driver, + // grpc_closure_create(dns_ares_on_resolved, r), &r->addresses); } else { dns_ares_maybe_finish_next_locked(exec_ctx, r); } @@ -223,7 +228,7 @@ static void dns_ares_start_resolving_locked(grpc_exec_ctx *exec_ctx, r->resolving = true; r->addresses = NULL; grpc_resolve_address_ares( - exec_ctx, r->name_to_resolve, r->default_port, r->base.pollset_set, + exec_ctx, r->name_to_resolve, r->default_port, r->ev_driver, grpc_closure_create(dns_ares_on_resolved, r), &r->addresses); } @@ -242,7 +247,9 @@ static void dns_ares_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx, } 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_ares_ev_driver_destroy(exec_ctx, r->ev_driver); gpr_mu_destroy(&r->mu); grpc_ares_cleanup(); if (r->resolved_result) { @@ -280,8 +287,14 @@ static grpc_resolver *dns_ares_create(grpc_resolver_args *args, // Create resolver. r = gpr_malloc(sizeof(ares_dns_resolver)); memset(r, 0, sizeof(*r)); - gpr_mu_init(&r->mu); grpc_resolver_init(&r->base, &dns_ares_resolver_vtable); + error = grpc_ares_ev_driver_create(&r->ev_driver, r->base.pollset_set); + if (error != GRPC_ERROR_NONE) { + GRPC_LOG_IF_ERROR("grpc_ares_ev_driver_create() failed", error); + gpr_free(r); + return NULL; + } + gpr_mu_init(&r->mu); r->target_name = gpr_strdup(path); r->name_to_resolve = proxy_name == NULL ? gpr_strdup(path) : proxy_name; r->default_port = gpr_strdup(default_port); 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 f3eedb5f95..4d2b451321 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 @@ -37,8 +37,6 @@ #include #ifndef GRPC_NATIVE_ADDRESS_RESOLVE -#include - #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/pollset_set.h" @@ -50,20 +48,21 @@ typedef struct grpc_ares_ev_driver grpc_ares_ev_driver; void grpc_ares_ev_driver_start(grpc_exec_ctx *exec_ctx, grpc_ares_ev_driver *ev_driver); -/* 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. */ -ares_channel *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver); +/* Returns a pointer of ares_channel. This channel is owned by \a ev_driver. To + bind a c-ares query to\a ev_driver, use this channel as the arg of the query. + */ +void *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. */ grpc_error *grpc_ares_ev_driver_create(grpc_ares_ev_driver **ev_driver, grpc_pollset_set *pollset_set); -/* Destroys \a ev_driver asynchronously. If \a ev_driver is already working, - destroys it immediately; otherwise, destroys it once - grpc_ares_ev_driver_start() is called */ -void grpc_ares_ev_driver_destroy(grpc_ares_ev_driver *ev_driver); +/* Destroys \a ev_driver asynchronously. Pending lookups lookups made on this + ev_driver will be cancelled and their on done callbacks will be invoked with + a status of ARES_ECANCELLED. */ +void grpc_ares_ev_driver_destroy(grpc_exec_ctx *exec_ctx, + grpc_ares_ev_driver *ev_driver); #endif /* GRPC_NATIVE_ADDRESS_RESOLVE */ 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 302a103703..8266da2759 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 @@ -45,6 +45,7 @@ #include #include #include +#include "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" @@ -52,48 +53,82 @@ #include "src/core/lib/support/string.h" typedef struct fd_node { + /** the owner of this fd node */ + grpc_ares_ev_driver *ev_driver; + /** refcount of the node */ + gpr_refcount refs; + /** the grpc_fd owned by this fd node */ grpc_fd *grpc_fd; + /** a closure wrapping on_readable_cb, which should be invoked when the + grpc_fd in this node becomes readable. */ + grpc_closure read_closure; + /** a closure wrapping on_writable_cb, which should be invoked when the + grpc_fd in this node becomes writable. */ + grpc_closure write_closure; + /** next fd node in the list */ struct fd_node *next; + + /** mutex guarding the rest of the state */ + gpr_mu mu; + /** if the readable closure has been registered */ + bool readable_registered; + /** if the writable closure has been registered */ + bool writable_registered; } fd_node; struct grpc_ares_ev_driver { /** the ares_channel owned by this event driver */ ares_channel channel; - /** a closure wrapping the driver_cb, which should be invoked each time the ev - driver gets notified by fds. */ - grpc_closure driver_closure; /** pollset set for driving the IO events of the channel */ grpc_pollset_set *pollset_set; - /** has grpc_ares_ev_driver_destroy been called on this event driver? */ - bool closing; - /** an array of ares sockets that the ares channel owned by this event driver - is currently using */ - ares_socket_t socks[ARES_GETSOCK_MAXNUM]; - /** a bitmask that can tell if an ares socket in the socks array is readable - or/and writable */ - int socks_bitmask; - /** a list of grpc_fd that this event driver is currently using. */ - fd_node *fds; /** mutex guarding the rest of the state */ gpr_mu mu; + /** a list of grpc_fd that this event driver is currently using. */ + fd_node *fds; /** is this event driver currently working? */ bool working; }; -static void grpc_ares_notify_on_event(grpc_exec_ctx *exec_ctx, - grpc_ares_ev_driver *ev_driver); +static void grpc_ares_notify_on_event_locked(grpc_exec_ctx *exec_ctx, + grpc_ares_ev_driver *ev_driver); + +static fd_node *fd_node_ref(fd_node *fdn) { + gpr_log(GPR_DEBUG, "ref %d", grpc_fd_wrapped_fd(fdn->grpc_fd)); + gpr_ref(&fdn->refs); + return fdn; +} + +static void fd_node_unref(grpc_exec_ctx *exec_ctx, fd_node *fdn) { + gpr_log(GPR_DEBUG, "unref %d", grpc_fd_wrapped_fd(fdn->grpc_fd)); + if (gpr_unref(&fdn->refs)) { + gpr_log(GPR_DEBUG, "delete fd: %d", grpc_fd_wrapped_fd(fdn->grpc_fd)); + GPR_ASSERT(!fdn->readable_registered); + GPR_ASSERT(!fdn->writable_registered); + gpr_mu_destroy(&fdn->mu); + grpc_pollset_set_del_fd(exec_ctx, fdn->ev_driver->pollset_set, + fdn->grpc_fd); + grpc_fd_shutdown(exec_ctx, fdn->grpc_fd); + grpc_fd_orphan(exec_ctx, fdn->grpc_fd, NULL, NULL, "c-ares query finished"); + gpr_free(fdn); + } +} grpc_error *grpc_ares_ev_driver_create(grpc_ares_ev_driver **ev_driver, grpc_pollset_set *pollset_set) { int status; + grpc_error *err = grpc_ares_init(); + if (err != GRPC_ERROR_NONE) { + return err; + } *ev_driver = gpr_malloc(sizeof(grpc_ares_ev_driver)); status = ares_init(&(*ev_driver)->channel); + gpr_log(GPR_DEBUG, "grpc_ares_ev_driver_create\n"); if (status != ARES_SUCCESS) { char *err_msg; gpr_asprintf(&err_msg, "Failed to init ares channel. C-ares error: %s", ares_strerror(status)); - grpc_error *err = GRPC_ERROR_CREATE(err_msg); + err = GRPC_ERROR_CREATE(err_msg); gpr_free(err_msg); gpr_free(*ev_driver); return err; @@ -101,17 +136,43 @@ grpc_error *grpc_ares_ev_driver_create(grpc_ares_ev_driver **ev_driver, gpr_mu_init(&(*ev_driver)->mu); (*ev_driver)->pollset_set = pollset_set; (*ev_driver)->fds = NULL; - (*ev_driver)->closing = false; (*ev_driver)->working = false; return GRPC_ERROR_NONE; } -void grpc_ares_ev_driver_destroy(grpc_ares_ev_driver *ev_driver) { - ev_driver->closing = true; +static void grpc_ares_ev_driver_cleanup(grpc_exec_ctx *exec_ctx, void *arg, + grpc_error *error) { + GPR_ASSERT(error == GRPC_ERROR_NONE); + grpc_ares_ev_driver *ev_driver = arg; + GPR_ASSERT(ev_driver->fds == NULL); + gpr_mu_lock(&ev_driver->mu); + gpr_mu_unlock(&ev_driver->mu); + gpr_mu_destroy(&ev_driver->mu); + ares_destroy(ev_driver->channel); + gpr_free(ev_driver); + grpc_ares_cleanup(); +} + +void grpc_ares_ev_driver_destroy(grpc_exec_ctx *exec_ctx, + grpc_ares_ev_driver *ev_driver) { + // Shutdowe all the working fds, invoke their resgistered on_readable_cb and + // on_writable_cb. + gpr_mu_lock(&ev_driver->mu); + fd_node *fdn; + for (fdn = ev_driver->fds; fdn; fdn = fdn->next) { + grpc_fd_shutdown(exec_ctx, fdn->grpc_fd); + fdn = fdn->next; + } + gpr_mu_unlock(&ev_driver->mu); + // Schedule the actual cleanup with exec_ctx, so that it happens after the + // fd shutdown process. + grpc_exec_ctx_sched( + exec_ctx, grpc_closure_create(grpc_ares_ev_driver_cleanup, ev_driver), + GRPC_ERROR_NONE, NULL); } // Search fd in the fd_node list head. This is an O(n) search, the max possible -// value of n is ARES_GETSOCK_MAXNUM (16). n is typically 1 - 3 in our tests. +// value of n is ARES_GETSOCK_MAXNUM (16). n is typically 1 - 2 in our tests. static fd_node *get_fd(fd_node **head, int fd) { fd_node dummy_head; fd_node *node; @@ -131,93 +192,132 @@ static fd_node *get_fd(fd_node **head, int fd) { return NULL; } -// Process each file descriptor that may wake this callback up. -static void driver_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { - grpc_ares_ev_driver *d = arg; - size_t i; +static void on_readable_cb(grpc_exec_ctx *exec_ctx, void *arg, + grpc_error *error) { + fd_node *fdn = arg; + grpc_ares_ev_driver *ev_driver = fdn->ev_driver; + gpr_mu_lock(&fdn->mu); + fdn->readable_registered = false; + gpr_mu_unlock(&fdn->mu); + gpr_log(GPR_DEBUG, "readable on %d", grpc_fd_wrapped_fd(fdn->grpc_fd)); if (error == GRPC_ERROR_NONE) { - for (i = 0; i < ARES_GETSOCK_MAXNUM; i++) { - ares_socket_t read_fd = ARES_GETSOCK_READABLE(d->socks_bitmask, i) - ? d->socks[i] - : ARES_SOCKET_BAD; - ares_socket_t write_fd = ARES_GETSOCK_WRITABLE(d->socks_bitmask, i) - ? d->socks[i] - : ARES_SOCKET_BAD; - ares_process_fd(d->channel, read_fd, write_fd); - } + ares_process_fd(ev_driver->channel, grpc_fd_wrapped_fd(fdn->grpc_fd), + ARES_SOCKET_BAD); } else { - // error != GRPC_ERROR_NONE means the waiting timed out or the fd has been - // shutdown. In this case, the event driver cancels all the ongoing requests - // that are using its channel. The fds get cleaned up in the next - // grpc_ares_notify_on_event. - ares_cancel(d->channel); + // If error is not GRPC_ERROR_NONE, it means the fd has been shutdown or + // timed out. The pending lookups made on this ev_driver will be cancelled + // by the following ares_canncel() and the on done callbacks will be invoked + // with a status of ARES_ECANCELLED. The remaining file descriptors in this + // ev_driver will be cleaned up in the follwing + // grpc_ares_notify_on_event_locked(). + ares_cancel(ev_driver->channel); } - grpc_ares_notify_on_event(exec_ctx, d); + fd_node_unref(exec_ctx, fdn); + gpr_mu_lock(&ev_driver->mu); + grpc_ares_notify_on_event_locked(exec_ctx, ev_driver); + gpr_mu_unlock(&ev_driver->mu); +} + +static void on_writable_cb(grpc_exec_ctx *exec_ctx, void *arg, + grpc_error *error) { + fd_node *fdn = arg; + grpc_ares_ev_driver *ev_driver = fdn->ev_driver; + gpr_mu_lock(&fdn->mu); + fdn->writable_registered = false; + gpr_mu_unlock(&fdn->mu); + + gpr_log(GPR_DEBUG, "writable on %d", grpc_fd_wrapped_fd(fdn->grpc_fd)); + if (error == GRPC_ERROR_NONE) { + ares_process_fd(ev_driver->channel, ARES_SOCKET_BAD, + grpc_fd_wrapped_fd(fdn->grpc_fd)); + } else { + // If error is not GRPC_ERROR_NONE, it means the fd has been shutdown or + // timed out. The pending lookups made on this ev_driver will be cancelled + // by the following ares_canncel() and the on done callbacks will be invoked + // with a status of ARES_ECANCELLED. The remaining file descriptors in this + // ev_driver will be cleaned up in the follwing + // grpc_ares_notify_on_event_locked(). + ares_cancel(ev_driver->channel); + } + fd_node_unref(exec_ctx, fdn); + gpr_mu_lock(&ev_driver->mu); + grpc_ares_notify_on_event_locked(exec_ctx, ev_driver); + gpr_mu_unlock(&ev_driver->mu); } -ares_channel *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver) { +void *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver) { return &ev_driver->channel; } // Get the file descriptors used by the ev_driver's ares channel, register // driver_closure with these filedescriptors. -static void grpc_ares_notify_on_event(grpc_exec_ctx *exec_ctx, - grpc_ares_ev_driver *ev_driver) { - size_t i; +static void grpc_ares_notify_on_event_locked(grpc_exec_ctx *exec_ctx, + grpc_ares_ev_driver *ev_driver) { fd_node *new_list = NULL; - if (!ev_driver->closing) { - ev_driver->socks_bitmask = - ares_getsock(ev_driver->channel, ev_driver->socks, ARES_GETSOCK_MAXNUM); - grpc_closure_init(&ev_driver->driver_closure, driver_cb, ev_driver); - for (i = 0; i < ARES_GETSOCK_MAXNUM; i++) { - if (ARES_GETSOCK_READABLE(ev_driver->socks_bitmask, i) || - ARES_GETSOCK_WRITABLE(ev_driver->socks_bitmask, i)) { - fd_node *fdn = get_fd(&ev_driver->fds, ev_driver->socks[i]); - if (fdn == NULL) { - char *fd_name; - gpr_asprintf(&fd_name, "ares_ev_driver-%" PRIuPTR, i); - fdn = gpr_malloc(sizeof(fd_node)); - fdn->grpc_fd = grpc_fd_create(ev_driver->socks[i], fd_name); - grpc_pollset_set_add_fd(exec_ctx, ev_driver->pollset_set, - fdn->grpc_fd); - gpr_free(fd_name); - } - fdn->next = new_list; - new_list = fdn; - - if (ARES_GETSOCK_READABLE(ev_driver->socks_bitmask, i)) { - grpc_fd_notify_on_read(exec_ctx, fdn->grpc_fd, - &ev_driver->driver_closure); - } - if (ARES_GETSOCK_WRITABLE(ev_driver->socks_bitmask, i)) { - grpc_fd_notify_on_write(exec_ctx, fdn->grpc_fd, - &ev_driver->driver_closure); - } + gpr_log(GPR_DEBUG, "notify_on_event\n"); + ares_socket_t socks[ARES_GETSOCK_MAXNUM]; + int socks_bitmask = + ares_getsock(ev_driver->channel, socks, ARES_GETSOCK_MAXNUM); + size_t i; + for (i = 0; i < ARES_GETSOCK_MAXNUM; i++) { + if (ARES_GETSOCK_READABLE(socks_bitmask, i) || + ARES_GETSOCK_WRITABLE(socks_bitmask, i)) { + fd_node *fdn = get_fd(&ev_driver->fds, socks[i]); + // Create a new fd_node if sock[i] is not in the fd_node list. + if (fdn == NULL) { + char *fd_name; + gpr_asprintf(&fd_name, "ares_ev_driver-%" PRIuPTR, i); + fdn = gpr_malloc(sizeof(fd_node)); + gpr_log(GPR_DEBUG, "new fd: %d", socks[i]); + fdn->grpc_fd = grpc_fd_create(socks[i], fd_name); + fdn->ev_driver = ev_driver; + fdn->readable_registered = false; + fdn->writable_registered = false; + gpr_mu_init(&fdn->mu); + gpr_ref_init(&fdn->refs, 1); + grpc_closure_init(&fdn->read_closure, on_readable_cb, fdn); + grpc_closure_init(&fdn->write_closure, on_writable_cb, fdn); + grpc_pollset_set_add_fd(exec_ctx, ev_driver->pollset_set, fdn->grpc_fd); + gpr_free(fd_name); + } + fdn->next = new_list; + new_list = fdn; + gpr_mu_lock(&fdn->mu); + // Register read_closure if the socket is readable and read_closure has + // not been registered with this socket. + if (ARES_GETSOCK_READABLE(socks_bitmask, i) && + !fdn->readable_registered) { + fd_node_ref(fdn); + gpr_log(GPR_DEBUG, "notify read on: %d", + grpc_fd_wrapped_fd(fdn->grpc_fd)); + grpc_fd_notify_on_read(exec_ctx, fdn->grpc_fd, &fdn->read_closure); + fdn->readable_registered = true; + } + // Register write_closure if the socket is writable and write_closure has + // not been registered with this socket. + if (ARES_GETSOCK_WRITABLE(socks_bitmask, i) && + !fdn->writable_registered) { + gpr_log(GPR_DEBUG, "notify write on: %d", + grpc_fd_wrapped_fd(fdn->grpc_fd)); + fd_node_ref(fdn); + grpc_fd_notify_on_write(exec_ctx, fdn->grpc_fd, &fdn->write_closure); + fdn->writable_registered = true; } + gpr_mu_unlock(&fdn->mu); } } - while (ev_driver->fds != NULL) { fd_node *cur = ev_driver->fds; ev_driver->fds = ev_driver->fds->next; - grpc_pollset_set_del_fd(exec_ctx, ev_driver->pollset_set, cur->grpc_fd); grpc_fd_shutdown(exec_ctx, cur->grpc_fd); - grpc_fd_orphan(exec_ctx, cur->grpc_fd, NULL, NULL, "c-ares query finished"); - gpr_free(cur); + fd_node_unref(exec_ctx, cur); } - ev_driver->fds = new_list; // If the ev driver has no working fd, all the tasks are done. if (!new_list) { - gpr_mu_lock(&ev_driver->mu); ev_driver->working = false; - gpr_mu_unlock(&ev_driver->mu); - } - - if (ev_driver->closing) { - ares_destroy(ev_driver->channel); - gpr_free(ev_driver); + gpr_log(GPR_DEBUG, "ev driver stop working"); } } @@ -229,8 +329,8 @@ void grpc_ares_ev_driver_start(grpc_exec_ctx *exec_ctx, return; } ev_driver->working = true; + grpc_ares_notify_on_event_locked(exec_ctx, ev_driver); gpr_mu_unlock(&ev_driver->mu); - grpc_ares_notify_on_event(exec_ctx, ev_driver); } #endif /* GPR_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 86037cd598..408c5d89d7 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 @@ -92,7 +92,6 @@ typedef struct grpc_ares_request { static void do_basic_init(void) { gpr_mu_init(&g_init_mu); } static void destroy_request(grpc_ares_request *request) { - grpc_ares_ev_driver_destroy(request->ev_driver); gpr_free(request->host); gpr_free(request->port); gpr_free(request->default_port); @@ -112,6 +111,7 @@ static void on_done_cb(void *arg, int status, int timeouts, grpc_ares_request *r = (grpc_ares_request *)arg; grpc_resolved_addresses **addresses = r->addrs_out; if (status == ARES_SUCCESS) { + gpr_log(GPR_DEBUG, "on_done_cb success"); GRPC_ERROR_UNREF(r->error); r->error = GRPC_ERROR_NONE; r->success = true; @@ -175,7 +175,9 @@ static void on_done_cb(void *arg, int status, int timeouts, r->error = grpc_error_add_child(error, r->error); } } + gpr_log(GPR_DEBUG, "update pending queries: %d", r->pending_queries); if (--r->pending_queries == 0) { + gpr_log(GPR_DEBUG, "finish"); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; grpc_exec_ctx_sched(&exec_ctx, r->on_done, r->error, NULL); grpc_exec_ctx_flush(&exec_ctx); @@ -189,12 +191,14 @@ static void request_resolving_address(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { grpc_ares_request *r = (grpc_ares_request *)arg; grpc_ares_ev_driver *ev_driver = r->ev_driver; - ares_channel *channel = grpc_ares_ev_driver_get_channel(ev_driver); + ares_channel *channel = + (ares_channel *)grpc_ares_ev_driver_get_channel(ev_driver); r->pending_queries = 1; if (grpc_ipv6_loopback_available()) { ++r->pending_queries; ares_gethostbyname(*channel, r->host, AF_INET6, on_done_cb, r); } + gpr_log(GPR_DEBUG, "pending queries: %d", r->pending_queries); ares_gethostbyname(*channel, r->host, AF_INET, on_done_cb, r); grpc_ares_ev_driver_start(exec_ctx, ev_driver); } @@ -232,14 +236,13 @@ static int try_sockaddr_resolve(const char *name, const char *port, void grpc_resolve_address_ares_impl(grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, - grpc_pollset_set *pollset_set, + grpc_ares_ev_driver *ev_driver, grpc_closure *on_done, grpc_resolved_addresses **addrs) { char *host; char *port; grpc_error *err; grpc_ares_request *r = NULL; - grpc_ares_ev_driver *ev_driver; if (grpc_customized_resolve_address(name, default_port, addrs, &err) != 0) { grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL); @@ -268,11 +271,7 @@ void grpc_resolve_address_ares_impl(grpc_exec_ctx *exec_ctx, const char *name, if (try_sockaddr_resolve(host, port, addrs)) { grpc_exec_ctx_sched(exec_ctx, on_done, GRPC_ERROR_NONE, NULL); } else { - err = grpc_ares_ev_driver_create(&ev_driver, pollset_set); - if (err != GRPC_ERROR_NONE) { - grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL); - goto done; - } + gpr_log(GPR_DEBUG, "%s", host); r = gpr_malloc(sizeof(grpc_ares_request)); r->ev_driver = ev_driver; r->on_done = on_done; @@ -294,7 +293,7 @@ done: void (*grpc_resolve_address_ares)( grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, - grpc_pollset_set *pollset_set, grpc_closure *on_done, + grpc_ares_ev_driver *ev_driver, grpc_closure *on_done, grpc_resolved_addresses **addrs) = grpc_resolve_address_ares_impl; grpc_error *grpc_ares_init(void) { 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 b7440b533d..ac231cad26 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 @@ -36,6 +36,7 @@ #include +#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" @@ -47,7 +48,7 @@ extern void (*grpc_resolve_address_ares)(grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port, - grpc_pollset_set *pollset_set, + grpc_ares_ev_driver *ev_driver, grpc_closure *on_done, grpc_resolved_addresses **addresses); diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 303a15c756..e9b3783e08 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -228,7 +228,7 @@ void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, void my_resolve_address_async(grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port, - grpc_pollset_set *pollset_set, + grpc_ares_ev_driver *ev_driver, grpc_closure *on_done, grpc_resolved_addresses **addresses) { my_resolve_address(exec_ctx, addr, default_port, on_done, addresses); -- cgit v1.2.3 From a4669f68c259270e7c18eb4fb5f3dceddc66cabc Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Thu, 17 Nov 2016 20:39:27 -0800 Subject: Request a pollset_set in grpc_resolve_address --- src/core/ext/resolver/dns/native/dns_resolver.c | 1 + src/core/lib/http/httpcli.c | 1 + src/core/lib/iomgr/resolve_address.h | 2 + src/core/lib/iomgr/resolve_address_posix.c | 9 +-- src/core/lib/iomgr/resolve_address_uv.c | 9 +-- test/core/end2end/fuzzers/api_fuzzer.c | 4 +- test/core/iomgr/resolve_address_test.c | 74 ++++++++++++++++++++++--- 7 files changed, 81 insertions(+), 19 deletions(-) (limited to 'test/core/end2end/fuzzers') diff --git a/src/core/ext/resolver/dns/native/dns_resolver.c b/src/core/ext/resolver/dns/native/dns_resolver.c index 35cb8c83a1..7cbd6ce95c 100644 --- a/src/core/ext/resolver/dns/native/dns_resolver.c +++ b/src/core/ext/resolver/dns/native/dns_resolver.c @@ -218,6 +218,7 @@ static void dns_start_resolving_locked(grpc_exec_ctx *exec_ctx, r->resolving = true; r->addresses = NULL; grpc_resolve_address(exec_ctx, r->name_to_resolve, r->default_port, + r->base.pollset_set, grpc_closure_create(dns_on_resolved, r), &r->addresses); } diff --git a/src/core/lib/http/httpcli.c b/src/core/lib/http/httpcli.c index fdb8abaa2d..1035f31109 100644 --- a/src/core/lib/http/httpcli.c +++ b/src/core/lib/http/httpcli.c @@ -278,6 +278,7 @@ static void internal_request_begin(grpc_exec_ctx *exec_ctx, grpc_polling_entity_add_to_pollset_set(exec_ctx, req->pollent, req->context->pollset_set); grpc_resolve_address(exec_ctx, request->host, req->handshaker->default_port, + req->context->pollset_set, grpc_closure_create(on_resolved, req), &req->addresses); } diff --git a/src/core/lib/iomgr/resolve_address.h b/src/core/lib/iomgr/resolve_address.h index f10828ee13..2bd2228ca2 100644 --- a/src/core/lib/iomgr/resolve_address.h +++ b/src/core/lib/iomgr/resolve_address.h @@ -36,6 +36,7 @@ #include #include "src/core/lib/iomgr/exec_ctx.h" +#include "src/core/lib/iomgr/pollset_set.h" #define GRPC_MAX_SOCKADDR_SIZE 128 @@ -54,6 +55,7 @@ typedef struct { /* TODO(ctiller): add a timeout here */ extern void (*grpc_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); /* Destroy resolved addresses */ diff --git a/src/core/lib/iomgr/resolve_address_posix.c b/src/core/lib/iomgr/resolve_address_posix.c index 20103b83ff..94d691848a 100644 --- a/src/core/lib/iomgr/resolve_address_posix.c +++ b/src/core/lib/iomgr/resolve_address_posix.c @@ -193,6 +193,7 @@ void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) { static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, + grpc_pollset_set *interested_parties, grpc_closure *on_done, grpc_resolved_addresses **addrs) { request *r; @@ -212,9 +213,9 @@ static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name, grpc_executor_push(&r->request_closure, GRPC_ERROR_NONE); } -void (*grpc_resolve_address)(grpc_exec_ctx *exec_ctx, const char *name, - const char *default_port, grpc_closure *on_done, - grpc_resolved_addresses **addrs) = - resolve_address_impl; +void (*grpc_resolve_address)( + grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, + grpc_pollset_set *interested_parties, grpc_closure *on_done, + grpc_resolved_addresses **addrs) = resolve_address_impl; #endif diff --git a/src/core/lib/iomgr/resolve_address_uv.c b/src/core/lib/iomgr/resolve_address_uv.c index b8295acfa1..3269c4f09f 100644 --- a/src/core/lib/iomgr/resolve_address_uv.c +++ b/src/core/lib/iomgr/resolve_address_uv.c @@ -181,6 +181,7 @@ void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) { static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, + grpc_pollset_set *interested_parties, grpc_closure *on_done, grpc_resolved_addresses **addrs) { uv_getaddrinfo_t *req; @@ -223,9 +224,9 @@ static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name, } } -void (*grpc_resolve_address)(grpc_exec_ctx *exec_ctx, const char *name, - const char *default_port, grpc_closure *on_done, - grpc_resolved_addresses **addrs) = - resolve_address_impl; +void (*grpc_resolve_address)( + grpc_exec_ctx *exec_ctx, const char *name, const char *default_port, + grpc_pollset_set *interested_parties, grpc_closure *on_done, + grpc_resolved_addresses **addrs) = resolve_address_impl; #endif /* GRPC_UV */ diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 8ba4f08652..531c3980b5 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -376,7 +376,7 @@ void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr, void my_resolve_address_async(grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port, - grpc_ares_ev_driver *ev_driver, + grpc_pollset_set *interested_parties, grpc_closure *on_done, grpc_resolved_addresses **addresses) { my_resolve_address(exec_ctx, addr, default_port, on_done, addresses); @@ -664,7 +664,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; + grpc_resolve_address = my_resolve_address_async; grpc_resolve_address_ares = my_resolve_address_async; grpc_tcp_client_connect_impl = my_tcp_client_connect; gpr_now_impl = now_impl; diff --git a/test/core/iomgr/resolve_address_test.c b/test/core/iomgr/resolve_address_test.c index 2dd0d88b3f..2f533137d8 100644 --- a/test/core/iomgr/resolve_address_test.c +++ b/test/core/iomgr/resolve_address_test.c @@ -34,6 +34,7 @@ #include "src/core/lib/iomgr/resolve_address.h" #include #include +#include #include #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr.h" @@ -46,16 +47,64 @@ static gpr_timespec test_deadline(void) { typedef struct args_struct { gpr_event ev; grpc_resolved_addresses *addrs; + gpr_atm done_atm; + gpr_mu *mu; + grpc_pollset *pollset; + grpc_pollset_set *pollset_set; } args_struct; void args_init(args_struct *args) { gpr_event_init(&args->ev); + grpc_pollset_init(args->pollset, &args->mu); + args->pollset_set = grpc_pollset_set_create(); + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + grpc_pollset_set_add_pollset(&exec_ctx, args->pollset_set, args->pollset); + grpc_exec_ctx_finish(&exec_ctx); args->addrs = NULL; } void args_finish(args_struct *args) { GPR_ASSERT(gpr_event_wait(&args->ev, test_deadline())); grpc_resolved_addresses_destroy(args->addrs); + grpc_pollset_set_destroy(args->pollset_set); + grpc_pollset_destroy(args->pollset); +} + +static gpr_timespec n_sec_deadline(int seconds) { + return gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_seconds(seconds, GPR_TIMESPAN)); +} + +static void actually_poll(void *argsp) { + args_struct *args = argsp; + gpr_timespec deadline = n_sec_deadline(10); + grpc_pollset_worker *worker = NULL; + while (true) { + bool done = gpr_atm_acq_load(&args->done_atm) != 0; + if (done) { + break; + } + gpr_timespec time_left = + gpr_time_sub(deadline, gpr_now(GPR_CLOCK_REALTIME)); + gpr_log(GPR_DEBUG, "done=%d, time_left=%" PRId64 ".%09d", done, + time_left.tv_sec, time_left.tv_nsec); + GPR_ASSERT(gpr_time_cmp(time_left, gpr_time_0(GPR_TIMESPAN)) >= 0); + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + gpr_mu_lock(args->mu); + GRPC_LOG_IF_ERROR( + "pollset_work", + grpc_pollset_work(&exec_ctx, args->pollset, &worker, + gpr_now(GPR_CLOCK_REALTIME), n_sec_deadline(1))); + gpr_mu_unlock(args->mu); + grpc_exec_ctx_finish(&exec_ctx); + } + gpr_event_set(&args->ev, (void *)1); +} + +static void poll_pollset_until_request_done(args_struct *args) { + gpr_atm_rel_store(&args->done_atm, 0); + gpr_thd_id id; + gpr_thd_new(&id, actually_poll, args, NULL); } static void must_succeed(grpc_exec_ctx *exec_ctx, void *argsp, @@ -64,20 +113,21 @@ static void must_succeed(grpc_exec_ctx *exec_ctx, void *argsp, GPR_ASSERT(err == GRPC_ERROR_NONE); GPR_ASSERT(args->addrs != NULL); GPR_ASSERT(args->addrs->naddrs > 0); - gpr_event_set(&args->ev, (void *)1); + gpr_atm_rel_store(&args->done_atm, 1); } static void must_fail(grpc_exec_ctx *exec_ctx, void *argsp, grpc_error *err) { args_struct *args = argsp; GPR_ASSERT(err != GRPC_ERROR_NONE); - gpr_event_set(&args->ev, (void *)1); + gpr_atm_rel_store(&args->done_atm, 1); } static void test_localhost(void) { args_struct args; args_init(&args); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_resolve_address(&exec_ctx, "localhost:1", NULL, + poll_pollset_until_request_done(&args); + grpc_resolve_address(&exec_ctx, "localhost:1", NULL, args.pollset_set, grpc_closure_create(must_succeed, &args), &args.addrs); grpc_exec_ctx_finish(&exec_ctx); args_finish(&args); @@ -87,7 +137,8 @@ static void test_default_port(void) { args_struct args; args_init(&args); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_resolve_address(&exec_ctx, "localhost", "1", + poll_pollset_until_request_done(&args); + grpc_resolve_address(&exec_ctx, "localhost", "1", args.pollset_set, grpc_closure_create(must_succeed, &args), &args.addrs); grpc_exec_ctx_finish(&exec_ctx); args_finish(&args); @@ -97,7 +148,8 @@ static void test_missing_default_port(void) { args_struct args; args_init(&args); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_resolve_address(&exec_ctx, "localhost", NULL, + poll_pollset_until_request_done(&args); + grpc_resolve_address(&exec_ctx, "localhost", NULL, args.pollset_set, grpc_closure_create(must_fail, &args), &args.addrs); grpc_exec_ctx_finish(&exec_ctx); args_finish(&args); @@ -107,7 +159,8 @@ static void test_ipv6_with_port(void) { args_struct args; args_init(&args); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_resolve_address(&exec_ctx, "[2001:db8::1]:1", NULL, + poll_pollset_until_request_done(&args); + grpc_resolve_address(&exec_ctx, "[2001:db8::1]:1", NULL, args.pollset_set, grpc_closure_create(must_succeed, &args), &args.addrs); grpc_exec_ctx_finish(&exec_ctx); args_finish(&args); @@ -122,7 +175,8 @@ static void test_ipv6_without_port(void) { args_struct args; args_init(&args); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_resolve_address(&exec_ctx, kCases[i], "80", + poll_pollset_until_request_done(&args); + grpc_resolve_address(&exec_ctx, kCases[i], "80", args.pollset_set, grpc_closure_create(must_succeed, &args), &args.addrs); grpc_exec_ctx_finish(&exec_ctx); args_finish(&args); @@ -138,7 +192,8 @@ static void test_invalid_ip_addresses(void) { args_struct args; args_init(&args); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_resolve_address(&exec_ctx, kCases[i], NULL, + poll_pollset_until_request_done(&args); + grpc_resolve_address(&exec_ctx, kCases[i], NULL, args.pollset_set, grpc_closure_create(must_fail, &args), &args.addrs); grpc_exec_ctx_finish(&exec_ctx); args_finish(&args); @@ -154,7 +209,8 @@ static void test_unparseable_hostports(void) { args_struct args; args_init(&args); grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_resolve_address(&exec_ctx, kCases[i], "1", + poll_pollset_until_request_done(&args); + grpc_resolve_address(&exec_ctx, kCases[i], "1", args.pollset_set, grpc_closure_create(must_fail, &args), &args.addrs); grpc_exec_ctx_finish(&exec_ctx); args_finish(&args); -- cgit v1.2.3 From 9e4c8eb8e84123d275bc72f048c96cb1f8ce5acc Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Fri, 18 Nov 2016 01:06:57 -0800 Subject: Address review comments --- doc/environment_variables.md | 2 +- gRPC-Core.podspec | 2 +- include/grpc/impl/codegen/port_platform.h | 8 +++-- src/core/ext/client_channel/resolver_registry.c | 8 +++-- src/core/ext/client_channel/resolver_registry.h | 1 + .../ext/resolver/dns/c_ares/dns_resolver_ares.c | 35 +++++++++++--------- .../ext/resolver/dns/c_ares/grpc_ares_ev_driver.h | 4 ++- .../dns/c_ares/grpc_ares_ev_driver_posix.c | 7 ++-- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.c | 7 ++-- .../ext/resolver/dns/c_ares/grpc_ares_wrapper.h | 5 ++- src/core/ext/resolver/dns/native/dns_resolver.c | 9 +++++ templates/gRPC-Core.podspec.template | 2 +- .../resolvers/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(-) (limited to 'test/core/end2end/fuzzers') diff --git a/doc/environment_variables.md b/doc/environment_variables.md index 11ac890cd5..6c13015baa 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 f261481fd4..670df36f1d 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 29b0cb80c4..1db69b08e2 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 94942069a1..dc8be78764 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 2a95a669f0..c216ae1466 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 e5691942a4..c0c1efbb86 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 7165df0afc..334feaa2ab 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 a4733dcb4b..68c52e43f0 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 f90222b2e6..c8323e740a 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 3968a445ab..ab00a26b36 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 7cbd6ce95c..a3b4d5b9af 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 d52b53dd97..029e2c33cb 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 57dfb5cb12..dd7fa89d69 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 531c3980b5..746134c85b 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 7f9998f36f..9d9092aa0c 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; -- cgit v1.2.3 From 5c6f05b4f0c792bb728172af0e8dc54c7e983172 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Fri, 18 Nov 2016 10:50:39 -0800 Subject: Fix api_fuzzer --- test/core/end2end/fuzzers/api_fuzzer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/core/end2end/fuzzers') diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 746134c85b..b3e0d90da8 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -657,10 +657,10 @@ 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; grpc_tcp_client_connect_impl = my_tcp_client_connect; gpr_now_impl = now_impl; grpc_init(); + grpc_resolve_address = my_resolve_address; GPR_ASSERT(g_channel == NULL); GPR_ASSERT(g_server == NULL); -- cgit v1.2.3