mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 19:17:58 +00:00
Clean obsolete BABE's weight data (#10748)
* Clean obsolete BABE weight data * Take out test assertion from check closure * Optimize metadata access using `HeaderMetadata` trait * Apply suggestions from code review * Introduce finalize and import pre-commit synchronous actions * Do not hold locks between internal methods calls * Remove unused generic bound * Apply suggestions from code review * Register BABE's pre-commit actions on `block_import` instead of `start_babe` * PreCommit actions should be `Fn` instead of `FnMut` * More robust safenet in case of malformed finality notifications Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com>
This commit is contained in:
@@ -75,6 +75,8 @@ pub struct ImportSummary<Block: BlockT> {
|
||||
/// Contains information about the block that just got finalized,
|
||||
/// including tree heads that became stale at the moment of finalization.
|
||||
pub struct FinalizeSummary<Block: BlockT> {
|
||||
/// Last finalized block header.
|
||||
pub header: Block::Header,
|
||||
/// Blocks that were finalized.
|
||||
/// The last entry is the one that has been explicitly finalized.
|
||||
pub finalized: Vec<Block::Hash>,
|
||||
|
||||
@@ -27,7 +27,8 @@ use sp_runtime::{
|
||||
};
|
||||
use std::{collections::HashSet, convert::TryFrom, fmt, sync::Arc};
|
||||
|
||||
use crate::{blockchain::Info, notifications::StorageEventStream};
|
||||
use crate::{blockchain::Info, notifications::StorageEventStream, FinalizeSummary, ImportSummary};
|
||||
|
||||
use sc_transaction_pool_api::ChainEvent;
|
||||
use sc_utils::mpsc::TracingUnboundedReceiver;
|
||||
use sp_blockchain;
|
||||
@@ -76,6 +77,34 @@ pub trait BlockchainEvents<Block: BlockT> {
|
||||
) -> sp_blockchain::Result<StorageEventStream<Block::Hash>>;
|
||||
}
|
||||
|
||||
/// List of operations to be performed on storage aux data.
|
||||
/// First tuple element is the encoded data key.
|
||||
/// Second tuple element is the encoded optional data to write.
|
||||
/// If `None`, the key and the associated data are deleted from storage.
|
||||
pub type AuxDataOperations = Vec<(Vec<u8>, Option<Vec<u8>>)>;
|
||||
|
||||
/// Callback invoked before committing the operations created during block import.
|
||||
/// This gives the opportunity to perform auxiliary pre-commit actions and optionally
|
||||
/// enqueue further storage write operations to be atomically performed on commit.
|
||||
pub type OnImportAction<Block> =
|
||||
Box<dyn (Fn(&BlockImportNotification<Block>) -> AuxDataOperations) + Send>;
|
||||
|
||||
/// Callback invoked before committing the operations created during block finalization.
|
||||
/// This gives the opportunity to perform auxiliary pre-commit actions and optionally
|
||||
/// enqueue further storage write operations to be atomically performed on commit.
|
||||
pub type OnFinalityAction<Block> =
|
||||
Box<dyn (Fn(&FinalityNotification<Block>) -> AuxDataOperations) + Send>;
|
||||
|
||||
/// Interface to perform auxiliary actions before committing a block import or
|
||||
/// finality operation.
|
||||
pub trait PreCommitActions<Block: BlockT> {
|
||||
/// Actions to be performed on block import.
|
||||
fn register_import_action(&self, op: OnImportAction<Block>);
|
||||
|
||||
/// Actions to be performed on block finalization.
|
||||
fn register_finality_action(&self, op: OnFinalityAction<Block>);
|
||||
}
|
||||
|
||||
/// Interface for fetching block data.
|
||||
pub trait BlockBackend<Block: BlockT> {
|
||||
/// Get block body by ID. Returns `None` if the body is not stored.
|
||||
@@ -300,3 +329,27 @@ impl<B: BlockT> From<FinalityNotification<B>> for ChainEvent<B> {
|
||||
Self::Finalized { hash: n.hash, tree_route: n.tree_route }
|
||||
}
|
||||
}
|
||||
|
||||
impl<B: BlockT> From<FinalizeSummary<B>> for FinalityNotification<B> {
|
||||
fn from(mut summary: FinalizeSummary<B>) -> Self {
|
||||
let hash = summary.finalized.pop().unwrap_or_default();
|
||||
FinalityNotification {
|
||||
hash,
|
||||
header: summary.header,
|
||||
tree_route: Arc::new(summary.finalized),
|
||||
stale_heads: Arc::new(summary.stale_heads),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<B: BlockT> From<ImportSummary<B>> for BlockImportNotification<B> {
|
||||
fn from(summary: ImportSummary<B>) -> Self {
|
||||
BlockImportNotification {
|
||||
hash: summary.hash,
|
||||
origin: summary.origin,
|
||||
header: summary.header,
|
||||
is_new_best: summary.is_new_best,
|
||||
tree_route: summary.tree_route.map(Arc::new),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user