コード例 #1
0
static struct server *
dnode_peer_pool_server(struct server_pool *pool, struct rack *rack, uint8_t *key, uint32_t keylen)
{
	struct server *server;
	uint32_t hash, idx;
	struct dyn_token *token = NULL;

	ASSERT(array_n(&pool->peers) != 0);

	//ASSERT(rack != NULL);

	switch (pool->dist_type) {
	case DIST_KETAMA:
		token = dnode_peer_pool_hash(pool, key, keylen);
		hash = token->mag[0];
		idx = ketama_dispatch(rack->continuum, rack->ncontinuum, hash);
		break;

	case DIST_VNODE:
		if (keylen == 0) {
			idx = 0; //for no argument command
			break;
		}
		token = dnode_peer_pool_hash(pool, key, keylen);
		//print_dyn_token(token, 1);
		idx = vnode_dispatch(rack->continuum, rack->ncontinuum, token);
		//loga("found idx %d for rack '%.*s' ", idx, rack->name->len, rack->name->data);
		break;

	case DIST_MODULA:
		token = dnode_peer_pool_hash(pool, key, keylen);
		hash = token->mag[0];
		idx = modula_dispatch(rack->continuum, rack->ncontinuum, hash);
		break;

	case DIST_RANDOM:
		idx = random_dispatch(rack->continuum, rack->ncontinuum, 0);
		break;

	case DIST_SINGLE:
		idx = 0;
		break;

	default:
		NOT_REACHED();
		return NULL;
	}

	//TODOs: should reuse the token
	if (token != NULL) {
		deinit_dyn_token(token);
		dn_free(token);
	}
	ASSERT(idx < array_n(&pool->peers));

	server = array_get(&pool->peers, idx);

	log_debug(LOG_VERB, "dyn: key '%.*s' on dist %d maps to server '%.*s'", keylen,
			key, pool->dist_type, server->pname.len, server->pname.data);

	return server;
}
コード例 #2
0
ファイル: dyn_gossip.c プロジェクト: amimimor/dynomite
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;
}