Add zookeeper public header

pull/2882/head
Hongwei Wang 10 years ago
parent a8cc43907e
commit be447a8882
  1. 3
      build.json
  2. 39
      include/grpc/grpc_zookeeper.h
  3. 65
      src/core/client_config/resolvers/zookeeper_resolver.c
  4. 1
      src/core/surface/init.c

@ -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"
],

@ -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 */

@ -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;
}

@ -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);

Loading…
Cancel
Save