Closed rink1969 closed 1 year ago
根据代码分析,是因为在发起同步之前,节点出了一个proposal。
这样在try_sync_block中判断时,因为 self.candidates.is_empty()
条件不成立,所以判定为 ChainStep::OnlineStep
,进而决定不开始同步:
ChainStep::OnlineStep => {
controller_clone.set_sync_state(false).await;
controller_clone.sync_manager.clear().await;
return;
}
重启之后恢复正常很容易理解,因为重启之后,proposal没有了。 但是重启之前,如果收到别的节点发来的更高的proposal或者chain status,应该会把本节点的candidates清理掉,然后开始同步。 所以现在问题就变成了,为什么没有触发清理candidates?
在节点849高度时做备份。
节点到1050的时候,停掉节点,然后从备份恢复数据。然后重新启动节点:
节点高度回退到849,也发现了其他节点的高度比它高。但是没有开始同步区块。 等待高度5分钟没有增长,controller重启之后,又可以正常同步区块了。