At present, when syncing, we attempt to find blocks that extend the canonical chain and submit them to consensus for processing. However, this doesn't work well with multi-block forks :
consensus constructs a chain with the block at view X
the block at view X+1 forms part of a multi-block chain which joins the canonical chain at X-n
By this time, we have thrown away blocks with views X-n .. X, so we can't reconstruct the (now longer) chain from X-n to X+1
However, that turns out to be the way the blockchain has gone
And so we can't sync any further.
One solution to this is to continue to buffer any block before a chain of three uninterrupted blocks (three consecutive views, V1, V2, V3, with no intervening views and V3.parent = V2, V2.parent = V1), and track parent pointers so we can present the new chain back to consensus.
At present, when syncing, we attempt to find blocks that extend the canonical chain and submit them to consensus for processing. However, this doesn't work well with multi-block forks :
One solution to this is to continue to buffer any block before a chain of three uninterrupted blocks (three consecutive views, V1, V2, V3, with no intervening views and V3.parent = V2, V2.parent = V1), and track parent pointers so we can present the new chain back to consensus.