Skip to content
Snippets Groups Projects
Commit 40e48684 authored by Bastian Köcher's avatar Bastian Köcher Committed by GitHub
Browse files

Track last blocks in informant display (#6429)

This implements tracking of the last seen blocks in informant display
to prevent printing the import message twice. In Cumulus we first import
blocks as part of the block building with `new_best == false` and set
the best block after we know which one was included by the relay chain.
This leads to printing the import messages two times. This pr solves the
problem by track the latest seen blocks to not print the message twice.
parent be7f1df3
No related merge requests found
......@@ -28,9 +28,7 @@ use sp_blockchain::HeaderMetadata;
use sp_runtime::traits::{Block as BlockT, Header};
use sp_transaction_pool::TransactionPool;
use sp_utils::{status_sinks, mpsc::tracing_unbounded};
use std::fmt::Display;
use std::sync::Arc;
use std::time::Duration;
use std::{fmt::Display, sync::Arc, time::Duration, collections::VecDeque};
use parking_lot::Mutex;
mod display;
......@@ -96,12 +94,30 @@ where
future::ready(())
});
future::join(
display_notifications,
display_block_import(client, format.prefix),
).map(|_| ())
}
fn display_block_import<B: BlockT, C>(
client: Arc<C>,
prefix: String,
) -> impl Future<Output = ()>
where
C: UsageProvider<B> + HeaderMetadata<B> + BlockchainEvents<B>,
<C as HeaderMetadata<B>>::Error: Display,
{
let mut last_best = {
let info = client.usage_info();
Some((info.chain.best_number, info.chain.best_hash))
};
let display_block_import = client.import_notification_stream().for_each(move |n| {
// Hashes of the last blocks we have seen at import.
let mut last_blocks = VecDeque::new();
let max_blocks_to_track = 100;
client.import_notification_stream().for_each(move |n| {
// detect and log reorganizations.
if let Some((ref last_num, ref last_hash)) = last_best {
if n.header.parent_hash() != last_hash && n.is_new_best {
......@@ -114,7 +130,7 @@ where
match maybe_ancestor {
Ok(ref ancestor) if ancestor.hash != *last_hash => info!(
"♻️ {}Reorg on #{},{} to #{},{}, common ancestor #{},{}",
format.prefix,
prefix,
Colour::Red.bold().paint(format!("{}", last_num)), last_hash,
Colour::Green.bold().paint(format!("{}", n.header.number())), n.hash,
Colour::White.bold().paint(format!("{}", ancestor.number)), ancestor.hash,
......@@ -129,18 +145,25 @@ where
last_best = Some((n.header.number().clone(), n.hash.clone()));
}
info!(
target: "substrate",
"✨ {}Imported #{} ({})",
format.prefix,
Colour::White.bold().paint(format!("{}", n.header.number())),
n.hash,
);
future::ready(())
});
future::join(
display_notifications,
display_block_import
).map(|_| ())
// If we already printed a message for a given block recently,
// we should not print it again.
if !last_blocks.contains(&n.hash) {
last_blocks.push_back(n.hash.clone());
if last_blocks.len() > max_blocks_to_track {
last_blocks.pop_front();
}
info!(
target: "substrate",
"✨ {}Imported #{} ({})",
prefix,
Colour::White.bold().paint(format!("{}", n.header.number())),
n.hash,
);
}
future::ready(())
})
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment