Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Phase-1.2 读已完成 commit 的 State" 的一个疑问 #3

Open
zhoupingjay opened this issue Apr 5, 2022 · 1 comment
Open

"Phase-1.2 读已完成 commit 的 State" 的一个疑问 #3

zhoupingjay opened this issue Apr 5, 2022 · 1 comment

Comments

@zhoupingjay
Copy link

你好,我看了你的abstract paxos文章,很有收获,感谢分享!有个疑问想请教一下:

  • 根据经典Paxos,在phase-1时,acceptor收到proposal后会返回它之前accept过的最大commit_index的值(以及相应的commit_index)。
  • 因此在 “Phase-1.2 读已完成 commit 的 State” 这一步中,writer会读到commit_index比它小的其他已经被accept过的值。那么根据经典Paxos,writer在phase-2中不应该用自己的值,而是应该从收到的这些已经被accept过的值中,选commit_index最大的那个作为phase-2要发送的值。你的另一篇文章 paxos直观解释 也提到过这一步,相当于执行了一次其他proposal的修复(slide-29)。
  • 但是在 “Phase-1.2 读已完成 commit 的 State” 这一步中,writer执行的步骤是这样的:
在最大 State 的基础上, 增加 w₁ 自己要写的内容. 最后进行 phase-2 完成 commit

这里似乎并没有显式的执行这个“修复”的步骤?我的理解是:

  • 在经典Paxos中,writer需要先显式的执行这个修复步骤,然后再做一次Paxos写入它想要的值。
    • 但是这里又有一个问题:writer在执行完修复后,再次运行Paxos,不还是会收到之前accept过的值吗?这样的话,writer就始终无法写入它想要的值,整个协议岂不是就无法proceed了?
    • 所以这种情况下,writer是不是应该在完成修复后,开始一个新的paxos instance?也就是说消息里除了commit_index,还需要带instance_id?
  • 而在abstract paxos中,writer在phase-2中所用的值(State),其实是在【以前accept过的commit_index最大的值】基础上增加了新的,这相当于把“修复”和“写入writer想要的值”两次合并成了一次,就没有上面的这些问题。。。

不知道我的理解对不对?

@drmingdrmer
Copy link
Member

嗯. 都挺正确的. :D

classic-paxos 里只能确定一个值, 所以只能在nil上追加一个值上去; 已有值了就不许追加了, 只能做一个 "修复".

abstract-paxos 允许一直追加, 而也能保证已commit的不会被追加的新值覆盖. 所以 "修复" 和 "提交新的内容" 就都包含在 phase-2里了.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants