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 1898ec8b0b4f907d35d0e490d33633de7a1b1ef9..5166811173b5f22695f299e7b22c003bb2f4cba0 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
@@ -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);
   }