コード例 #1
0
ファイル: evprepare.c プロジェクト: ahnufy/libpaxos
/*检查超时的提案,进行重新提议*/
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);
}
コード例 #2
0
ファイル: evproposer.c プロジェクト: mawentao007/paxos
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);
}
コード例 #3
0
ファイル: evprepare.c プロジェクト: ahnufy/libpaxos
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);
}
コード例 #4
0
ファイル: evproposer.c プロジェクト: mawentao007/paxos
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.将超时事件重新加入
}