更多 blog 见: https://joeylichang.github.io/
- 核心思想
在正式执行Paxos协议进行确定最终提案之前,需要先进行一些控制保证提案有序的进行。本部分的核心是提前发起量的控制,首先,在同一个节点上提案需要按顺序进行发起不能前一个提案还没有结束就进行下一个,这个比较好理解。其次,不能来了的请求都接受,因为会引起活锁的问题,在本题发起的时候进行流控可以有效的避免活锁。下面重点看一下提案发起前的一些控制逻辑。
- 时序图
主要代码逻辑:
1. 由Commiter发起提案申请。
2. NewValueGetIDNoRetry函数执行核心的逻辑,包括加锁、加入请求队列、通过一定的控制策略决定是否允许发起提案。
3. m_poIOLoop->AddNotify(),通知主循环有提案发起,执行Paxos协议逻辑。
4. m_poCommitCtx->GetResult(llInstanceID)查看执行提案执行结果,并返回。
- 源码解析
下面直接看一下核心函数NewValueGetIDNoRetry的逻辑:
int Committer :: NewValueGetIDNoRetry(const std::string & sValue, uint64_t & llInstanceID, SMCtx * poSMCtx)
{
LogStatus();
// 返回提案申请所用的