chainHead: Ensure reasonable distance between leaf and finalized block#3562
chainHead: Ensure reasonable distance between leaf and finalized block#3562
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]>
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]>
| /// | ||
| /// Subscriptions are suspended when the distance between any leaf | ||
| /// and the finalized block is too large. | ||
| const SUSPENDED_DURATION: Duration = Duration::from_secs(30); |
There was a problem hiding this comment.
An alternative for this would be to simply recalculate the:
leaves = blockchain.leaves()?;
if leaf - finalized > 128 { return Err(); }There was a problem hiding this comment.
Is there much of a computation cost for doing the above? Personally I think fewer constants is a good thing, but if it's expensive to compute then having a delay makes sense :)
There was a problem hiding this comment.
Yep that makes sense, I was also wondering if the suspended duration is overkill for this.
We might have a slight increase in reading the blockchain leaves numbers if they are placed on the disk, however I think we can live with that, since this is only an edge-case of an edge-case.
Have removed that constant and we should allow subscriptions to resume normal work as soon as the distance is reasonable.
…e-case-lagging-fin Signed-off-by: Alexandru Vasile <[email protected]>
substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs
Outdated
Show resolved
Hide resolved
substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs
Outdated
Show resolved
Hide resolved
Co-authored-by: Sebastian Kunert <[email protected]>
Co-authored-by: Sebastian Kunert <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
…g-fin' into lexnv/chainhead-edge-case-lagging-fin Signed-off-by: Alexandru Vasile <[email protected]>
| if self.suspend.is_suspended() { | ||
| log::trace!(target: LOG_TARGET, "[id={:?}] Subscription already suspended", sub_id); | ||
| return None | ||
| } |
There was a problem hiding this comment.
Just to confirm; is the point of removing this now that we will allow new subscriptions to be added any time, but stop them all regardless whenever generate_events says that the distance is too large? Whereas before we'd not allow new subscriptions to be added for the timeout period.
There was a problem hiding this comment.
Thanks! The changes def simplify things a fair bit so I'm in favour, and the block distance being too large is def an edge case anyways :)
…e-case-lagging-fin Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
#3562) This PR ensure that the distance between any leaf and the finalized block is within a reasonable distance. For a new subscription, the chainHead has to provide all blocks between the leaves of the chain and the finalized block. When the distance between a leaf and the finalized block is large: - The tree route is costly to compute - We could deliver an unbounded number of blocks (potentially millions) (For more details see #3445 (comment)) The configuration of the ChainHead is extended with: - suspend on lagging distance: When the distance between any leaf and the finalized block is greater than this number, the subscriptions are suspended for a given duration. - All active subscriptions are terminated with the `Stop` event, all blocks are unpinned and data discarded. - For incoming subscriptions, until the suspended period expires the subscriptions will immediately receive the `Stop` event. - Defaults to 128 blocks - suspended duration: The amount of time for which subscriptions are suspended - Defaults to 30 seconds cc @paritytech/subxt-team --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Sebastian Kunert <[email protected]>
paritytech#3562) This PR ensure that the distance between any leaf and the finalized block is within a reasonable distance. For a new subscription, the chainHead has to provide all blocks between the leaves of the chain and the finalized block. When the distance between a leaf and the finalized block is large: - The tree route is costly to compute - We could deliver an unbounded number of blocks (potentially millions) (For more details see paritytech#3445 (comment)) The configuration of the ChainHead is extended with: - suspend on lagging distance: When the distance between any leaf and the finalized block is greater than this number, the subscriptions are suspended for a given duration. - All active subscriptions are terminated with the `Stop` event, all blocks are unpinned and data discarded. - For incoming subscriptions, until the suspended period expires the subscriptions will immediately receive the `Stop` event. - Defaults to 128 blocks - suspended duration: The amount of time for which subscriptions are suspended - Defaults to 30 seconds cc @paritytech/subxt-team --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Sebastian Kunert <[email protected]>
This PR ensure that the distance between any leaf and the finalized block is within a reasonable distance.
For a new subscription, the chainHead has to provide all blocks between the leaves of the chain and the finalized block.
When the distance between a leaf and the finalized block is large:
(For more details see chainHead/follow: Provide multiple block hashes to the initialized event #3445 (comment))
The configuration of the ChainHead is extended with:
Stopevent, all blocks are unpinned and data discarded.Stopevent.cc @paritytech/subxt-team