Skip to content

Commit

Permalink
Only calculate tree route during finalization when there are multiple…
Browse files Browse the repository at this point in the history
… leaves (paritytech#14067)

* Only calculate tree route when there are multiple leaves

* Update client/service/src/client/client.rs

Co-authored-by: Bastian Köcher <git@kchr.de>

---------

Co-authored-by: Bastian Köcher <git@kchr.de>
  • Loading branch information
2 people authored and nathanwhit committed Jul 19, 2023
1 parent 8f4d80e commit 16db02b
Showing 1 changed file with 18 additions and 13 deletions.
31 changes: 18 additions & 13 deletions client/service/src/client/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -936,19 +936,24 @@ where
return Err(sp_blockchain::Error::NotInFinalizedChain)
}

let route_from_best =
sp_blockchain::tree_route(self.backend.blockchain(), best_block, block)?;

// if the block is not a direct ancestor of the current best chain,
// then some other block is the common ancestor.
if route_from_best.common_block().hash != block {
// NOTE: we're setting the finalized block as best block, this might
// be slightly inaccurate since we might have a "better" block
// further along this chain, but since best chain selection logic is
// plugable we cannot make a better choice here. usages that need
// an accurate "best" block need to go through `SelectChain`
// instead.
operation.op.mark_head(block)?;
// If there is only one leaf, best block is guaranteed to be
// a descendant of the new finalized block. If not,
// we need to check.
if self.backend.blockchain().leaves()?.len() > 1 {
let route_from_best =
sp_blockchain::tree_route(self.backend.blockchain(), best_block, block)?;

// if the block is not a direct ancestor of the current best chain,
// then some other block is the common ancestor.
if route_from_best.common_block().hash != block {
// NOTE: we're setting the finalized block as best block, this might
// be slightly inaccurate since we might have a "better" block
// further along this chain, but since best chain selection logic is
// plugable we cannot make a better choice here. usages that need
// an accurate "best" block need to go through `SelectChain`
// instead.
operation.op.mark_head(block)?;
}
}

let enacted = route_from_finalized.enacted();
Expand Down

0 comments on commit 16db02b

Please sign in to comment.