diff --git a/src/core/client_config/resolvers/zookeeper_resolver.c b/src/core/client_config/resolvers/zookeeper_resolver.c index e124de93f7cdce245c9803929388d788243366cc..2682e29e8691f7a9ad38d185363cf35219575c9e 100644 --- a/src/core/client_config/resolvers/zookeeper_resolver.c +++ b/src/core/client_config/resolvers/zookeeper_resolver.c @@ -45,7 +45,7 @@ #include "src/core/support/string.h" #include "src/core/json/json.h" -#define GRPC_MAX_ZOOKEEPER_SIZE 1024 +#define GRPC_MAX_ZOOKEEPER_BUFFER_SIZE 1024 #define GRPC_ZOOKEEPER_TIMEOUT 15000 #define GRPC_ZOOKEEPER_WATCH 0 @@ -81,9 +81,9 @@ typedef struct { zhandle_t *zookeeper_handle; /** zookeeper resolved addresses */ grpc_resolved_addresses * resolved_addrs; - /** zookeeper total number of addresses to be resolved */ + /** total number of addresses to be resolved */ int resolved_total; - /** zookeeper resolved number of addresses */ + /** number of addresses resolved */ int resolved_num; } zookeeper_resolver; @@ -181,12 +181,8 @@ static void zookeeper_dns_resolved(void *arg, grpc_resolved_addresses *addresses size_t i; zookeeper_resolver *r = arg; r->resolved_num++; - gpr_log(GPR_INFO, "log"); - gpr_log(GPR_INFO, "%d", addresses->naddrs); - gpr_log(GPR_INFO, "%d", r->resolved_addrs->naddrs); r->resolved_addrs->addrs = gpr_realloc(r->resolved_addrs->addrs, sizeof(grpc_resolved_address) * (r->resolved_addrs->naddrs + addresses->naddrs)); - gpr_log(GPR_INFO, "log"); for (i = 0; i < addresses->naddrs; i++) { memcpy(r->resolved_addrs->addrs[i + r->resolved_addrs->naddrs].addr, addresses->addrs[i].addr, addresses->addrs[i].len); r->resolved_addrs->addrs[i + r->resolved_addrs->naddrs].len = addresses->addrs[i].len; @@ -216,9 +212,13 @@ static char *zookeeper_parse_address(char *buffer, int buffer_len) { for (cur = json->child; cur != NULL; cur = cur->next) { if (!strcmp(cur->key, "host")) { host = (char *)cur->value; + if (port != NULL) + break; } - if (!strcmp(cur->key, "port")) { + else if (!strcmp(cur->key, "port")) { port = (char *)cur->value; + if (host != NULL) + break; } } if (host != NULL && port != NULL) { @@ -228,41 +228,37 @@ static char *zookeeper_parse_address(char *buffer, int buffer_len) { strcat(address, ":"); strcat(address, port); gpr_log(GPR_INFO, address); - } else { - gpr_log(GPR_ERROR, "Cannot resolve zookeeper address: no host or port"); } grpc_json_destroy(json); - } else { - gpr_log(GPR_ERROR, "Cannot resolve zookeeper address: json parse error"); - } + } + return address; } /** Resolve address by zookeeper */ static void zookeeper_resolve_address(zookeeper_resolver *r) { - struct String_vector addresses; - int i; + struct String_vector children; int status; + int i; - char path[GRPC_MAX_ZOOKEEPER_SIZE]; - char buffer[GRPC_MAX_ZOOKEEPER_SIZE]; + char path[GRPC_MAX_ZOOKEEPER_BUFFER_SIZE]; + char buffer[GRPC_MAX_ZOOKEEPER_BUFFER_SIZE]; char *address; int buffer_len; r->resolved_addrs = NULL; r->resolved_total = 0; r->resolved_num = 0; - gpr_log(GPR_INFO, r->name); address = NULL; - memset(path, 0, GRPC_MAX_ZOOKEEPER_SIZE); - memset(buffer, 0, GRPC_MAX_ZOOKEEPER_SIZE); - buffer_len = GRPC_MAX_ZOOKEEPER_SIZE; + memset(path, 0, GRPC_MAX_ZOOKEEPER_BUFFER_SIZE); + memset(buffer, 0, GRPC_MAX_ZOOKEEPER_BUFFER_SIZE); + buffer_len = GRPC_MAX_ZOOKEEPER_BUFFER_SIZE; /** Read zookeeper node of given path r->name If not containing address, read its children */ + gpr_log(GPR_INFO, r->name); status = zoo_get(r->zookeeper_handle, r->name, GRPC_ZOOKEEPER_WATCH, buffer, &buffer_len, NULL); - status = 0; if (!status) { if (buffer_len > 0) { address = zookeeper_parse_address(buffer, buffer_len); @@ -277,40 +273,44 @@ static void zookeeper_resolve_address(zookeeper_resolver *r) { } } - buffer_len = GRPC_MAX_ZOOKEEPER_SIZE; - status = zoo_get_children(r->zookeeper_handle, r->name, GRPC_ZOOKEEPER_WATCH, &addresses); + buffer_len = GRPC_MAX_ZOOKEEPER_BUFFER_SIZE; + status = zoo_get_children(r->zookeeper_handle, r->name, GRPC_ZOOKEEPER_WATCH, &children); if (!status) { - /** Assume no children are deleted */ r->resolved_addrs = gpr_malloc(sizeof(grpc_resolved_addresses)); r->resolved_addrs->addrs = NULL; r->resolved_addrs->naddrs = 0; - r->resolved_total = addresses.count; - for (i = 0; i < addresses.count; i++) { - memset(path, 0, GRPC_MAX_ZOOKEEPER_SIZE); + r->resolved_total = children.count; + + for (i = 0; i < children.count; i++) { + memset(path, 0, GRPC_MAX_ZOOKEEPER_BUFFER_SIZE); strcat(path, r->name); strcat(path, "/"); - strcat(path, addresses.data[i]); - + strcat(path, children.data[i]); gpr_log(GPR_INFO, path); - memset(buffer, 0, GRPC_MAX_ZOOKEEPER_SIZE); + memset(buffer, 0, 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); - if (address != NULL) { + if (address != NULL) grpc_resolve_address(address, NULL, zookeeper_dns_resolved, r); - } + else + gpr_log(GPR_ERROR, "Error when parsing zookeeper address %s", buffer); } - } else { - gpr_log(GPR_ERROR, "Cannot resolve zookeeper address: read zookeeper node error"); + } else + gpr_log(GPR_ERROR, "Error when reading zookeeper node %s", path); + + if (address == NULL) { + r->resolved_total--; + if (r->resolved_num == r->resolved_total) + zookeeper_on_resolved(r, r->resolved_addrs); } } - } else { - gpr_log(GPR_ERROR, "Cannot resolve zookeeper address: get zookeeper children error"); - } - } else { - gpr_log(GPR_ERROR, "Cannot resolve zookeeper address"); - } + } else + gpr_log(GPR_ERROR, "Error when getting children of zookeeper node %s", r->name); + } else + gpr_log(GPR_ERROR, "Error when reading zookeeper node %s", r->name); gpr_free(address); } @@ -347,10 +347,8 @@ static void zookeeper_destroy(grpc_resolver *gr) { gpr_free(r); } -/** Zookeeper watcher function: handle any updates to watched nodes */ -static void zookeeper_watcher(zhandle_t *zookeeper_handle, int type, int state, const char* path, void* watcher_ctx) { - -} +/** Zookeeper watcher function - handle any updates to watched nodes */ +static void zookeeper_watcher(zhandle_t *zookeeper_handle, int type, int state, const char* path, void* watcher_ctx) {} static grpc_resolver *zookeeper_create( grpc_uri *uri, @@ -359,8 +357,6 @@ static grpc_resolver *zookeeper_create( grpc_subchannel_factory *subchannel_factory) { zookeeper_resolver *r; const char *path = uri->path; - gpr_log(GPR_INFO, path); - if (0 == strcmp(uri->authority, "")) { gpr_log(GPR_ERROR, "no authority specified in zookeeper uri"); return NULL; @@ -380,7 +376,7 @@ static grpc_resolver *zookeeper_create( zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); 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 servers"); + gpr_log(GPR_ERROR, "Error when connecting to zookeeper servers"); return NULL; }