题目
当一个 Acceptor 使用 Proposer 提供的 firstUnchosenIndex
来标记被 chosen 的日志记录时,它必须先检查日志记录中的提案编号(acceptedProposal[i] == request.proposal
)。假设它跳过了这一检查:请描述一个系统异常的情况。
解答
可能出现的异常行为是:服务器会标记两个不同的 chosen 值。用 2 个竞争的提案,3 节点集群和 2 个日志来举例:
•S1 完成一轮 Prepare 发送提案编号 n=1.1, index=1 给 S1,S2•S1 只完成 S1(它自己)的 Accept 提案 n=1.1, value = X, index = 1•S2 完成一轮 Prepare 发送提案编号 n=2.2, index=1 给 S2,S3,收到二者包含 noMoreAccepted=true
的响应•S2 完成一轮 Accept,S2、S3 收到 n=2.2, value=Y, index=1•S2 标记 index 1 的日志为 chosen•S2 完成一轮 Accept,S1, S2, 和 S3 收到 n=2.2, value=Z, index=2, firstUnchosenIndex=2,此时,S1 将会发生异常:将 n=1.1, value=X 的日志设为 chosen,然后将 X 应用到状态机。这是不正确的,因为实际上是 Y 被 chosen。
我是大学学的Java开发、现在转行做了测试刚做两个多月