Пример #1
0
rstatus_t
gossip_msg_peer_update(void *rmsg)
{
	rstatus_t status;
	struct ring_msg *msg = rmsg;
	struct server_pool *sp = msg->sp;

   	//TODOs: need to fix this as it is breaking warm bootstrap
	current_node->state = NORMAL;
	sp->ctx->dyn_state = NORMAL;

	int i=0;
	int n = array_n(&msg->nodes);
	for(i=0; i<n; i++) {
		struct node *node = array_get(&msg->nodes, i);
		log_debug(LOG_VVERB, "Processing msg   gossip_msg_peer_update '%.*s'", node->name.len, node->name.data);
		log_debug(LOG_VVERB, "Processing    gossip_msg_peer_update : datacenter '%.*s'", node->dc.len, node->dc.data);
		log_debug(LOG_VVERB, "Processing    gossip_msg_peer_update : rack '%.*s'", node->rack.len, node->rack.data);
		log_debug(LOG_VVERB, "Processing    gossip_msg_peer_update : name '%.*s'", node->name.len, node->name.data);
		log_debug(LOG_VVERB, "State %d", node->state);
        print_dyn_token(&node->token, 10);

		status = gossip_add_node_if_absent(sp, &node->dc, &node->rack,
				                           &node->name, &node->name,
				                           (node->port == 8101)? &PEER_PORT : &PEER_SSL_PORT,
						                   &node->token,
						                   node->state,
						                   node->ts);
	}
	gossip_debug();

	return status;
}
Пример #2
0
void gossip_debug(void)
{
	uint32_t i, nelem;
	for (i = 0, nelem = array_n(&gn_pool.datacenters); i < nelem; i++) {
		log_debug(LOG_VERB, "===============Gossip dump===============================");
		struct gossip_dc *g_dc = (struct gossip_dc *) array_get(&gn_pool.datacenters, i);
		log_debug(LOG_VERB, "\tDC name           : '%.*s'", g_dc->name.len, g_dc->name.data);
		log_debug(LOG_VERB, "=========================================================");

		uint32_t k, kelem;
		for (k = 0, kelem = array_n(&g_dc->racks); k < kelem; k++) {
			struct gossip_rack *g_rack = (struct gossip_rack *) array_get(&g_dc->racks, k);

			log_debug(LOG_VERB, "\tRACK name         : '%.*s'", g_rack->name.len, g_rack->name.data);
			log_debug(LOG_VERB, "\tNum nodes in RACK : '%d'", array_n(&g_rack->nodes));
			uint32_t jj;
			for (jj = 0; jj < array_n(&g_rack->nodes); jj++) {
				log_debug(LOG_VERB, "-----------------------------------------");
				struct node *node = (struct node *) array_get(&g_rack->nodes, jj);
				log_debug(LOG_VERB, "\t\tNode name          : '%.*s'", node->name);
				log_debug(LOG_VERB, "\t\tNode pname         : '%.*s'", node->pname);
				log_debug(LOG_VERB, "\t\tNode state         : %"PRIu32"", node->state);
				log_debug(LOG_VERB, "\t\tNode port          : %"PRIu32"", node->port);
				log_debug(LOG_VERB, "\t\tNode is_local      : %"PRIu32" ", node->is_local);
				log_debug(LOG_VERB, "\t\tNode last_retry    : %"PRIu32" ", node->last_retry);
				log_debug(LOG_VERB, "\t\tNode failure_count : %"PRIu32" ", node->failure_count);

				print_dyn_token(&node->token, 8);
				log_debug(LOG_VERB, "\t\tFinger print    : %"PRIu64" ", dictFingerprint(g_rack->dict_token_nodes));

			}
		}
	}
	log_debug(LOG_VERB, "...........................................................");
}
Пример #3
0
void
core_debug(struct context *ctx)
{
	log_debug(LOG_VERB, "=====================Peers info=====================");
	uint32_t i, nelem;
	for (i = 0, nelem = array_n(&ctx->pool); i < nelem; i++) {
		struct server_pool *sp = (struct server_pool *) array_get(&ctx->pool, i);
		log_debug(LOG_VERB, "Server pool          : %"PRIu32"", sp->idx);
		uint32_t j, n;
		for (j = 0, n = array_n(&sp->peers); j < n; j++) {
			log_debug(LOG_VERB, "==============================================");
			struct server *server = (struct server *) array_get(&sp->peers, j);
			log_debug(LOG_VERB, "\tPeer DC            : '%.*s'",server->dc);
			log_debug(LOG_VERB, "\tPeer Rack          : '%.*s'", server->rack);

			log_debug(LOG_VERB, "\tPeer name          : '%.*s'", server->name);
			log_debug(LOG_VERB, "\tPeer pname         : '%.*s'", server->pname);

			log_debug(LOG_VERB, "\tPeer state         : %"PRIu32"", server->state);
			log_debug(LOG_VERB, "\tPeer port          : %"PRIu32"", server->port);
			log_debug(LOG_VERB, "\tPeer is_local      : %"PRIu32" ", server->is_local);
			log_debug(LOG_VERB, "\tPeer failure_count : %"PRIu32" ", server->failure_count);
			log_debug(LOG_VERB, "\tPeer num tokens    : %d", array_n(&server->tokens));

			uint32_t k;
			for (k = 0; k < array_n(&server->tokens); k++) {
				struct dyn_token *token = (struct dyn_token *) array_get(&server->tokens, k);
				print_dyn_token(token, 12);
			}
		}

		log_debug(LOG_VERB, "Peers Datacenters/racks/nodes .................................................");
		uint32_t dc_index, dc_len;
		for(dc_index = 0, dc_len = array_n(&sp->datacenters); dc_index < dc_len; dc_index++) {
			struct datacenter *dc = array_get(&sp->datacenters, dc_index);
			log_debug(LOG_VERB, "Peer datacenter........'%.*s'", dc->name->len, dc->name->data);
			uint32_t rack_index, rack_len;
			for(rack_index=0, rack_len = array_n(&dc->racks); rack_index < rack_len; rack_index++) {
				struct rack *rack = array_get(&dc->racks, rack_index);
				log_debug(LOG_VERB, "\tPeer rack........'%.*s'", rack->name->len, rack->name->data);
				log_debug(LOG_VERB, "\tPeer rack ncontinuumm    : %d", rack->ncontinuum);
				log_debug(LOG_VERB, "\tPeer rack nserver_continuum    : %d", rack->nserver_continuum);
			}
		}

	}
	log_debug(LOG_VERB, "...............................................................................");
}
Пример #4
0
void
core_debug(struct context *ctx)
{
	log_debug(LOG_VERB, "=====================Peers info=====================");
	uint32_t i, nelem;
	for (i = 0, nelem = array_n(&ctx->pool); i < nelem; i++) {
		struct server_pool *sp = (struct server_pool *) array_get(&ctx->pool, i);
		log_debug(LOG_VERB, "Server pool          : %"PRIu32"", sp->idx);
		uint32_t j, n;
		for (j = 0, n = array_n(&sp->peers); j < n; j++) {
			log_debug(LOG_VERB, "==============================================");
			struct server *server = (struct server *) array_get(&sp->peers, j);
			log_debug(LOG_VERB, "\tPeer Rack          : '%.*s'", server->rack);
			log_debug(LOG_VERB, "\tPeer DC            : '%.*s'",server->dc);
			log_debug(LOG_VERB, "\tPeer name          : '%.*s'", server->name);
			log_debug(LOG_VERB, "\tPeer pname         : '%.*s'", server->pname);
			log_debug(LOG_VERB, "\tPeer state         : %"PRIu32"", server->state);
			log_debug(LOG_VERB, "\tPeer port          : %"PRIu32"", server->port);
			log_debug(LOG_VERB, "\tPeer is_local      : %"PRIu32" ", server->is_local);
			log_debug(LOG_VERB, "\tPeer failure_count : %"PRIu32" ", server->failure_count);
			log_debug(LOG_VERB, "\tPeer num tokens    : %d", array_n(&server->tokens));

			uint32_t k;
			for (k = 0; k < array_n(&server->tokens); k++) {
				struct dyn_token *token = (struct dyn_token *) array_get(&server->tokens, k);
				print_dyn_token(token, 12);
			}
		}

		log_debug(LOG_VERB, "Peers Racks.................................................");
		log_debug(LOG_VERB, "Peer RACK size    : %d", array_n(&sp->racks));
		for (j = 0, n = array_n(&sp->racks); j < n; j++) {
			struct rack *rack = (struct rack *) array_get(&sp->racks, j);
			log_debug(LOG_VERB, "\tRACK '%.*s'", rack->name->len, rack->name->data);
			log_debug(LOG_VERB, "\tPeer RACK ncontinuumm    : %d", rack->ncontinuum);
			log_debug(LOG_VERB, "\tPeer RACK nserver_continuum    : %d", rack->nserver_continuum);
		}
	}
	log_debug(LOG_VERB, "..........................................................");
}
Пример #5
0
static struct ring_msg *
dmsg_parse(struct dmsg *dmsg)
{
	//rstatus_t status;
	uint8_t *p, *q, *start, *end, *pipe_p;
	uint8_t *host_id, *host_addr, *ts, *node_state;
	uint32_t k, delimlen, host_id_len, host_addr_len, ts_len, node_state_len;
	char delim[] = ",,,";
	delimlen = 3;


	/* parse "host_id1,generation_ts1,host_state1,host_broadcast_address1|host_id2,generation_ts2,host_state2,host_broadcast_address2" */
	/* host_id = dc-rack-token */
	//p = dmsg->data + dmsg->mlen - 1;
	//p = dmsg->owner->pos + dmsg->owner->mlen - 1;
	p = dmsg->payload + dmsg->plen - 1;
	end = p;

	//start = dmsg->data;
	//start = dmsg->owner->pos;
	start = dmsg->payload;

	log_debug(LOG_VERB, "parsing msg '%.*s'", dmsg->plen, start);
	host_id = NULL;
	host_addr = NULL;
	ts = NULL;
	node_state = NULL;

	host_id_len = 0;
	host_addr_len = 0;
	ts_len = 0;
	node_state_len = 0;
	pipe_p = start;
	int count = 0;

	do {
		q = dn_strrchr(p, start, '|');
		count++;
		p = q - 1;
	} while (q != NULL);

	struct ring_msg *ring_msg = create_ring_msg_with_size(count, true);
	if (ring_msg == NULL) {
		log_debug(LOG_ERR, "Error: unable to create a new ring msg!");
		//we just drop this msg
		return NULL;
	}

	struct server_pool *sp = (struct server_pool *) dmsg->owner->owner->owner;
	ring_msg->sp = sp;
	ring_msg->cb = gossip_msg_peer_update;

	count = 0;
	//p = dmsg->data + dmsg->mlen - 1;
    p = dmsg->payload + dmsg->plen - 1;

	do {

		for (k = 0; k < sizeof(delim)-1; k++) {
			q = dn_strrchr(p, start, delim[k]);

			switch (k) {
			case 0:
				host_addr = q + 1;
				host_addr_len = (uint32_t)(p - host_addr + 1);
				break;
			case 1:
				node_state = q + 1;
				node_state_len = (uint32_t)(p - node_state + 1);

				break;
			case 2:
				ts = q + 1;
				ts_len = (uint32_t)(p - ts + 1);

				break;

			default:
				NOT_REACHED();
			}
			p = q - 1;

		}

		if (k != delimlen) {
			loga("Error: this is insanely bad");
			return NULL;// DN_ERROR;
		}

		pipe_p = dn_strrchr(p, start, '|');

		if (pipe_p == NULL) {
			pipe_p = start;
		} else {
			pipe_p = pipe_p + 1;
			p = pipe_p - 2;
		}

		//host_id = dmsg->data;
		//host_id_len = dmsg->mlen - (host_addr_len + node_state_len + ts_len + 3);
		host_id = pipe_p;
		host_id_len = end - pipe_p - (host_addr_len + node_state_len + ts_len + 3) + 1;

		end = p;

#ifdef DN_DEBUG_LOG
		log_hexdump(LOG_VERB, host_id, host_id_len, "host_id: ");
		log_hexdump(LOG_VERB, ts, ts_len, "ts: ");
		log_hexdump(LOG_VERB, node_state, node_state_len, "state: ");
		log_hexdump(LOG_VERB, host_addr, host_addr_len, "host_addr: ");

		log_debug(LOG_VERB, "\t\t host_id          : '%.*s'", host_id_len, host_id);
		log_debug(LOG_VERB, "\t\t ts               : '%.*s'", ts_len, ts);
		log_debug(LOG_VERB, "\t\t node_state          : '%.*s'", node_state_len, node_state);
		log_debug(LOG_VERB, "\t\t host_addr          : '%.*s'", host_addr_len, host_addr);
#endif

		struct node *rnode = (struct node *) array_get(&ring_msg->nodes, count);
		dmsg_parse_host_id(host_id, host_id_len, &rnode->dc, &rnode->rack, &rnode->token);

#ifdef DN_DEBUG_LOG
		print_dyn_token(&rnode->token, 5);
#endif

		string_copy(&rnode->name, host_addr, host_addr_len);
		string_copy(&rnode->pname, host_addr, host_addr_len); //need to add port

		rnode->port = sp->d_port;
		rnode->is_local = false;
		rnode->is_seed = false;

		ts[ts_len] = '\0';
		rnode->ts = atol(ts);

		node_state[node_state_len] = '\0';
		rnode->state = (uint8_t) atoi(node_state);

		count++;
	} while (pipe_p != start);

	//TODOs: should move this outside
	dmsg_to_gossip(ring_msg);

	return ring_msg;
}