-
Notifications
You must be signed in to change notification settings - Fork 2.6k
rpc/chainHead: Fix pruned blocks events from forks #13379
Conversation
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Logic looks good to me, just some nits.
Looks like some tests are not passing on this branch but are passing on master (at least "in my machine™️")
|
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
This reverts commit 425d6e7.
Signed-off-by: Alexandru Vasile <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not 100% familiar with this code part. But I've done my best 😁
Mostly looks good to me. Green light after the review points are resolved (or justified)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm minus comments above
Co-authored-by: Davide Galassi <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good
* rpc/chainhead: Test unpin for noncanonical prunned blocks Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Ensure fork is not reported by the Finalized event Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chainhead: Detect pruned forks to ignore from events Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Check unpin can be called on pruned hashes Signed-off-by: Alexandru Vasile <[email protected]> * Fix clippy Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Handle race with memory blocks and notifications Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Add data config for the `follow` future Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Address feedback Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Move best block cache on the data config Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Send new events from the finalized stream Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chian_head: Report all pruned blocks Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Move `chainHead_follow` logic on dedicated file Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Delegate follow logic to `chain_head_follow` Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Remove subscriptions on drop Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Ignore pruned blocks for a longer fork Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Check all pruned blocks are reported, not just stale heads Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Remove println debug and fix indentation Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Remove unnecessary trait bounds Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Add debug log for pruned forks Signed-off-by: Alexandru Vasile <[email protected]> * Revert "rpc/chain_head: Add debug log for pruned forks" This reverts commit 425d6e7. * Adjust blockID for testing Signed-off-by: Alexandru Vasile <[email protected]> * Update client/rpc-spec-v2/src/chain_head/chain_head_follow.rs Co-authored-by: Davide Galassi <[email protected]> * rpc/chain_head: Rename `ChainHeadFollow` to `ChainHeadFollower` Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Remove subscriptions manually Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Improve log messages by adding subID and errors Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Ensure `follow` stops sending events on first error Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Use default constructor Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Add `StartupPoint` structure Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Rename `in_memory_blocks` Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Fix comment typo Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Keep unique blocks and remove itertools Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Make sure `bestBlocks` events are generated in order Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Maintain order of reported blocks Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Parent of finalized block could be unpinned Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Fix warning Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Davide Galassi <[email protected]>
* rpc/chainhead: Test unpin for noncanonical prunned blocks Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Ensure fork is not reported by the Finalized event Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chainhead: Detect pruned forks to ignore from events Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Check unpin can be called on pruned hashes Signed-off-by: Alexandru Vasile <[email protected]> * Fix clippy Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Handle race with memory blocks and notifications Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Add data config for the `follow` future Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Address feedback Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Move best block cache on the data config Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Send new events from the finalized stream Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chian_head: Report all pruned blocks Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Move `chainHead_follow` logic on dedicated file Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Delegate follow logic to `chain_head_follow` Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Remove subscriptions on drop Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Ignore pruned blocks for a longer fork Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Check all pruned blocks are reported, not just stale heads Signed-off-by: Alexandru Vasile <[email protected]> * rpc/tests: Remove println debug and fix indentation Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Remove unnecessary trait bounds Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Add debug log for pruned forks Signed-off-by: Alexandru Vasile <[email protected]> * Revert "rpc/chain_head: Add debug log for pruned forks" This reverts commit 425d6e7. * Adjust blockID for testing Signed-off-by: Alexandru Vasile <[email protected]> * Update client/rpc-spec-v2/src/chain_head/chain_head_follow.rs Co-authored-by: Davide Galassi <[email protected]> * rpc/chain_head: Rename `ChainHeadFollow` to `ChainHeadFollower` Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Remove subscriptions manually Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Improve log messages by adding subID and errors Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Ensure `follow` stops sending events on first error Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Use default constructor Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Add `StartupPoint` structure Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Rename `in_memory_blocks` Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Fix comment typo Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Keep unique blocks and remove itertools Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Make sure `bestBlocks` events are generated in order Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Maintain order of reported blocks Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Parent of finalized block could be unpinned Signed-off-by: Alexandru Vasile <[email protected]> * rpc/chain_head: Fix warning Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Davide Galassi <[email protected]>
This PR fixes the
chainHead::follow
edge cases:Issue 1
The
chainHead::follow
method returns theFinalized
event containing both finalized hashes and pruned block hashes. The substrate database will perform the pruning of height N at the finalization N + 1.Considering the following tree structure:
Initial Condition:
Initialized
event containing the finalized hash (A2)NewBlock
events for children of finalized (A3)The
NewBlock
event contains the hash of the block + the parent hash. Taken from the spec:Issues:
Solution:
Issue 2
chainHead::follow
method reported just the stale heads when declaring the pruned hashes.To fix this issue, the tree route is determined from the stale heads to the canonical chain and all blocks are reported.
Additional
Because the complexity of generating the follow events grew, the logic is moved to the
chain_head_follow.rs
file.This also helps with code readability and maintenance.
Under intensive testing, it was possible for the
Finalized
event to be received before theNewBlock
that led to flaky scenarios. To close the gap, theFinalized
branch can now also generateNewBlock
events.Testing Done
follow_forks_pruned_block
andfollow_report_multiple_pruned_block
cover the issues described abovecargo test
together withstress-ng --cpu 8 --cpu-load 100 --io 4
to filter out any flakinessReview Notes
The entry point of the
follow
logic is moved to a dedicated file. While at it, have also simplified the notification stream logic:substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs
Lines 565 to 566 in 33f5f10
The blocks to ignore as pruned are collected initially here:
substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs
Lines 179 to 180 in 33f5f10
Both issues are handled by this method:
substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs
Lines 392 to 395 in 33f5f10
Additionally, the
finalized
stream could also generate theNewBlock
events here:substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs
Lines 447 to 448 in 33f5f10
The other logic is moved from the
chain_head
to thechain_head_follow
with minimal additions (mostly better error reporting).Thanks @skunert and @davxy for the initial feedback and for raising the flakiness of the tests after the fix; plus the stale heads!
// CC: @paritytech/tools-team