/* session expiration is handled for us (and a new session created) */ static void watcher(zhandle_t *zzh, int type, int state, const char *ppath) { char *path; session_context *context = (session_context *)zoo_get_context(zzh); int rc; path = (char *)clients_context_get_arg(context, "path"); if (type != ZOO_SESSION_EVENT) { info("%d %d %s", type, state, path); rc = zoo_aget(zzh, path, 1, get_cb, NULL); if (rc) warn("Failed to get path"); return; } if (is_connected(zzh)) { watcher_data *data = (watcher_data *)clients_context_data(context); if (!data->following) { rc = zoo_aget(zzh, path, 1, get_cb, NULL); if (rc) warn("Failed to get path"); else data->following = 1; } } }
void check_master () { zoo_aget(zh, "/master", 0, master_check_completion, NULL); }
int doReads(const char* root, int count){ char nodeName[1024]; int i; counter=0; for(i=0; i<count;i++){ int rc = 0; snprintf(nodeName, sizeof(nodeName),"%s/%d",root,i); incCounter(1); rc=zoo_aget(zh, nodeName,0,read_completion, 0); if(rc!=ZOK) return rc; } return ZOK; }
void get_task_data(const char *task) { if(task == NULL) return; LOG_DEBUG(("Task path: %s", task)); char * tmp_task = strndup(task, 15); char * path = make_path(2, "/tasks/", tmp_task); LOG_DEBUG(("Getting task data %s", tmp_task)); zoo_aget(zh, path, 0, get_task_data_completion, (const void *) tmp_task); free(path); }
void ZkClient::watcherCallback(int eventType, int state, const char* path) { LOG(INFO) << "PID #" << pthread_self() << " " << "ZkClient::watcherCallback(" << "path:" << path << "," << "state:" << zooStateToString(state) << "," << "event:" << zooWatcherEventToString(eventType) << ")"; if (ZOO_CONNECTED_STATE == state) { zhandle_t* zhandle = zHandle_.get(); CHECK(nullptr != zhandle) << "zhandle is NULL"; if (ZOO_CHANGED_EVENT == eventType) { DataChangeCallbackContext* context = new DataChangeCallbackContext(); context->path = path; context->zkClient = this; int returnCode = zoo_aget( zhandle, path, 1, ZkClient::dataChangeCallback, context ); CHECK(ZOK == returnCode) << "zoo_aget() failed with code: " << zooErrorCodeToString(returnCode); } else if (ZOO_DELETED_EVENT == eventType) { toft::Mutex::Locker locker(&dataChangeCallbackMapMutex_); auto it = dataChangeCallbackMap_.find(path); auto end = dataChangeCallbackMap_.end(); if (it == end) { LOG(ERROR) << "No callback registered at path: " << path; return; } it->second("", true); dataChangeCallbackMap_.erase(it); } } else if (ZOO_CONNECTING_STATE == state) { } else if (ZOO_ASSOCIATING_STATE == state) { } else if (ZOO_AUTH_FAILED_STATE == state) { CHECK(false) << "ZK Auth failed"; } else if (ZOO_EXPIRED_SESSION_STATE == state) { CHECK(false) << "ZK Session expired"; } }
static VALUE method_get(VALUE self, VALUE reqid, VALUE path, VALUE async, VALUE watch) { char * data ; int data_len = MAX_ZNODE_SIZE; struct Stat stat; int rc; VALUE output ; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); /* ugh */ data = malloc(MAX_ZNODE_SIZE); switch (call_type) { case SYNC: rc = zoo_get(zk->zh, RSTRING_PTR(path), 0, data, &data_len, &stat); break; case SYNC_WATCH: rc = zoo_wget(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, data, &data_len, &stat); break; case ASYNC: rc = zoo_aget(zk->zh, RSTRING_PTR(path), 0, zkrb_data_callback, data_ctx); break; case ASYNC_WATCH: rc = zoo_awget(zk->zh, RSTRING_PTR(path), zkrb_state_callback, watch_ctx, zkrb_data_callback, data_ctx); break; } output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { if (data_len == -1) rb_ary_push(output, Qnil); /* No data associated with path */ else rb_ary_push(output, rb_str_new(data, data_len)); rb_ary_push(output, zkrb_stat_to_rarray(&stat)); } free(data); return output; }
void ZKClient::Get(const std::string& _node, std::string* _data, sp_int32* _version, VCallback<> watcher, VCallback<sp_int32> cb) { LOG(INFO) << "Getting zknode " << _node << std::endl; ZKClientGetStructure* get_structure = new ZKClientGetStructure(); get_structure->result_ = _data; get_structure->version_ = _version; get_structure->cb_ = CreateCallback(this, &ZKClient::ZkActionCb, std::move(cb)); sp_int32 rc; if (!watcher) { rc = zoo_aget(zk_handle_, _node.c_str(), 0, GetCompletionWatcher, get_structure); } else { rc = zoo_awget(zk_handle_, _node.c_str(), CallWatcher, CreateCallback(this, &ZKClient::ZkWatcherCb, std::move(watcher)), GetCompletionWatcher, get_structure); } if (rc) { // There is nothing we can do here. Continuing will only make // other things fail LOG(FATAL) << "zoo_aget/zoo_awget returned non-zero " << rc << " errno: " << errno << " while getting " << _node << "\n"; } }
void ZkClient::subscribeDataChanges( const folly::fbstring& path, DataChangeCallback dataChangeCallback) { { toft::Mutex::Locker locker(&dataChangeCallbackMapMutex_); dataChangeCallbackMap_[path] = std::move(dataChangeCallback); } DataChangeCallbackContext* context = new DataChangeCallbackContext(); context->path = path; context->zkClient = this; zhandle_t* zhandle = zHandle_.get(); CHECK(nullptr != zhandle) << "zhandle is NULL"; int returnCode = zoo_aget( zhandle, path.c_str(), 1, ZkClient::dataChangeCallback, context ); CHECK(ZOK == returnCode) << "zoo_aget() failed with error: " << zooErrorCodeToString(returnCode); }
void processline(char *line) { int rc; int async = ((line[0] == 'a') && !(startsWith(line, "addauth "))); if (async) { line++; } if (startsWith(line, "help")) { fprintf(stderr, " create [+[e|s]] <path>\n"); fprintf(stderr, " delete <path>\n"); fprintf(stderr, " set <path> <data>\n"); fprintf(stderr, " get <path>\n"); fprintf(stderr, " ls <path>\n"); fprintf(stderr, " ls2 <path>\n"); fprintf(stderr, " sync <path>\n"); fprintf(stderr, " exists <path>\n"); fprintf(stderr, " wexists <path>\n"); fprintf(stderr, " myid\n"); fprintf(stderr, " verbose\n"); fprintf(stderr, " addauth <id> <scheme>\n"); fprintf(stderr, " quit\n"); fprintf(stderr, "\n"); fprintf(stderr, " prefix the command with the character 'a' to run the command asynchronously.\n"); fprintf(stderr, " run the 'verbose' command to toggle verbose logging.\n"); fprintf(stderr, " i.e. 'aget /foo' to get /foo asynchronously\n"); } else if (startsWith(line, "verbose")) { if (verbose) { verbose = 0; zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); fprintf(stderr, "logging level set to WARN\n"); } else { verbose = 1; zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG); fprintf(stderr, "logging level set to DEBUG\n"); } } else if (startsWith(line, "get ")) { line += 4; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } rc = zoo_aget(zh, line, 1, my_data_completion, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "set ")) { char *ptr; line += 4; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } ptr = strchr(line, ' '); if (!ptr) { fprintf(stderr, "No data found after path\n"); return; } *ptr = '\0'; ptr++; if (async) { rc = zoo_aset(zh, line, ptr, strlen(ptr), -1, my_stat_completion, strdup(line)); } else { struct Stat stat; rc = zoo_set2(zh, line, ptr, strlen(ptr), -1, &stat); } if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "ls ")) { line += 3; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } gettimeofday(&startTime, 0); rc= zoo_aget_children(zh, line, 1, my_strings_completion, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "ls2 ")) { line += 4; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } gettimeofday(&startTime, 0); rc= zoo_aget_children2(zh, line, 1, my_strings_stat_completion, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "create ")) { int flags = 0; line += 7; if (line[0] == '+') { line++; if (line[0] == 'e') { flags |= ZOO_EPHEMERAL; line++; } if (line[0] == 's') { flags |= ZOO_SEQUENCE; line++; } line++; } if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } fprintf(stderr, "Creating [%s] node\n", line); // { // struct ACL _CREATE_ONLY_ACL_ACL[] = {{ZOO_PERM_CREATE, ZOO_ANYONE_ID_UNSAFE}}; // struct ACL_vector CREATE_ONLY_ACL = {1,_CREATE_ONLY_ACL_ACL}; // rc = zoo_acreate(zh, line, "new", 3, &CREATE_ONLY_ACL, flags, // my_string_completion, strdup(line)); // } rc = zoo_acreate(zh, line, "new", 3, &ZOO_OPEN_ACL_UNSAFE, flags, my_string_completion_free_data, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "delete ")) { line += 7; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } if (async) { rc = zoo_adelete(zh, line, -1, my_void_completion, strdup(line)); } else { rc = zoo_delete(zh, line, -1); } if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "sync ")) { line += 5; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } rc = zoo_async(zh, line, my_string_completion_free_data, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "wexists ")) { #ifdef THREADED struct Stat stat; #endif line += 8; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } #ifndef THREADED rc = zoo_awexists(zh, line, watcher, (void*) 0, my_stat_completion, strdup(line)); #else rc = zoo_wexists(zh, line, watcher, (void*) 0, &stat); #endif if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "exists ")) { #ifdef THREADED struct Stat stat; #endif line += 7; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } #ifndef THREADED rc = zoo_aexists(zh, line, 1, my_stat_completion, strdup(line)); #else rc = zoo_exists(zh, line, 1, &stat); #endif if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (strcmp(line, "myid") == 0) { printf("session Id = %llx\n", _LL_CAST_ zoo_client_id(zh)->client_id); } else if (strcmp(line, "reinit") == 0) { zookeeper_close(zh); // we can't send myid to the server here -- zookeeper_close() removes // the session on the server. We must start anew. zh = zookeeper_init(hostPort, watcher, 30000, 0, 0, 0); } else if (startsWith(line, "quit")) { fprintf(stderr, "Quitting...\n"); shutdownThisThing=1; } else if (startsWith(line, "od")) { const char val[]="fire off"; fprintf(stderr, "Overdosing...\n"); rc = zoo_aset(zh, "/od", val, sizeof(val)-1, -1, od_completion, 0); if (rc) fprintf(stderr, "od command failed: %d\n", rc); } else if (startsWith(line, "addauth ")) { char *ptr; line += 8; ptr = strchr(line, ' '); if (ptr) { *ptr = '\0'; ptr++; } zoo_add_auth(zh, line, ptr, ptr ? strlen(ptr) : 0, NULL, NULL); } }
static void sendRequest(const char* data) { zoo_aset(zh, "/od", data, strlen(data), -1, my_silent_stat_completion, strdup("/od")); zoo_aget(zh, "/od", 1, my_silent_data_completion, strdup("/od")); }
void processline(char *line) { int rc; int async = ((line[0] == 'a') && !(startsWith(line, "addauth "))); if (async) { line++; } if (startsWith(line, "help")) { fprintf(stderr, " create [+[e|s]] <path>\n"); fprintf(stderr, " create2 [+[e|s]] <path>\n"); fprintf(stderr, " delete <path>\n"); fprintf(stderr, " set <path> <data>\n"); fprintf(stderr, " get <path>\n"); fprintf(stderr, " ls <path>\n"); fprintf(stderr, " ls2 <path>\n"); fprintf(stderr, " sync <path>\n"); fprintf(stderr, " exists <path>\n"); fprintf(stderr, " wexists <path>\n"); fprintf(stderr, " myid\n"); fprintf(stderr, " verbose\n"); fprintf(stderr, " addauth <id> <scheme>\n"); fprintf(stderr, " config\n"); fprintf(stderr, " reconfig [-file <path> | -members <serverId=host:port1:port2;port3>,... | " " -add <serverId=host:port1:port2;port3>,... | -remove <serverId>,...] [-version <version>]\n"); fprintf(stderr, " quit\n"); fprintf(stderr, "\n"); fprintf(stderr, " prefix the command with the character 'a' to run the command asynchronously.\n"); fprintf(stderr, " run the 'verbose' command to toggle verbose logging.\n"); fprintf(stderr, " i.e. 'aget /foo' to get /foo asynchronously\n"); } else if (startsWith(line, "verbose")) { if (verbose) { verbose = 0; zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); fprintf(stderr, "logging level set to WARN\n"); } else { verbose = 1; zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG); fprintf(stderr, "logging level set to DEBUG\n"); } } else if (startsWith(line, "get ")) { line += 4; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } rc = zoo_aget(zh, line, 1, my_data_completion, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (strcmp(line, "config") == 0) { gettimeofday(&startTime, 0); rc = zoo_agetconfig(zh, 1, my_data_completion, strdup(ZOO_CONFIG_NODE)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "reconfig ")) { int syntaxError = 0; char* p = NULL; char* joining = NULL; char* leaving = NULL; char* members = NULL; size_t members_size = 0; int mode = 0; // 0 = not set, 1 = incremental, 2 = non-incremental int64_t version = -1; line += 9; p = strtok (strdup(line)," "); while (p != NULL) { if (strcmp(p, "-add")==0) { p = strtok (NULL," "); if (mode == 2 || p == NULL) { syntaxError = 1; break; } mode = 1; joining = strdup(p); } else if (strcmp(p, "-remove")==0){ p = strtok (NULL," "); if (mode == 2 || p == NULL) { syntaxError = 1; break; } mode = 1; leaving = strdup(p); } else if (strcmp(p, "-members")==0) { p = strtok (NULL," "); if (mode == 1 || p == NULL) { syntaxError = 1; break; } mode = 2; members = strdup(p); } else if (strcmp(p, "-file")==0){ FILE *fp = NULL; p = strtok (NULL," "); if (mode == 1 || p == NULL) { syntaxError = 1; break; } mode = 2; fp = fopen(p, "r"); if (fp == NULL) { fprintf(stderr, "Error reading file: %s\n", p); syntaxError = 1; break; } fseek(fp, 0L, SEEK_END); /* Position to end of file */ members_size = ftell(fp); /* Get file length */ rewind(fp); /* Back to start of file */ members = calloc(members_size + 1, sizeof(char)); if(members == NULL ) { fprintf(stderr, "\nInsufficient memory to read file: %s\n", p); syntaxError = 1; fclose(fp); break; } /* Read the entire file into members * NOTE: -- fread returns number of items successfully read * not the number of bytes. We're requesting one item of * members_size bytes. So we expect the return value here * to be 1. */ if (fread(members, members_size, 1, fp) != 1){ fprintf(stderr, "Error reading file: %s\n", p); syntaxError = 1; fclose(fp); break; } fclose(fp); } else if (strcmp(p, "-version")==0){ p = strtok (NULL," "); if (version != -1 || p == NULL){ syntaxError = 1; break; } #ifdef WIN32 version = _strtoui64(p, NULL, 16); #else version = strtoull(p, NULL, 16); #endif if (version < 0) { syntaxError = 1; break; } } else { syntaxError = 1; break; } p = strtok (NULL," "); } if (syntaxError) return; rc = zoo_areconfig(zh, joining, leaving, members, version, my_data_completion, strdup(line)); free(joining); free(leaving); free(members); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "set ")) { char *ptr; line += 4; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } ptr = strchr(line, ' '); if (!ptr) { fprintf(stderr, "No data found after path\n"); return; } *ptr = '\0'; ptr++; if (async) { rc = zoo_aset(zh, line, ptr, strlen(ptr), -1, my_stat_completion, strdup(line)); } else { struct Stat stat; rc = zoo_set2(zh, line, ptr, strlen(ptr), -1, &stat); } if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "ls ")) { line += 3; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } gettimeofday(&startTime, 0); rc= zoo_aget_children(zh, line, 1, my_strings_completion, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "ls2 ")) { line += 4; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } gettimeofday(&startTime, 0); rc= zoo_aget_children2(zh, line, 1, my_strings_stat_completion, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "create ") || startsWith(line, "create2 ")) { int flags = 0; int is_create2 = startsWith(line, "create2 "); line += is_create2 ? 8 : 7; if (line[0] == '+') { line++; if (line[0] == 'e') { flags |= ZOO_EPHEMERAL; line++; } if (line[0] == 's') { flags |= ZOO_SEQUENCE; line++; } line++; } if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } fprintf(stderr, "Creating [%s] node\n", line); // { // struct ACL _CREATE_ONLY_ACL_ACL[] = {{ZOO_PERM_CREATE, ZOO_ANYONE_ID_UNSAFE}}; // struct ACL_vector CREATE_ONLY_ACL = {1,_CREATE_ONLY_ACL_ACL}; // rc = zoo_acreate(zh, line, "new", 3, &CREATE_ONLY_ACL, flags, // my_string_completion, strdup(line)); // } if (is_create2) { rc = zoo_acreate2(zh, line, "new", 3, &ZOO_OPEN_ACL_UNSAFE, flags, my_string_stat_completion_free_data, strdup(line)); } else { rc = zoo_acreate(zh, line, "new", 3, &ZOO_OPEN_ACL_UNSAFE, flags, my_string_completion_free_data, strdup(line)); } if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "delete ")) { line += 7; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } if (async) { rc = zoo_adelete(zh, line, -1, my_void_completion, strdup(line)); } else { rc = zoo_delete(zh, line, -1); } if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "sync ")) { line += 5; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } rc = zoo_async(zh, line, my_string_completion_free_data, strdup(line)); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "wexists ")) { #ifdef THREADED struct Stat stat; #endif line += 8; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } #ifndef THREADED rc = zoo_awexists(zh, line, watcher, (void*) 0, my_stat_completion, strdup(line)); #else rc = zoo_wexists(zh, line, watcher, (void*) 0, &stat); #endif if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (startsWith(line, "exists ")) { #ifdef THREADED struct Stat stat; #endif line += 7; if (line[0] != '/') { fprintf(stderr, "Path must start with /, found: %s\n", line); return; } #ifndef THREADED rc = zoo_aexists(zh, line, 1, my_stat_completion, strdup(line)); #else rc = zoo_exists(zh, line, 1, &stat); #endif if (rc) { fprintf(stderr, "Error %d for %s\n", rc, line); } } else if (strcmp(line, "myid") == 0) { printf("session Id = %llx\n", _LL_CAST_ zoo_client_id(zh)->client_id); } else if (strcmp(line, "reinit") == 0) { zookeeper_close(zh); // we can't send myid to the server here -- zookeeper_close() removes // the session on the server. We must start anew. zh = zookeeper_init(hostPort, watcher, 30000, 0, 0, 0); } else if (startsWith(line, "quit")) { fprintf(stderr, "Quitting...\n"); shutdownThisThing=1; } else if (startsWith(line, "od")) { const char val[]="fire off"; fprintf(stderr, "Overdosing...\n"); rc = zoo_aset(zh, "/od", val, sizeof(val)-1, -1, od_completion, 0); if (rc) fprintf(stderr, "od command failed: %d\n", rc); } else if (startsWith(line, "addauth ")) { char *ptr; line += 8; ptr = strchr(line, ' '); if (ptr) { *ptr = '\0'; ptr++; } zoo_add_auth(zh, line, ptr, ptr ? strlen(ptr) : 0, NULL, NULL); } }