/*检查超时的提案,进行重新提议*/ static void proposer_check_timeouts(evutil_socket_t fd, short event, void* arg) { struct evproposer* p = arg; struct timeout_iterator* iter = proposer_timeout_iterator(p->state); /*第一个阶段超时提案*/ prepare_req* pr; while((pr == timeout_iterator_prepare(iter)) != NULL){ /*获取超时的提案(第一阶段)*/ paxos_log_info("Instance %d timed out.", pr->iid); /*对超时提案重新发起提议过程*/ send_prepares(p, pr); free(pr); } accept_req* ar; while((ar = timeout_iterator_accept(iter)) != NULL){ /*获得超时提案(第二阶段)*/ paxos_log_info("Instance %d timed out.", ar->iid); send_accepts(p, ar); free(ar); } /*释放超时管理的迭代器*/ timeout_iterator_free(iter); /*插入一个定时器*/ event_add(p->timeout_ev, &p->tv); }
static void try_accept(struct evproposer* p) //proposer将value等包装成accept_req包,交给evacceptor,后者将他们放入bufferevent中发送 { accept_req* ar; while ((ar = proposer_accept(p->state)) != NULL) { //检验是否有propose实例,如果没有,执行execute send_accepts(p, ar); free(ar); } proposer_preexecute(p); }
static void try_accept(struct evproposer* p) { accept_req* ar; while((ar = proposer_accept(p->state)) != NULL){ /*获取一个完成了第一阶段的提议,并根据其构建一个accept_reqs*/ /*发起提议的第二阶段*/ send_accepts(p, ar); free(ar); } /*检查是否可以发送更多的第一阶段的提议*/ proposer_preexecute(p); }
static void proposer_check_timeouts(evutil_socket_t fd, short event, void *arg) { struct evproposer* p = arg; struct timeout_iterator* iter = proposer_timeout_iterator(p->state); prepare_req* pr; while ((pr = timeout_iterator_prepare(iter)) != NULL) { paxos_log_info("Instance %d timed out.", pr->iid); send_prepares(p, pr); free(pr); } accept_req* ar; while ((ar = timeout_iterator_accept(iter)) != NULL) { paxos_log_info("Instance %d timed out.", ar->iid); send_accepts(p, ar); free(ar); } timeout_iterator_free(iter); event_add(p->timeout_ev, &p->tv); //Thus, if you want to make the event pending again, you can call event_add() on it again from inside the callback function.将超时事件重新加入 }