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; }
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); }