校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 开源框架 > paxos
题目

假设一个 Proposer 以初始值 v1 运行 Basic Paxos,但是它在协议执行过程中或执行后的某个(未知)时间点宕机了。假设该 Proposer 重新启动并从头开始运行协议,使用之前使用的相同的提案编号,但初始值为 v2,这样安全吗?请解释你的答案。

解答

不安全。不同的提案必须具有不同的提案编号。下面是一个 3 节点集群的例子:

•S1 发送 Prepare(n=1.1) 至 S1,S2•S1 发送 Accept(n=1.1, v=v1) 至 S1•S1 重启•S1 发送 Prepare(n=1.1) 至 S2,S3(并且发现还没有被接受的提案)•S1 发送 Accept(n=1.1, v=v2) 与 S2,S3•S1 将 v2 被 chosen 返回给客户端•S2 发送 Prepare(n=2.2) 至 S1,S2 并收到响应:

•来自 S1: acceptedProposal=1.1, acceptedValue=v1•来自 S2: acceptedProposal=1.1, acceptedValue=v2

•S2 直接选择了 v1 作为提案值•S2 发送 Accept(n=2.2, v=v1)至S1,S2,S3•S2 将 v1 被 chosen 返回给客户端

可能出现的另一个问题是,崩溃前的请求在崩溃之后才被送到:

•S1 发送 Prepare(n=1.1) 至 S1,S2•S1 发送 Accept(n=1.1, v=v1) 至 S1•S1 发送 Accept(n=1.1) 至 S2 和 S3,但是它们并没有收到•S1 重启•S1 发送 Prepare(n=1.1) 至 S2,S3(并且发现还没有被接受的提案)•S1 发送 Accept(n=1.1, v=v2) 至 S2 和 S3•S1 将 v2 被 chosen 返回给客户端•现在,S2 和 S3 收到了(之前的) Accept(n=1.1, v=v1) 请求,并且覆盖了 acceptedValue 设为 v1。现在集群的状态是 v1 被 chosen,但是客户端收到 v2 被 chosen。

C 0条回复 评论

帖子还没人回复快来抢沙发