看过了phxpaxos的实现,发现选主逻辑中非主也能够调用Propose。
因此即使开启了选主功能,也可能会出现两个人同时Propose的场景。
而Propose时,InstanceID只是作为输出而非输入。因此也无法保证CAS操作的一致性。

目前想到的一种解决方案:
修改Propose的内部实现,开启选主功能后,在确定实例的InstanceID时判断一下自己是不是主。非主时直接返回失败。(选主的Propose除外)

CAS流程:
成为主
lock(状态机)
读状态机
Propose并Execute

unlock(状态机)

而调用Propose和Execute操作不是同一个线程,因此建议的方法是:

Execute时判断SMCtx如果非nullptr(代表是自己Propose的并且有线程在等返回结果),直接return true.

然后调用Propose的线程成功后更新状态机再放锁。

同时还发现选主的逻辑有个可能的问题:有可能2个人同时抢主,两个请求都成功,导致两个人先后成为主。

05-08 15:03