void delnodechild(cluster *_cluster, char *target, char *childnodenamelist) { if (!_cluster) return; char a[128] = ""; char *ch = childnodenamelist; int i = 0; while (*ch != '\0') { a[i++] = *ch; ch++; } node_s_inlist *parent; node_s_inlist *cur = _cluster->nodelisthead; int flag = 0; //char *nodename = strtok(a, "."); char *pos; while (nodename != NULL) { flag = 0; while (cur != NULL) { if (strcmp(cur->node->iden, nodename) == 0) { flag = 1; parent = cur; cur = cur->childern; break; } else { cur = cur->next; } } if (flag == 0) return; nodename = strtok(NULL, "."); } if (flag == 0) return; flag = 0; while (cur != NULL) { if (strcmp(cur->node->iden, target) == 0) { flag = 1; break; } cur = cur->next; } if (flag != 0) { conhash_del_node(parent->conhash, cur->node); if (cur->next != NULL) { node_s_inlist *gc; gc = cur->next; cur->node = cur->next->node; cur->conhash = cur->next->conhash; cur->childern = cur->next->childern; cur->next = cur->next->next; free_node_s_inlist(gc); } else { free_node_s_inlist(cur); } if (parent->childern->node == NULL) { removeclusternode(_cluster, parent->node->iden); } } }
int main() { int i; const struct node_s *node; char str[128]; long hashes[512]; /* init conhash instance */ struct conhash_s *conhash = conhash_init(NULL); if(conhash) { /* set nodes */ conhash_set_node(&g_nodes[0], "memcache_1", 32); conhash_set_node(&g_nodes[1], "memcache_2", 24); conhash_set_node(&g_nodes[2], "memcache_3", 25); conhash_set_node(&g_nodes[3], "memcache_4", 10); conhash_set_node(&g_nodes[4], "memcache_5", 48); /* add nodes */ conhash_add_node(conhash, &g_nodes[0]); conhash_add_node(conhash, &g_nodes[1]); conhash_add_node(conhash, &g_nodes[2]); conhash_add_node(conhash, &g_nodes[3]); conhash_add_node(conhash, &g_nodes[4]); printf("virtual nodes number %d\n", conhash_get_vnodes_num(conhash)); printf("the hashing results--------------------------------------:\n"); /* try object */ for(i = 0; i < 20; i++) { sprintf(str, "James.km%03d", i); node = conhash_lookup(conhash, str); if(node) printf("[%16s] is in node: [%16s]\n", str, node->iden); } conhash_get_vnodes(conhash, hashes, sizeof(hashes)/sizeof(hashes[0])); conhash_del_node(conhash, &g_nodes[2]); printf("remove node[%s], virtual nodes number %d\n", g_nodes[2].iden, conhash_get_vnodes_num(conhash)); printf("the hashing results--------------------------------------:\n"); for(i = 0; i < 20; i++) { sprintf(str, "James.km%03d", i); node = conhash_lookup(conhash, str); if(node) printf("[%16s] is in node: [%16s]\n", str, node->iden); } } conhash_fini(conhash); return 0; }
int AdConHash::Del(void* pData) { map<void *, struct node_s *>::iterator iter; pthread_rwlock_wrlock(&m_pLock); if (m_pHandle == NULL) { pthread_rwlock_unlock(&m_pLock); return AD_FAILURE; } iter = m_mNodes.find(pData); if(iter != m_mNodes.end()) { conhash_del_node(m_pHandle, iter->second); m_mNodes.erase(iter); } pthread_rwlock_unlock(&m_pLock); return AD_SUCCESS; }
void removeclusternode(cluster *_cluster, char * nodenamelist) { if (!_cluster) return; char a[128] = ""; char *ch = nodenamelist; int i = 0; while (*ch != '\0') { a[i++] = *ch; ch++; } char *nodename = strtok(a, "."); while (nodename != NULL) { node_s_inlist *cur = _cluster->nodelisthead; node_s_inlist *parent; while (cur != NULL) { if (strcmp(cur->node->iden, nodename) == 0) { conhash_del_node(_cluster->conhash, cur->node); if (cur->next != NULL) { node_s_inlist *gc; gc = cur->next; cur->node = cur->next->node; cur->conhash = cur->next->conhash; cur->childern = cur->next->childern; cur->next = cur->next->next; free_node_s_inlist(gc); } else { free_node_s_inlist(cur); } cur = cur->next; parent->next = cur; break; } parent = cur; cur = cur->next; parent->next = cur; } nodename = strtok(NULL, "."); } }
int main() { int i; const struct node_s *node; char str[128]; long hashes[512]; /* init conhash instance */ struct conhash_s *conhash = conhash_init(NULL); if(conhash) { /* set nodes */ conhash_set_node(&g_nodes[0], "titanic", 32); conhash_set_node(&g_nodes[1], "terminator2018", 24); conhash_set_node(&g_nodes[2], "Xenomorph", 25); conhash_set_node(&g_nodes[3], "True Lies", 10); conhash_set_node(&g_nodes[4], "avantar", 48); /* add nodes */ conhash_add_node(conhash, &g_nodes[0]); conhash_add_node(conhash, &g_nodes[1]); conhash_add_node(conhash, &g_nodes[2]); conhash_add_node(conhash, &g_nodes[3]); conhash_add_node(conhash, &g_nodes[4]); printf("virtual nodes number %d\n", conhash_get_vnodes_num(conhash)); printf("origin: the hashing results--------------------------------------:\n"); /* try object */ for(i = 0; i < 20; i++) { sprintf(str, "James.km%03d", i); node = conhash_lookup(conhash, str); if(node) printf("[%16s] is in node: [%16s]\n", str, node->iden); } conhash_get_vnodes(conhash, hashes, sizeof(hashes)/sizeof(hashes[0])); /******************delete node********************/ conhash_del_node(conhash, &g_nodes[2]); printf("remove node[%s], virtual nodes number %d\n", g_nodes[2].iden, conhash_get_vnodes_num(conhash)); printf("remove: the hashing results--------------------------------------:\n"); for(i = 0; i < 20; i++) { sprintf(str, "James.km%03d", i); node = conhash_lookup(conhash, str); if(node) printf("[%16s] is in node: [%16s]\n", str, node->iden); } /*******************add node***********************/ conhash_add_node(conhash, &g_nodes[2]); printf("add node[%s], virtual nodes number %d\n", g_nodes[2].iden, conhash_get_vnodes_num(conhash)); printf("add: the hashing results--------------------------------------:\n"); for(i = 0; i < 20; i++) { sprintf(str, "James.km%03d", i); node = conhash_lookup(conhash, str); if(node) printf("[%16s] is in node: [%16s]\n", str, node->iden); } } conhash_fini(conhash); return 0; }