Add block event forwarding into the Overseer (#1192)

* Add block event forwarding into the Overseer

* Add a doc comment

* Fix a doc comment
This commit is contained in:
Fedor Sakharov
2020-06-03 19:49:04 +03:00
committed by GitHub
parent fc45a8e673
commit f25fd672af
3 changed files with 62 additions and 1 deletions
+1
View File
@@ -3309,6 +3309,7 @@ dependencies = [
"kv-log-macro", "kv-log-macro",
"log 0.4.8", "log 0.4.8",
"polkadot-primitives", "polkadot-primitives",
"sc-client-api",
"streamunordered", "streamunordered",
] ]
+1
View File
@@ -10,6 +10,7 @@ log = "0.4.8"
futures-timer = "3.0.2" futures-timer = "3.0.2"
streamunordered = "0.5.1" streamunordered = "0.5.1"
polkadot-primitives = { path = "../primitives" } polkadot-primitives = { path = "../primitives" }
client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" }
[dev-dependencies] [dev-dependencies]
futures = { version = "0.3.5", features = ["thread-pool"] } futures = { version = "0.3.5", features = ["thread-pool"] }
+60 -1
View File
@@ -71,7 +71,8 @@ use futures::{
use futures_timer::Delay; use futures_timer::Delay;
use streamunordered::{StreamYield, StreamUnordered}; use streamunordered::{StreamYield, StreamUnordered};
use polkadot_primitives::{BlockNumber, Hash}; use polkadot_primitives::{Block, BlockNumber, Hash};
use client::{BlockImportNotification, BlockchainEvents, FinalityNotification};
/// An error type that describes faults that may happen /// An error type that describes faults that may happen
/// ///
@@ -154,6 +155,26 @@ pub struct BlockInfo {
pub number: BlockNumber, pub number: BlockNumber,
} }
impl From<BlockImportNotification<Block>> for BlockInfo {
fn from(n: BlockImportNotification<Block>) -> Self {
BlockInfo {
hash: n.hash,
parent_hash: n.header.parent_hash,
number: n.header.number,
}
}
}
impl From<FinalityNotification<Block>> for BlockInfo {
fn from(n: FinalityNotification<Block>) -> Self {
BlockInfo {
hash: n.hash,
parent_hash: n.header.parent_hash,
number: n.header.number,
}
}
}
/// Some event from outer world. /// Some event from outer world.
enum Event { enum Event {
BlockImported(BlockInfo), BlockImported(BlockInfo),
@@ -172,6 +193,7 @@ pub enum OutboundMessage {
/// A handler used to communicate with the [`Overseer`]. /// A handler used to communicate with the [`Overseer`].
/// ///
/// [`Overseer`]: struct.Overseer.html /// [`Overseer`]: struct.Overseer.html
#[derive(Clone)]
pub struct OverseerHandler { pub struct OverseerHandler {
events_tx: mpsc::Sender<Event>, events_tx: mpsc::Sender<Event>,
} }
@@ -206,6 +228,43 @@ impl OverseerHandler {
} }
} }
/// Glues together the [`Overseer`] and `BlockchainEvents` by forwarding
/// import and finality notifications into the [`OverseerHandler`].
///
/// [`Overseer`]: struct.Overseer.html
/// [`OverseerHandler`]: struct.OverseerHandler.html
pub async fn forward_events<P: BlockchainEvents<Block>>(
client: P,
mut handler: OverseerHandler,
) -> SubsystemResult<()> {
let mut finality = client.finality_notification_stream();
let mut imports = client.import_notification_stream();
loop {
select! {
f = finality.next() => {
match f {
Some(block) => {
handler.block_finalized(block.into()).await?;
}
None => break,
}
},
i = imports.next() => {
match i {
Some(block) => {
handler.block_imported(block.into()).await?;
}
None => break,
}
},
complete => break,
}
}
Ok(())
}
impl Debug for ToOverseer { impl Debug for ToOverseer {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {