static struct dyn_token * dnode_peer_pool_hash(struct server_pool *pool, uint8_t *key, uint32_t keylen) { ASSERT(array_n(&pool->peers) != 0); ASSERT(key != NULL && keylen != 0); struct dyn_token *token = dn_alloc(sizeof(struct dyn_token)); if (token == NULL) { return NULL; } init_dyn_token(token); rstatus_t status = pool->key_hash((char *)key, keylen, token); if (status != DN_OK) { dn_free(token); return NULL; } return token; }
static rstatus_t gossip_update_seeds(struct server_pool *sp, struct mbuf *seeds) { struct string rack_name; struct string dc_name; struct string port_str; struct string address; struct string ip; //struct array tokens; struct dyn_token token; struct string temp; string_init(&rack_name); string_init(&dc_name); string_init(&port_str); string_init(&address); string_init(&ip); init_dyn_token(&token); uint8_t *p, *q, *start; start = seeds->start; p = seeds->last - 1; q = dn_strrchr(p, start, '|'); uint8_t *seed_node; uint32_t seed_node_len; while (q > start) { seed_node = q + 1; seed_node_len = (uint32_t)(p - seed_node + 1); string_copy(&temp, seed_node, seed_node_len); //array_init(&tokens, 1, sizeof(struct dyn_token)); init_dyn_token(&token); parse_seeds(&temp, &dc_name, &rack_name, &port_str, &address, &ip, &token); log_debug(LOG_VERB, "address : '%.*s'", address.len, address.data); log_debug(LOG_VERB, "rack_name : '%.*s'", rack_name.len, rack_name.data); log_debug(LOG_VERB, "dc_name : '%.*s'", dc_name.len, dc_name.data); log_debug(LOG_VERB, "ip : '%.*s'", ip.len, ip.data); //struct dyn_token *token = array_get(&tokens, 0); gossip_add_node_if_absent(sp, &dc_name, &rack_name, &address, &ip, &port_str, &token, NORMAL, (uint64_t) time(NULL)); p = q - 1; q = dn_strrchr(p, start, '|'); string_deinit(&temp); //array_deinit(&tokens); deinit_dyn_token(&token); string_deinit(&rack_name); string_deinit(&dc_name); string_deinit(&port_str); string_deinit(&address); string_deinit(&ip); } if (q == NULL) { seed_node_len = (uint32_t)(p - start + 1); seed_node = start; string_copy(&temp, seed_node, seed_node_len); //array_init(&tokens, 1, sizeof(struct dyn_token)); init_dyn_token(&token); parse_seeds(&temp, &dc_name, &rack_name, &port_str, &address, &ip, &token); //struct dyn_token *token = array_get(&tokens, 0); gossip_add_node_if_absent(sp, &dc_name, &rack_name, &address, &ip, &port_str, &token, NORMAL, (uint64_t) time(NULL)); } string_deinit(&temp); //array_deinit(&tokens); deinit_dyn_token(&token); string_deinit(&rack_name); string_deinit(&dc_name); string_deinit(&port_str); string_deinit(&address); string_deinit(&ip); gossip_debug(); return DN_OK; }