阶段 2. (a) 如果提议者从大多数接受者那里收到对其准备请求(编号为 n)的响应,那么它会向这些接受者中的每一个发送一个接受请求,以获取编号为 n 且值为 v 的提议,其中 v 是响应中编号最高的提案的值,或者如果响应报告没有提案,则为任何值。
如论文所述,
提议者通过向一组接受者发送提议被接受的请求来发布提议。(这不必是响应初始请求的同一组接受者。)“
但据我了解,如果我们将阶段 2. (a) 更改为:
如果提议者从大多数接受者那里收到对其准备请求(编号为 n)的响应,则它会向任意一组多数接受者发送一个接受请求,以获取编号为 n 且值为 v 的提议,其中 v 是响应中编号最高的提案,或者如果响应没有报告提案,则为任何值。
该算法将失败,以下是一个示例。考虑总共有 3 个接受者 ABC。我们将使用 X(n:v,m) 来表示接受者 X 的状态:提案 n:v 是 X 接受的编号最大的提案,其中 n 是提案编号,v 是提案的值,m 是X 曾经响应过的最大编号的准备请求的数量。
- P1 向 AB 发送“准备 1”
- 两个 AB 都以不接受任何编号小于 1 的请求的承诺响应 P1。现在状态为:A(-:-,1) B(-:-,1) C(-:-,-)
- P1 收到响应,然后卡住并运行得很慢
- P2 向 AB 发送“准备 100”
- 两个 AB 都以不接受任何编号小于 100 的请求的承诺响应 P2。现在状态是:A(-:-,100) B(-:-,100) C(-:-,-)
- P2 收到响应,选择一个值 b 并将“接受 100:b”发送给 BC
- BC接收并接受accept请求,状态为:A(-:-,100) B(100:b,100) C(100:b,-)。请注意,已选择提案 100:b。
- P1 恢复,选择值 a 并将 'accept 1:a' 发送到 BC
- B 不接受,但 C 接受,因为 C 从未承诺过任何事情。状态为:A(-:-,100) B(100:b,100) C(1:a,-)。选择的提案被放弃,Paxos 失败。
我在这里错过了什么吗?谢谢。