void connect_manager::set_service_list(const char* addr_list, int count, int conn_timeout, int rw_timeout) { if (addr_list == NULL || *addr_list == 0) { logger("addr_list null"); return; } // 创建连接池服务集群 char* buf = acl_mystrdup(addr_list); char* addrs = acl_mystr_trim(buf); ACL_ARGV* tokens = acl_argv_split(addrs, ";,"); ACL_ITER iter; acl::string addr; acl_foreach(iter, tokens) { const char* ptr = (const char*) iter.data; int max = check_addr(ptr, addr, count); if (max < 0) { logger_error("invalid server addr: %s", addr.c_str()); continue; } (void) set(addr.c_str(), max, conn_timeout, rw_timeout); logger("add one service: %s, max connect: %d", addr.c_str(), max); } acl_argv_free(tokens); acl_myfree(buf); }
void redis_reshard::run() { if (get_masters_info() == false) return; show_nodes(); fflush(stdout); char buf[1024]; int nslots = 0; while (true) { printf("How many slots do you want to move (from 1 to 16384) ? "); fflush(stdout); int ret = acl_vstream_gets_nonl(ACL_VSTREAM_IN, buf, sizeof(buf)); if (ret == ACL_VSTREAM_EOF) exit(1); acl_mystr_trim(buf); nslots = atoi(buf); if (nslots > 0 && nslots < 16384) break; printf("invalid value: %d\r\n", ret); } acl::redis_node* target = NULL; while (true) { printf("What is the receiving node ID? "); fflush(stdout); int ret = acl_vstream_gets_nonl(ACL_VSTREAM_IN, buf, sizeof(buf)); if (ret == ACL_VSTREAM_EOF) exit(1); acl_mystr_trim(buf); target = find_node(buf); if (target != NULL) break; printf("...The specified node(%s) is not known or not " "a master, please try again.\r\n", buf); } assert(target != NULL); printf("Please input all the source node IDs.\r\n"); printf(" Type 'all' to use all the nodes as source nodes for the hash slots\r\n"); printf(" Type 'done' once you entered all the source node IDs.\r\n"); std::vector<acl::redis_node*> sources; while (true) { printf("Source node #%d: ", (int) sources.size() + 1); fflush(stdout); int ret = acl_vstream_gets_nonl(ACL_VSTREAM_IN, buf, sizeof(buf)); if (ret == ACL_VSTREAM_EOF) exit(1); acl_mystr_trim(buf); if (strcasecmp(buf, "done") == 0) break; if (strcasecmp(buf, "all") == 0) { copy_all(sources, target->get_id()); break; } acl::redis_node* source = find_node(buf); if (source == NULL) { printf("...The source node(%s) is not known\r\n", buf); continue; } if (strcmp(target->get_id(), buf) == 0) { printf("... It is not possible to use the target node as source node\r\n"); continue; } sources.push_back(source); } if (sources.empty()) { printf("*** No source nodes given, operation aborted\r\n"); exit(1); } redis_migrate migrate(masters_); migrate.move_slots(sources, *target, nslots); }