Handle multi-query results

pull/7654/head
Yuchen Zeng 9 years ago
parent 21e0a61528
commit 15a71c8c11
  1. 21
      src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c

@ -70,6 +70,7 @@ typedef struct grpc_ares_request {
grpc_closure request_closure;
void *arg;
int pending_quries;
int success;
grpc_ares_ev_driver *ev_driver;
} grpc_ares_request;
@ -99,7 +100,7 @@ static void on_done_cb(void *arg, int status, int timeouts,
struct hostent *hostent) {
gpr_log(GPR_ERROR, "status: %d", status);
grpc_ares_request *r = (grpc_ares_request *)arg;
grpc_error *err;
grpc_error *err = GRPC_ERROR_NONE;
gpr_log(GPR_ERROR, "status: %s", r->name);
grpc_resolved_addresses **addresses = r->addrs_out;
size_t i;
@ -107,7 +108,9 @@ static void on_done_cb(void *arg, int status, int timeouts,
if (status == ARES_SUCCESS) {
gpr_log(GPR_ERROR, "status ARES_SUCCESS");
GRPC_ERROR_UNREF(err);
err = GRPC_ERROR_NONE;
r->success = 1;
if (*addresses == NULL) {
*addresses = gpr_malloc(sizeof(grpc_resolved_addresses));
(*addresses)->naddrs = 0;
@ -157,17 +160,14 @@ static void on_done_cb(void *arg, int status, int timeouts,
}
}
// ares_destroy(r->channel);
} else {
} else if (!r->success) {
gpr_log(GPR_ERROR, "status not ARES_SUCCESS");
err = grpc_error_set_str(
grpc_error_set_str(
grpc_error_set_str(grpc_error_set_int(GRPC_ERROR_CREATE("OS Error"),
GRPC_ERROR_INT_ERRNO, status),
GRPC_ERROR_STR_OS_ERROR, gai_strerror(status)),
GRPC_ERROR_STR_SYSCALL, "getaddrinfo"),
GRPC_ERROR_STR_TARGET_ADDRESS, r->name);
// TODO(zyc): add more error detail
if (err == GRPC_ERROR_NONE) {
err = GRPC_ERROR_CREATE("C-ares query error");
}
}
if (--r->pending_quries == 0) {
if (--r->pending_quries == 0 || err != GRPC_ERROR_NONE) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_exec_ctx_sched(&exec_ctx, r->on_done, err, NULL);
grpc_exec_ctx_flush(&exec_ctx);
@ -288,6 +288,7 @@ void grpc_resolve_address_ares_impl(grpc_exec_ctx *exec_ctx, const char *name,
r->port = gpr_strdup(port);
r->host = gpr_strdup(host);
r->pending_quries = 0;
r->success = 0;
grpc_closure_init(&r->request_closure, request_resolving_address, r);
grpc_exec_ctx_sched(exec_ctx, &r->request_closure, GRPC_ERROR_NONE, NULL);
}

Loading…
Cancel
Save