废话不说,直接上菜
核心函数,用于选主。
void sscs_zk_choose_master(zhandle_t *zkhandle,const char *path)
{
int ret,i=0;
int zk_log_str_len = zk_buffer_size;
int ip_pid_len = zk_host_size;
char master_path[zk_buffer_size] ={0};
char ip_pid[zk_host_size] = {0};
char tmp[zk_host_size]={0};
struct String_vector procs;
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master()");
ret = zoo_get_children(zkhandle,path,1,&procs);
if(ret != ZOK || procs.count == 0){
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master():Failed to get CHILDREN. PATH:%s RET:%d",path,ret);
return;
}
zk_getlocalhost(g_zk_localhost,sizeof(g_zk_localhost));
//find the smallest znode
strncpy(tmp,procs.data[0],strlen(procs.data[0]));
for(i = 1; i < procs.count; ++i){
if(strncmp(tmp,procs.data[i],strlen(procs.data[i]))>0){
strncpy(tmp,procs.data[i],strlen(procs.data[i]));
}
}
snprintf(master_path,zk_buffer_size,"%s/%s",path,tmp);
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master():Master PATH %s",master_path);
ret = zoo_get(zkhandle,master_path,0,ip_pid,&ip_pid_len,NULL);
if(ret != ZOK){
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master():Failed to get DATA. PATH:%s RET:%d",master_path,ret);
return;
}else if(strncmp(ip_pid,g_zk_localhost,sizeof(g_zk_localhost))==0){
g_zk_mode = MODE_MASTER;
}else {
g_zk_mode = MODE_SLAVE;
}
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master():Master DATA %s, Local DATA %s",ip_pid,g_zk_localhost);
if(g_zk_mode == MODE_MASTER){
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master(): I am MASTER");
}
else if(g_zk_mode == MODE_SLAVE){
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master(): I am SLAVE");
}else {
ZK_DEBUG_PRINT("[SSCS]sscs_zk_choose_master(): Unknown");
}
return;
}
展示某节点下所有children
void sscs_zk_list_nodes(zhandle_t *zkhandle,const char *path)
{
int ret,i=0;
int master_len = zk_host_size;
int ip_pid_len = zk_host_size;
char zk_path[zk_buffer_size] ={0};
char master_path[zk_buffer_size] ={0};
char master_data[zk_host_size] = {0};
char ip_pid[zk_host_size] = {0};
struct String_vector procs;
ZK_DEBUG_PRINT("[SSCS]sscs_zk_list_nodes()");
ret = zoo_get_children(zkhandle,path,0,&procs);
if(ret != ZOK || procs.count == 0){
ZK_DEBUG_PRINT("[SSCS]sscs_zk_list_nodes():Failed to get CHILDREN. PATH:%s RET:%d",path,ret);
return;
}
//find the smallest znode
strncpy(zk_path,procs.data[0],strlen(procs.data[0]));
for(i = 1; i < procs.count;