int main(int argc, const char *argv[]) { const char* host = "127.0.0.1:2181"; char *data = "alive"; //const char* host = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184,127.0.0.1:2185"; int timeout = 30000; zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); zhandle_t* zkhandle = zookeeper_init(host, watcher_g, timeout, 0, "hello zookeeper.", 0); if (zkhandle == NULL) { fprintf(stderr, "Error when connecting to zookeeper servers...\n"); exit(EXIT_FAILURE); } int ret = zoo_acreate(zkhandle, "/server", data, strlen(data), &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, completion, "zoo_acreate"); if (ret) { fprintf(stderr, "Error %d for %s\n", ret, "acreate"); exit(EXIT_FAILURE); } do { //sleep 5, then down accept_query(); sleep(5); } while(false); zookeeper_close(zkhandle); }
int create_taskRootNode() { int ret = 0; const char* tasksRoot = "/TasksRoot"; struct Stat stat; ret = zoo_exists(g_zhdl, tasksRoot, true, &stat); if(ret == ZOK) { printf("create_taskRootNode %s already create\n", tasksRoot); } else if(ret == ZNONODE) { ret = zoo_acreate(g_zhdl, tasksRoot, "0", strlen("0"), &ZOO_OPEN_ACL_UNSAFE, 0, watcher_fn_create_taskroot, "TasksRoot data"); if(ret) { printf("create_taskRootNode%s error", tasksRoot); } } else { printf("create_root error\n"); } return ret; }
/** * Callback with the list of children. If the local announcement is not present, create an ephemeral node on zk. */ static void node_completion(int rc, const struct String_vector *strings, const void *data) { if (rc) { LOG_WARN(("Error %s while retrieving children!", zerror(rc))); return; } unsigned long tick = *((unsigned long *)data); LOG_DEBUG(("Callback Tick (%d/%lx)", tick)); if (!strings) { return; } for (int i = 0; i < strings->count; i++) { if (!strcmp(strings->data[i], announce_name)) { LOG_DEBUG(("Found local announcement %s", announce_name)); return; } } // Need to add local announcement. LOG_DEBUG(("Local announcement not found, creating %s", announce_path)); int rc2 = zoo_acreate(zh, announce_path, announce_data, strlen(announce_data), &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, void_completion, NULL); if (rc2) { LOG_WARN(("Error %s while creating announcement!", zerror(rc))); } }
int enter() { int ret = 0; char childNode[128] = {0}; struct String_vector *strings; sprintf(childNode, "%s/hello", g_root); ret = zoo_acreate(g_zhdl, childNode, "child", strlen("child"), &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL|ZOO_SEQUENCE, watcher_fn_create_child, "child node create"); if(ret) { printf("enter create child node %s error", childNode); return ret; } g_enterFlag = 1; ret = zoo_aget_children(g_zhdl, g_root, false, completion_fn_enter, "root child node"); //ret = zoo_wget_children(g_zhdl, g_root, watcher_fn_znode, NULL, strings); if(ret != ZOK) { return -1; } while(g_enterFlag == 1) { usleep(10); } printf("enter finish\n"); return ret; }
int create_root(const char* node_name, const char* data) { int ret = 0; struct Stat stat; ret = zoo_exists(g_zhdl, node_name, true, &stat); if(ret == ZOK) { printf("create_root %s already create\n", node_name); } else if(ret == ZNONODE) { ret = zoo_acreate(g_zhdl, node_name, data, strlen(data), &ZOO_OPEN_ACL_UNSAFE, 0, watcher_fn_create_root, "root node create"); if(ret) { printf("create_root %s error", node_name); } } else { printf("create_root error\n"); } return ret; }
/* session expiration is handled for us (and a new session created) */ void my_watcher(zhandle_t *zzh, int type, int state, const char *path) { session_context *context; watcher_data *wdata; int rc; if (type != ZOO_SESSION_EVENT) return; if (state == ZOO_CONNECTED_STATE) { context = (session_context *)zoo_get_context(zzh); wdata = (watcher_data *)context->data; if (!wdata->created) { int flags = ZOO_EPHEMERAL|ZOO_SEQUENCE; rc = zoo_acreate(zzh, context->path, "test", 4, &ZOO_OPEN_ACL_UNSAFE, flags, create_cb, NULL); if (rc) warn("Failed to create path"); else wdata->created = 1; } } }
void ZookeeperClient::RecursiveCreateCB(int rc, const char *value, const void *data) { MultiCreatCBData* cb = (MultiCreatCBData*) data; if (rc == ZOK || rc == ZNODEEXISTS) { std::string retpath = cb->orgin_path; if (cb->pending_dirs.empty()) { if (NULL != value) { retpath = value; } cb->zk->m_callback->OnCreated(retpath, rc); DELETE(cb); } else { std::string& first_dir = cb->pending_dirs.back(); cb->pending_dirs.pop_back(); bool need_value = cb->pending_dirs.empty(); int flags = need_value ? cb->flags : 0; zoo_acreate(cb->zk->m_zk, first_dir.c_str(), need_value ? cb->value.data() : NULL, need_value ? cb->value.size() : 0, &ZOO_OPEN_ACL_UNSAFE, flags, ZookeeperClient::RecursiveCreateCB, cb); } } else { cb->zk->m_callback->OnCreated(cb->orgin_path, rc); DELETE(cb); } }
int ZookeeperClient::Create(const std::string& path, const std::string& value, const ZKACLArray& acls, int flags, bool recursive) { if (NULL == m_zk) { return -1; } if (recursive) { std::vector<zoo_op_t> ops; MultiCreatCBData* cbdata = new MultiCreatCBData; cbdata->zk = this; cbdata->flags = flags; cbdata->orgin_path = path; cbdata->value = value; std::string base_dir = path; cbdata->pending_dirs.push_back(base_dir); char* dir = dirname((char*) base_dir.c_str()); while (NULL != dir && dir[0] != '.' && strcasecmp(dir, "/")) { cbdata->pending_dirs.push_back(dir); dir = dirname(dir); } std::string& first_dir = cbdata->pending_dirs.back(); cbdata->pending_dirs.pop_back(); bool need_value = cbdata->pending_dirs.empty(); return zoo_acreate(m_zk, first_dir.c_str(), need_value ? value.data() : NULL, need_value ? value.size() : 0, &ZOO_OPEN_ACL_UNSAFE, need_value ? flags : 0, ZookeeperClient::RecursiveCreateCB, cbdata); } std::pair<std::string, ZookeeperClient*>* cb = new std::pair< std::string, ZookeeperClient*>; cb->first = path; cb->second = this; struct ACL_vector* acl_entries = &ZOO_OPEN_ACL_UNSAFE; int ret = zoo_acreate(m_zk, path.c_str(), value.data(), value.size(), acl_entries, flags, ZookeeperClient::CreateCB, cb); return ret; }
void create_parent(const char * path, const char * value) { zoo_acreate(zh, path, value, 0, &ZOO_OPEN_ACL_UNSAFE, 0, create_parent_completion, NULL); }
void task_assignment(struct task_info *task){ //Add task to worker list char * path = make_path(4, "/assign/" , task->worker, "/", task->name); zoo_acreate(zh, path, task->value, task->value_len, &ZOO_OPEN_ACL_UNSAFE, 0, task_assignment_completion, (const void*) task); free(path); }
int ZkHelper::registe_service(const std::string& sevice_name, const std::string& endpoint) { zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); zk_ = zookeeper_init("127.0.0.1:2181", &g_zk_watcher, 1000, 0, 0, 0); if( NULL == zk_ ) { printf("zookeeper_init error\n"); return errno; } int flag = ZOO_EPHEMERAL; int rc = zoo_acreate(zk_, sevice_name.c_str(), endpoint.c_str(), endpoint.size(), &ZOO_OPEN_ACL_UNSAFE, flag, acreate_completion, endpoint.c_str()); return rc; }
int doCreateNodes(const char* root, int count){ char nodeName[1024]; int i; for(i=0; i<count;i++){ int rc = 0; snprintf(nodeName, sizeof(nodeName),"%s/%d",root,i); incCounter(1); rc=zoo_acreate(zh, nodeName, "first", 5, &ZOO_OPEN_ACL_UNSAFE, 0, create_completion, 0); if(i%1000==0){ LOG_INFO(LOGSTREAM, "Created %s", nodeName); } if(rc!=ZOK) return rc; } return ZOK; }
// Creates a node void ZKClient::CreateNode(const std::string& _node, const std::string& _value, bool _is_ephimeral, VCallback<sp_int32> cb) { sp_int32 flags = 0; if (_is_ephimeral) { flags |= ZOO_EPHEMERAL; } LOG(INFO) << "Creating zknode " << _node << std::endl; sp_int32 rc = zoo_acreate(zk_handle_, _node.c_str(), _value.c_str(), _value.size(), &ZOO_OPEN_ACL_UNSAFE, flags, StringCompletionWatcher, CreateCallback(this, &ZKClient::ZkActionCb, std::move(cb))); if (rc) { // There is nothing we can do here. Continuing will only make // other things fail LOG(FATAL) << "zoo_acreate returned non-zero " << rc << " errno: " << errno << " while creating node " << _node << "\n"; } }
void run_for_master() { if(!connected) { LOG_WARN(("Client not connected to ZooKeeper")); return; } char server_id_string[9]; snprintf(server_id_string, 9, "%x", server_id); zoo_acreate(zh, "/master", (const char *) server_id_string, strlen(server_id_string) + 1, &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, master_create_completion, NULL); }
static VALUE method_create(VALUE self, VALUE reqid, VALUE path, VALUE data, VALUE async, VALUE acls, VALUE flags) { VALUE watch = Qfalse; const char *data_ptr ; size_t data_len ; struct ACL_vector *aclptr = NULL; char realpath[16384]; int rc; VALUE output ; STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type); if (data != Qnil) Check_Type(data, T_STRING); Check_Type(flags, T_FIXNUM); data_ptr = (data == Qnil) ? NULL : RSTRING_PTR(data); data_len = (data == Qnil) ? -1 : RSTRING_LEN(data); if (acls != Qnil) { aclptr = zkrb_ruby_to_aclvector(acls); } switch (call_type) { case SYNC: rc = zoo_create(zk->zh, RSTRING_PTR(path), data_ptr, data_len, aclptr, FIX2INT(flags), realpath, sizeof(realpath)); break; case ASYNC: rc = zoo_acreate(zk->zh, RSTRING_PTR(path), data_ptr, data_len, aclptr, FIX2INT(flags), zkrb_string_callback, data_ctx); break; default: /* TODO(wickman) raise proper argument error */ return Qnil; break; } if (aclptr) { deallocate_ACL_vector(aclptr); free(aclptr); } output = rb_ary_new(); rb_ary_push(output, INT2FIX(rc)); if (IS_SYNC(call_type) && rc == ZOK) { return rb_ary_push(output, rb_str_new2(realpath)); } return output; }
int main(int argc, const char *argv[]) { const char* host = "127.0.0.1:2181"; int timeout = 1000; printf("\nzookeeper_init\n"); zhandle_t* handle = zookeeper_init(host, watcher, timeout, 0, "hello_zk", 0); if (!handle) { fprintf(stderr, "failed to init zookeeper\n"); exit(EXIT_FAILURE); } printf("\nzoo_acreate\n"); int ret = zoo_acreate(handle, "/root", "hello_u_zk", 5, &ZOO_OPEN_ACL_UNSAFE, 0, string_complete, "acreate"); if (ret) { fprintf(stderr, "zook_create() = %d\n", ret); exit(EXIT_FAILURE); } sleep(1); printf("\nzoo_aexists\n"); ret = zoo_aexists(handle, "/root", 1, stat_complete, "aexists"); if (ret) { fprintf(stderr, "zoo_aexists() = %d\n", ret); exit(EXIT_FAILURE); } sleep(1); printf("\nzoo_adelete\n"); ret = zoo_adelete(handle, "/root", -1, void_complete, "adelete"); if (ret) { fprintf(stderr, "zoo_delete() = %d\n", ret); exit(EXIT_FAILURE); } sleep(1); printf("\nzookeeper_close\n"); zookeeper_close(handle); return 0; }
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); } }
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); } }