Tencent / phxpaxos

The Paxos library implemented in C++ that has been used in the WeChat production environment.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

wadeliuyi opened this issue · comments

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

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

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

非常感谢