-
Notifications
You must be signed in to change notification settings - Fork 1
Description
Replication is currently kickstarted when a node receives a finalization for a future round. It then knows it is missing x amount of sequences so it requests them from other nodes. A node will respond with the requested sequences and also send its latest quorum round to ensure the requesting node has the most recent sequence. This works for finalizations, but is not enough since we aren't guaranteed to receive the most up-to-date notarization(without a finalization) or empty notarization. Furthermore, we need to kickstart the process of replication when we receive future Notarizations and EmptyNotarizations since the network might be stuck and waiting for the lagging node to complete the QC.
To do so, we should extend our replication logic to distinguish between replicating finalized sequences and future rounds with Notarizations/EmptyNotarizations. By keeping track of the latestFinalizedSeq and latestKnownRound, our node also knows if it needs to vote on rounds while replicating(noted here).
With this proposed logic, a lagging node would being replication when it receives a EmptyNotarization, Finalization or Notarization from a future round. In the case where a lagging node reconnects into a halted network, it will send an emptyVote message which will be responded to via
Line 709 in 2030b91
| func (e *Epoch) maybeSendNotarizationOrFinalization(to NodeID, round uint64) { |
latestQuorumRound.