这篇阅读笔记是在大概1年前写的,是对libpaxos源码的一些注释吧。其中我的师弟yy和dm(不知道他们愿不愿意我署他们的名字,暂用缩写代替吧)对其做了一些修改,还有川大的hs老师,师兄(姐)yc,yz所做的工作,在此感谢。
鉴于个人学识有限,对paxos算法的理解也有限,有任何问题,请留言。废话就不说了,下面是笔记的全文:
libpaxos阅读笔记
libpaxos是paxos算法的一个库实现,它几乎完全是按照<<paxos made simple>>来写的,在阅读程序前,最好先看看<<paxosmade simple>>。
-
proposer.c
此文件实现proposer。
-
-
在此文件中用到的数据结构
-
typedefstruct proposer_record_t {
intiid;/*实例id*/
intballot;/*proposal number*/
status_flagstatus;/*此proposal的状态*/
intpromise_count;/*回应了preparerequest的acceptor的个数*/
promise_msg*promises[N_OF_ACCEPTORS];/*保存所有acceptor对preparerequest的回应*/
promise_msg*reserved_promise;/*如果acceptor回应的preparerespond中已经有达成共识的value,这在voidcheck_ready(proposer_record*rec)中将其保存在这个结构中*/
}proposer_record; /*这个结构体用于保存所有proposer提出但还没有达成决议的提案*/
typedefstruct pending_promise_t {
intfrom_iid;/*一次发送的所有preparerequest的起始实例id*/
intto_iid;/*一次发送的所有preparerequest的结束实例id*/
longunsigned timer;/*为这些preparerequest设置的起始的时间,这是一个绝对时间用于超时判断*/
structpending_promise_t* next;
}pending_promise;
staticpending_promise*p1_pending_list_head;/*未决的proposalrequest链表*/
staticpending_promise*p1_pending_list_tail;
typedefstruct client_value_wrapper_t {
int value_size;
void* value;/*客户端发来的value*/
structclient_value_wrapper_t* next;
}client_value_wrapper;/*用于保存客户端发来的value,在paxos中即为提案的内容*/
使用一个有头结点和尾节点的链表来保存客户端发送的value:
staticclient_value_wrapper*client_list_head;
staticclient_value_wrapper*client_list_tail;
staticintclient_list_size=0;
staticclient_value_wrapper*p2_pending_accept;/*用来保存p2a提交的value*/
staticlongunsignedp2_pending_timer;/*p2a的时间*/
staticproposer_recordproposer_array[PROPOSER_ARRAY_SIZE];/*记录开始但还没有完成的paxos实例及相关信息*/
staticint highest_open; /*proposer当前所发起过的最高的实例id*/
staticint current_iid;/*当前proposer所能看到的已经形成决议了的最高的实例id*/
staticint prop_id;/*用户指定,用于计算proposalnumber,由两个宏来计算
proposalnumber,它们是BALLOT_NEW,BALLOT_NEXT,通过简单的增加一个间隔MAX_PROPOSERS*/
-
-
proposer执行过程简介
-
proposer的执行由proposer_init