diff --git a/src/core/client_config/resolvers/zookeeper_resolver.c b/src/core/client_config/resolvers/zookeeper_resolver.c
index a0db6059b40b72fa628cf3c790c047bed9cbf6e3..fb982410f77c75a3c4d74186a68865c88b73a29e 100644
--- a/src/core/client_config/resolvers/zookeeper_resolver.c
+++ b/src/core/client_config/resolvers/zookeeper_resolver.c
@@ -85,7 +85,7 @@ typedef struct {
   grpc_resolved_addresses * resolved_addrs;
   /** total number of addresses to be resolved */
   int resolved_total;
-  /** number of addresses resolved */
+  /** resolved number of addresses */
   int resolved_num;
 } zookeeper_resolver;
 
@@ -179,9 +179,11 @@ static void zookeeper_on_resolved(void *arg, grpc_resolved_addresses *addresses)
   GRPC_RESOLVER_UNREF(&r->base, "zookeeper-resolving");
 }
 
+/* Callback function for each DNS resolved address */
 static void zookeeper_dns_resolved(void *arg, grpc_resolved_addresses *addresses) {
   size_t i;
   zookeeper_resolver *r = arg;
+  gpr_mu_lock(&r->mu);
   r->resolved_num++;
   r->resolved_addrs->addrs = gpr_realloc(r->resolved_addrs->addrs, 
                             sizeof(grpc_resolved_address) * (r->resolved_addrs->naddrs + addresses->naddrs));
@@ -195,8 +197,12 @@ static void zookeeper_dns_resolved(void *arg, grpc_resolved_addresses *addresses
   grpc_resolved_addresses_destroy(addresses);
 
   /* Wait for all addresses to be resolved */
-  if (r->resolved_num == r->resolved_total)
+  if (r->resolved_num == r->resolved_total) {
+    gpr_mu_unlock(&r->mu);
     zookeeper_on_resolved(r, r->resolved_addrs);
+  } else {
+    gpr_mu_unlock(&r->mu);
+  }
 }
 
 /* Parse json format address of a zookeeper node */
@@ -274,9 +280,7 @@ static void zookeeper_resolve_address(zookeeper_resolver *r) {
       }
     }
 
-    buffer_len = GRPC_MAX_ZOOKEEPER_BUFFER_SIZE;
-    status = zoo_get_children(r->zookeeper_handle, r->name, GRPC_ZOOKEEPER_WATCH, 
-                              &children);
+    status = zoo_get_children(r->zookeeper_handle, r->name, GRPC_ZOOKEEPER_WATCH, &children);
     if (!status) {
       r->resolved_addrs = gpr_malloc(sizeof(grpc_resolved_addresses));
       r->resolved_addrs->addrs = NULL;
@@ -289,9 +293,9 @@ static void zookeeper_resolve_address(zookeeper_resolver *r) {
         strcat(path, "/");
         strcat(path, children.data[i]);
         memset(buffer, 0, GRPC_MAX_ZOOKEEPER_BUFFER_SIZE);
+        buffer_len = GRPC_MAX_ZOOKEEPER_BUFFER_SIZE;
         status = zoo_get(r->zookeeper_handle, path, GRPC_ZOOKEEPER_WATCH, 
                         buffer, &buffer_len, NULL);
-
         if (!status) {
           if (buffer_len > 0) {
             address = zookeeper_parse_address(buffer, buffer_len);
@@ -300,13 +304,12 @@ static void zookeeper_resolve_address(zookeeper_resolver *r) {
               grpc_resolve_address(address, NULL, zookeeper_dns_resolved, r); 
             }
             else {
-              gpr_log(GPR_ERROR, "Cannot parse zookeeper address %s", buffer);
+              gpr_log(GPR_ERROR, "Fail to parse zookeeper address %s", path);
             }
           }
         } else {
-          gpr_log(GPR_ERROR, "Cannot get zookeeper node %s", path);
+          gpr_log(GPR_ERROR, "Fail to get zookeeper node %s", path);
         }
-
         if (address == NULL) {
           r->resolved_total--;
           if (r->resolved_num == r->resolved_total) {
@@ -314,11 +317,14 @@ static void zookeeper_resolve_address(zookeeper_resolver *r) {
           }
         }
       }
+      if (children.count == 0) {
+        gpr_log(GPR_ERROR, "Fail to resolve zookeeper address %s", r->name);
+      }
     } else {
-      gpr_log(GPR_ERROR, "Cannot get children of zookeeper node %s", r->name);
+      gpr_log(GPR_ERROR, "Fail to get children of zookeeper node %s", r->name);
     }
   } else {
-    gpr_log(GPR_ERROR, "Cannot read zookeeper node %s", r->name);
+    gpr_log(GPR_ERROR, "Fail to get zookeeper node %s", r->name);
   }
   
   gpr_free(address);
@@ -390,7 +396,7 @@ static grpc_resolver *zookeeper_create(
   r->zookeeper_handle = zookeeper_init(uri->authority, zookeeper_watcher, 
                                       GRPC_ZOOKEEPER_TIMEOUT, 0, 0, 0);
   if (r->zookeeper_handle  == NULL) {
-    gpr_log(GPR_ERROR, "Cannot connect to zookeeper server");
+    gpr_log(GPR_ERROR, "Unable to connect to zookeeper server");
     return NULL;
   }