Tencent / phxpaxos

The Paxos library implemented in C++ that has been used in the WeChat production environment.
Other
3.36k stars 863 forks source link

关于处理在 prepareReply的疑问 #167

Open zxm1990 opened 5 years ago

zxm1990 commented 5 years ago

在prepare阶段,节点发起请求,将这次提议的值存储在 ProposerState对象中,只携带提案号n1发起请求, (此时提案值v1, 但不携带提案值)。 在收到response时如果有应答中有提案值v2,保留提案号最大对应的值 v2,这时是直接用 v2 覆盖了 v1,详情见void Proposer :: OnPrepareReply(const PaxosMsg & oPaxosMsg),这样在accept阶段,确实可以快速达成一致,与协议描述一致。 考虑这样场景:3节点的group。节点1请求 set<k1, v1>, 节点2请求 set<k2, v2>, 如果节点2先发起提议,但还未通过整个协议阶段,此时节点1也发起提议,根据paxos协议。 这2个请求在同一时间段冲突,为了尽快达成一致,导致所有节点都执行 set<k2, v2>的操作,数据在3个节点中确实保持一致了,但是节点2明显没有达到自己的目标,此时提议值被覆盖了,业务没有收到任何消息,这次的提议也成功了(value被改变了)。针对这样的场景,在不使用leader的情况下,业务有什么好的方式可以处理一下?或者说我的理解有误。还望不吝赐教,谢谢!!! 思考:是否在ProposerState中,存储2个值,在发送propose冲突时,随机一个时间,再次发起提议,直到提议超时,让业务决定是否再次发起提议?

lynncui00 commented 5 years ago

如果Propose的value与最终chosen的value不一致,Node::Propose函数会返回 错误码 PaxosTryCommitRet_Conflict

具体代码可见: commitctx.cpp#L119

zxm1990 commented 5 years ago

感谢回答!