Пример #1
0
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;
}
Пример #3
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;
}
Пример #4
0
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, ".");
	}
}
Пример #5
0
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;
}