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; }
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, "..........................................................."); }
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, "..............................................................................."); }
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, ".........................................................."); }
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; }