From be447a88826d0d271f7b3fad9a14dc7c9295df5b Mon Sep 17 00:00:00 2001 From: Hongwei Wang Date: Fri, 17 Jul 2015 11:20:15 -0700 Subject: [PATCH] Add zookeeper public header --- build.json | 3 + include/grpc/grpc_zookeeper.h | 39 +++++++++++ .../resolvers/zookeeper_resolver.c | 65 +++++++++++-------- src/core/surface/init.c | 1 - 4 files changed, 80 insertions(+), 28 deletions(-) create mode 100644 include/grpc/grpc_zookeeper.h diff --git a/build.json b/build.json index 07e66a5c213..3e8c0713d33 100644 --- a/build.json +++ b/build.json @@ -555,6 +555,9 @@ "name": "grpc_zookeeper", "build": "all", "language": "c", + "public_headers": [ + "include/grpc/grpc_zookeeper.h" + ], "headers": [ "src/core/client_config/resolvers/zookeeper_resolver.h" ], diff --git a/include/grpc/grpc_zookeeper.h b/include/grpc/grpc_zookeeper.h new file mode 100644 index 00000000000..c711f69d2ff --- /dev/null +++ b/include/grpc/grpc_zookeeper.h @@ -0,0 +1,39 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_GRPC_ZOOKEEPER_H +#define GRPC_GRPC_ZOOKEEPER_H + + + +#endif /* GRPC_GRPC_ZOOKEEPER_H */ \ No newline at end of file diff --git a/src/core/client_config/resolvers/zookeeper_resolver.c b/src/core/client_config/resolvers/zookeeper_resolver.c index 2682e29e869..12d6de12438 100644 --- a/src/core/client_config/resolvers/zookeeper_resolver.c +++ b/src/core/client_config/resolvers/zookeeper_resolver.c @@ -182,9 +182,10 @@ static void zookeeper_dns_resolved(void *arg, grpc_resolved_addresses *addresses zookeeper_resolver *r = arg; r->resolved_num++; r->resolved_addrs->addrs = gpr_realloc(r->resolved_addrs->addrs, - sizeof(grpc_resolved_address) * (r->resolved_addrs->naddrs + addresses->naddrs)); + sizeof(grpc_resolved_address) * (r->resolved_addrs->naddrs + addresses->naddrs)); 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); + 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; } @@ -199,9 +200,9 @@ static void zookeeper_dns_resolved(void *arg, grpc_resolved_addresses *addresses static char *zookeeper_parse_address(char *buffer, int buffer_len) { char *host; char *port; - grpc_json *json; - grpc_json *cur; char *address; + grpc_json *json; + grpc_json *cur; gpr_log(GPR_INFO, buffer); address = NULL; @@ -249,16 +250,16 @@ static void zookeeper_resolve_address(zookeeper_resolver *r) { r->resolved_addrs = NULL; r->resolved_total = 0; r->resolved_num = 0; - address = NULL; - memset(path, 0, GRPC_MAX_ZOOKEEPER_BUFFER_SIZE); - memset(buffer, 0, GRPC_MAX_ZOOKEEPER_BUFFER_SIZE); buffer_len = GRPC_MAX_ZOOKEEPER_BUFFER_SIZE; + memset(path, 0, buffer_len); + memset(buffer, 0, buffer_len); - /** Read zookeeper node of given path r->name - If not containing address, read its children */ + /** Get zookeeper node of given path r->name + If not containing address, get its children */ gpr_log(GPR_INFO, r->name); - status = zoo_get(r->zookeeper_handle, r->name, GRPC_ZOOKEEPER_WATCH, buffer, &buffer_len, NULL); + status = zoo_get(r->zookeeper_handle, r->name, GRPC_ZOOKEEPER_WATCH, + buffer, &buffer_len, NULL); if (!status) { if (buffer_len > 0) { address = zookeeper_parse_address(buffer, buffer_len); @@ -274,7 +275,8 @@ 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; @@ -288,29 +290,36 @@ static void zookeeper_resolve_address(zookeeper_resolver *r) { strcat(path, children.data[i]); gpr_log(GPR_INFO, path); memset(buffer, 0, GRPC_MAX_ZOOKEEPER_BUFFER_SIZE); - status = zoo_get(r->zookeeper_handle, path, GRPC_ZOOKEEPER_WATCH, buffer, &buffer_len, NULL); + 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 parse zookeeper address %s", buffer); + } } - } else - gpr_log(GPR_ERROR, "Error when reading zookeeper node %s", path); + } else { + gpr_log(GPR_ERROR, "Cannot get zookeeper node %s", path); + } if (address == NULL) { r->resolved_total--; - if (r->resolved_num == r->resolved_total) + if (r->resolved_num == r->resolved_total) { zookeeper_on_resolved(r, r->resolved_addrs); + } } } - } 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); + } else { + gpr_log(GPR_ERROR, "Cannot get children of zookeeper node %s", r->name); + } + } else { + gpr_log(GPR_ERROR, "Cannot read zookeeper node %s", r->name); + } gpr_free(address); } @@ -347,8 +356,9 @@ 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 updates to any 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, @@ -358,7 +368,7 @@ static grpc_resolver *zookeeper_create( zookeeper_resolver *r; const char *path = uri->path; if (0 == strcmp(uri->authority, "")) { - gpr_log(GPR_ERROR, "no authority specified in zookeeper uri"); + gpr_log(GPR_ERROR, "No authority specified in zookeeper uri"); return NULL; } @@ -374,9 +384,10 @@ static grpc_resolver *zookeeper_create( /** Initialize zookeeper client */ zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); - r->zookeeper_handle = zookeeper_init(uri->authority, zookeeper_watcher, GRPC_ZOOKEEPER_TIMEOUT, 0, 0, 0); + r->zookeeper_handle = zookeeper_init(uri->authority, zookeeper_watcher, + GRPC_ZOOKEEPER_TIMEOUT, 0, 0, 0); if (r->zookeeper_handle == NULL) { - gpr_log(GPR_ERROR, "Error when connecting to zookeeper servers"); + gpr_log(GPR_ERROR, "Cannot connect to zookeeper server"); return NULL; } diff --git a/src/core/surface/init.c b/src/core/surface/init.c index 6f289a27f0e..2181408aa12 100644 --- a/src/core/surface/init.c +++ b/src/core/surface/init.c @@ -71,7 +71,6 @@ void grpc_init(void) { #ifdef GPR_POSIX_SOCKET grpc_register_resolver_type("unix", grpc_unix_resolver_factory_create()); #endif - grpc_register_resolver_type("zookeeper", grpc_zookeeper_resolver_factory_create()); grpc_register_tracer("channel", &grpc_trace_channel); grpc_register_tracer("surface", &grpc_surface_trace); grpc_register_tracer("http", &grpc_http_trace);