看过了phxpaxos的实现,发现选主逻辑中非主也能够调用Propose。
因此即使开启了选主功能,也可能会出现两个人同时Propose的场景。
而Propose时,InstanceID只是作为输出而非输入。因此也无法保证CAS操作的一致性。
目前想到的一种解决方案:
修改Propose的内部实现,开启选主功能后,在确定实例的InstanceID时判断一下自己是不是主。非主时直接返回失败。(选主的Propose除外)
CAS流程:
成为主
lock(状态机)
读状态机
Propose并Execute
unlock(状态机)
而调用Propose和Execute操作不是同一个线程,因此建议的方法是:
Execute时判断SMCtx如果非nullptr(代表是自己Propose的并且有线程在等返回结果),直接return true.
然后调用Propose的线程成功后更新状态机再放锁。
同时还发现选主的逻辑有个可能的问题:有可能2个人同时抢主,两个请求都成功,导致两个人先后成为主。