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

新节点启动的时候为什么不直接去learn最新的数据,而是要等待定时器超时后再learn? #152

Closed wadeliuyi closed 5 years ago

wadeliuyi commented 6 years ago

系统启动后没有判断当前的instanceid是不是最新的,然后learn也没有主动获取最大的instanceid,而是注册了Timer_Learner_Askforlearn_noop定时器,在当前节点的acceptor收到请求后判断如果比当前节点的instanceid大,也不会主动去learn,而是不处理,这样Timer_Learner_Askforlearn_noop定时器就会超时,然后获取最新的instanceid,进入学习流程。 为什么要这样设计?为什么不在acceptor看到最新的instanceid后直接启动对齐流程呢?

unixliang commented 6 years ago

acceptor收到比当前节点的instanceid还大的消息,可能只是网络乱序导致的,并不表示该节点落后很多。 “落后很多”需要一定时间间隔,所以Timer_Learner_Askforlearn_noop事件定期发起即可。 “落后很多”才启动learner比较妥当,不然LearnerSender被频繁占用,服务不了真正落后的节点。

wadeliuyi commented 5 years ago

acceptor收到比当前节点的instanceid还大的消息,可能只是网络乱序导致的,并不表示该节点落后很多。 “落后很多”需要一定时间间隔,所以Timer_Learner_Askforlearn_noop事件定期发起即可。 “落后很多”才启动learner比较妥当,不然LearnerSender被频繁占用,服务不了真正落后的节点。

非常感谢