static void proposer_handle_msg(struct evproposer* p, struct bufferevent* bev) //proposer处理各种类型的消息 { paxos_msg msg; struct evbuffer* in; char buffer[PAXOS_MAX_VALUE_SIZE]; in = bufferevent_get_input(bev); evbuffer_remove(in, &msg, sizeof(paxos_msg)); //将消息文件头从输入buffer移动到msg中 if (msg.data_size > PAXOS_MAX_VALUE_SIZE) { //消息内容过大,丢弃 evbuffer_drain(in, msg.data_size); paxos_log_error("Discarding message of size %ld. Maximum is %d", msg.data_size, PAXOS_MAX_VALUE_SIZE); return; } evbuffer_remove(in, buffer, msg.data_size); //将消息的内容移动到buffer中 switch (msg.type) { case prepare_acks: proposer_handle_prepare_ack(p, (prepare_ack*)buffer); break; case accept_acks: proposer_handle_accept_ack(p, (accept_ack*)buffer); break; case submit: proposer_handle_client_msg(p, buffer, msg.data_size); break; default: paxos_log_error("Unknow msg type %d not handled", msg.type); return; } try_accept(p); }
/*proposer处理网络消息接口*/ static void proposer_handle_msg(struct evproposer* p, struct bufferevent* bev) { paxos_msg msg; struct evbuffer* in; char* buffer = NULL; /*解读消息头*/ in = bufferevent_get_input(bev); evbuffer_remove(in, &msg, sizeof(paxos_msg)); /*解读消息体*/ if (msg.data_size > 0) { buffer = malloc(msg.data_size); evbuffer_remove(in, buffer, msg.data_size); } /*处理消息*/ switch (msg.type){ case prepare_acks: proposer_handle_prepare_ack(p, (prepare_ack*)buffer); break; case accept_acks: proposer_handle_accept_ack(p, (accept_ack*)buffer); break; case submit: proposer_handle_client_msg(p, buffer, msg.data_size); break; default: paxos_log_error("Unknow msg type %d not handled", msg.type); return; } /*尝试发起提议的第二阶段,阶段性检查*/ try_accept(p); if (buffer != NULL) free(buffer); }