Tencent/phxpaxos

一个可能违反paxos基本安全属性的bug

zqdai opened this issue · 2 comments

zqdai commented

在代码中看到proposer没有记录任何状态,因此感觉在重启后它可能会使用了重复的ballot number,这可能会导致这个实现违反paxos的安全属性。考虑以下场景:

1、假设有3个节点ABC, A prepare(1) 得到了所有节点的的promise且没有任何节点accept过其他proposal。A执行accept proposal (1, v1),假设A、C收到了该消息并accept了该proposal,而发给B的消息则永久丢失。按照正确的paxos实现,v1应该处于被chosen的状态。

2、此时A重启,再次prepare(1)。按当前实现,A自己会reject这个请求,但如果此时刚才B、C的promise消息被重放,那么A会误以为达到了quorum,且没有收到已经accept过的proposal,所以可以accept任意一个值,假设是v2,则accept proposal (1, v2) 这将违反paxos的基本安全属性。

不知道理解是否有误,希望作者可以指点下,谢谢

在工程实现上,proposer和acceptor是一体的。在节点初始化时,会用acceptor的状态来初始化proposer的状态,详见instance.cpp

m_oProposer.SetStartProposalID(m_oAcceptor.GetAcceptorState()->GetPromiseBallot().m_llProposalID + 1);
zqdai commented

明白了,谢谢指点~