Esempio n. 1
0
rstatus_t
dnode_peer_replace(void *rmsg)
{
	//rstatus_t status;
	struct ring_msg *msg = rmsg;
	struct server_pool *sp = msg->sp;
	struct node *node = array_get(&msg->nodes, 0);
	log_debug(LOG_VVERB, "dyn: peer has a replaced message '%.*s'", node->name.len, node->name.data);
	struct array *peers = &sp->peers;
	struct server *s = NULL;

	uint32_t i,nelem;
	//bool node_exist = false;
	//TODOs: use hash table here
	for (i=1, nelem = array_n(peers); i< nelem; i++) {
		struct server * peer = (struct server *) array_get(peers, i);
		if (string_compare(&peer->rack, &node->rack) == 0) {
			//TODOs: now only compare 1st token and support vnode later - use hash string on a tokens for comparison
			struct dyn_token *ptoken = (struct dyn_token *) array_get(&peer->tokens, 0);
			struct dyn_token *ntoken = &node->token;

			if (cmp_dyn_token(ptoken, ntoken) == 0) {
				s = peer; //found a node to replace
			}
		}
	}


	if (s != NULL) {
		log_debug(LOG_INFO, "Found an old node to replace '%.*s'", s->name.len, s->name.data);
		log_debug(LOG_INFO, "Replace with address '%.*s'", node->name.len, node->name.data);

		string_deinit(&s->pname);
		string_deinit(&s->name);
		string_copy(&s->pname, node->pname.data, node->pname.len);
		string_copy(&s->name, node->name.data, node->name.len);

		//TODOs: need to free the previous s->addr?
		//if (s->addr != NULL) {
		//   dn_free(s->addr);
		//}

		struct sockinfo  *info =  dn_alloc(sizeof(*info)); //need to free this
		dn_resolve(&s->name, s->port, info);
		s->family = info->family;
		s->addrlen = info->addrlen;
		s->addr = (struct sockaddr *)&info->addr;  //TODOs: fix this by copying, not reference


		dnode_peer_each_disconnect(s, NULL);
		dnode_peer_each_preconnect(s, NULL);
	} else {
		log_debug(LOG_INFO, "Unable to find any node matched the token");
	}

	return DN_OK;
}
Esempio n. 2
0
static int
dict_node_key_compare(void *privdata, const void *key1, const void *key2)
{
    DICT_NOTUSED(privdata);
    const struct gossip_node *node1 = key1;
    const struct gossip_node *node2 = key2;

    ASSERT(node1 == NULL || node2 == NULL);

    return (string_compare(&node1->dc, &node2->dc) == 0) &&
           (string_compare(&node1->rack, &node2->rack) == 0) &&
           (cmp_dyn_token(&node1->token, &node2->token) == 0);

}