From 2648a95b5afdda2ffad9a311f7ecdb7e93adb4ec Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Wed, 2 Nov 2016 18:52:25 -0700 Subject: [PATCH] Add mutex for grpc_ares_request --- .../resolver/dns/c_ares/grpc_ares_wrapper.c | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) 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 408c5d89d74..31e2f96208d 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 @@ -75,18 +75,21 @@ typedef struct grpc_ares_request { /** the pointer to receive the resolved addresses, set in grpc_resolve_address_ares_impl */ grpc_resolved_addresses **addrs_out; + /** the evernt driver used by this request, set in + grpc_resolve_address_ares_impl */ + grpc_ares_ev_driver *ev_driver; /** the closure wraps request_resolving_address, initialized in grpc_resolve_address_ares_impl */ grpc_closure request_closure; /** number of ongoing queries, set in grpc_resolve_address_ares_impl */ - int pending_queries; + gpr_refcount pending_queries; + + /** mutex guarding the rest of the state */ + gpr_mu mu; /** is there at least one successful query, set in on_done_cb */ bool success; /** the errors explaining the request failure, set in on_done_cb */ grpc_error *error; - /** the evernt driver owned by this request, created in - grpc_resolve_address_ares_impl */ - grpc_ares_ev_driver *ev_driver; } grpc_ares_request; static void do_basic_init(void) { gpr_mu_init(&g_init_mu); } @@ -110,8 +113,8 @@ static void on_done_cb(void *arg, int status, int timeouts, struct hostent *hostent) { grpc_ares_request *r = (grpc_ares_request *)arg; grpc_resolved_addresses **addresses = r->addrs_out; + gpr_mu_lock(&r->mu); 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; @@ -163,7 +166,6 @@ static void on_done_cb(void *arg, int status, int timeouts, } } } else if (!r->success) { - gpr_log(GPR_DEBUG, "c-ares status is not ARES_SUCCESS"); char *error_msg; gpr_asprintf(&error_msg, "C-ares status is not ARES_SUCCESS: %s", ares_strerror(status)); @@ -175,9 +177,8 @@ 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"); + gpr_mu_unlock(&r->mu); + if (gpr_unref(&r->pending_queries)) { 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); @@ -193,12 +194,11 @@ static void request_resolving_address(grpc_exec_ctx *exec_ctx, void *arg, grpc_ares_ev_driver *ev_driver = r->ev_driver; ares_channel *channel = (ares_channel *)grpc_ares_ev_driver_get_channel(ev_driver); - r->pending_queries = 1; + gpr_ref_init(&r->pending_queries, 1); if (grpc_ipv6_loopback_available()) { - ++r->pending_queries; + gpr_ref(&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); } @@ -271,15 +271,14 @@ 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 { - gpr_log(GPR_DEBUG, "%s", host); r = gpr_malloc(sizeof(grpc_ares_request)); + gpr_mu_init(&r->mu); r->ev_driver = ev_driver; r->on_done = on_done; r->addrs_out = addrs; r->default_port = gpr_strdup(default_port); r->port = gpr_strdup(port); r->host = gpr_strdup(host); - r->pending_queries = 0; r->success = false; r->error = GRPC_ERROR_NONE; grpc_closure_init(&r->request_closure, request_resolving_address, r);