libpaxos阅读笔记

这篇笔记详细解读了libpaxos库的源码,包括proposer、acceptor和learner的实现细节。文中介绍了数据结构如proposer_record、pending_promise和client_value_wrapper,并阐述了proposer的执行流程,包括proposer_loop、timeout_checks_loop和delivery_check_loop三个线程的作用。此外,还讨论了acceptor如何处理preparerequest和acceptrequest,以及learner如何接收和处理learnmessage。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇阅读笔记是在大概1年前写的,是对libpaxos源码的一些注释吧。其中我的师弟yy和dm(不知道他们愿不愿意我署他们的名字,暂用缩写代替吧)对其做了一些修改,还有川大的hs老师,师兄(姐)yc,yz所做的工作,在此感谢。

鉴于个人学识有限,对paxos算法的理解也有限,有任何问题,请留言。废话就不说了,下面是笔记的全文:


        libpaxos阅读笔记

libpaxospaxos算法的一个库实现,它几乎完全是按照<<paxos made simple>>来写的,在阅读程序前,最好先看看<<paxosmade simple>>

  1. proposer.c

此文件实现proposer

    1. 在此文件中用到的数据结构

typedefstruct proposer_record_t {

intiid;/*实例id*/

intballot;/*proposal number*/

status_flagstatus;/*proposal的状态*/

intpromise_count;/*回应了preparerequestacceptor的个数*/

promise_msg*promises[N_OF_ACCEPTORS];/*保存所有acceptorpreparerequest的回应*/

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_NEWBALLOT_NEXT通过简单的增加一个间隔MAX_PROPOSERS*/

    1. proposer执行过程简介

proposer的执行由proposer_init

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值