フェーズ 2. (a) プロポーザーは、多数のアクセプターから準備要求 (番号 n) に対する応答を受信した場合、それらのアクセプターのそれぞれに、値 v を持つ番号 n の提案の承認要求を送信します。ここで、v は応答の中で最大番号の提案の値、または応答が提案を報告しなかった場合は任意の値です。
論文で述べたように、
提案者は、いくつかのアクセプターのセットに、提案が受け入れられるようにという要求を送信することにより、提案を発行します。(これは、最初のリクエストに応答したアクセプターのセットと同じである必要はありません。)"
しかし、私の理解では、フェーズ 2.(a) を次のように変更すると:
プロポーザーが多数のアクセプターから準備要求 (番号 n) に対する応答を受信した場合、値 v を持つ番号 n のプロポーザルの多数決アクセプターの任意のセットにアクセプト要求を送信します。応答の中で最大番号の提案、または応答が提案を報告しなかった場合は任意の値です。
アルゴリズムは失敗します。以下に例を示します。全部で 3 つのアクセプター ABC があるとします。X(n:v,m) を使用して、アクセプタ X のステータスを示します。プロポーザル n:v は、X によって受け入れられた最大の番号のプロポーザルです。ここで、n はプロポーザル番号、v はプロポーザルの値、m はX がこれまでに応答した最大の番号付きの準備要求の番号。
- P1 が「prepare 1」を AB に送信
- 両方の AB は、1 より小さい番号の要求を受け入れないことを約束して P1 に応答します。これで、ステータスは次のようになります: A(-:-,1) B(-:-,1) C(-:-,-)
- P1 は応答を受信し、スタックして非常に低速で実行されます
- P2 は「prepare 100」を AB に送信します
- 両方の AB は、100 より小さい番号の要求を受け入れないことを約束して P2 に応答します。現在のステータスは次のとおりです: A(-:-,100) B(-:-,100) C(-:-,-)
- P2 は応答を受信し、値 b を選択して、「accept 100:b」を BC に送信します。
- BC が受け入れ要求を受け取り、受け入れます。ステータスは 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 は失敗します。
ここで何か見逃しましたか?ありがとう。