mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-24 21:45:41 +00:00
grandpa: reannounce voted blocks periodically (#3602)
* grandpa: reannounce latest voted blocks periodically * grandpa: add test for background block announcement * grandpa: configurable delay for background block announcer * grandpa: nits
This commit is contained in:
@@ -233,6 +233,7 @@ pub(crate) struct NetworkBridge<B: BlockT, N: Network<B>> {
|
||||
service: N,
|
||||
validator: Arc<GossipValidator<B>>,
|
||||
neighbor_sender: periodic::NeighborPacketSender<B>,
|
||||
announce_sender: periodic::BlockAnnounceSender<B>,
|
||||
}
|
||||
|
||||
impl<B: BlockT, N: Network<B>> NetworkBridge<B, N> {
|
||||
@@ -299,9 +300,10 @@ impl<B: BlockT, N: Network<B>> NetworkBridge<B, N> {
|
||||
}
|
||||
|
||||
let (rebroadcast_job, neighbor_sender) = periodic::neighbor_packet_worker(service.clone());
|
||||
let (announce_job, announce_sender) = periodic::block_announce_worker(service.clone());
|
||||
let reporting_job = report_stream.consume(service.clone());
|
||||
|
||||
let bridge = NetworkBridge { service, validator, neighbor_sender };
|
||||
let bridge = NetworkBridge { service, validator, neighbor_sender, announce_sender };
|
||||
|
||||
let startup_work = futures::future::lazy(move || {
|
||||
// lazily spawn these jobs onto their own tasks. the lazy future has access
|
||||
@@ -309,6 +311,8 @@ impl<B: BlockT, N: Network<B>> NetworkBridge<B, N> {
|
||||
let mut executor = tokio_executor::DefaultExecutor::current();
|
||||
executor.spawn(Box::new(rebroadcast_job.select(on_exit.clone()).then(|_| Ok(()))))
|
||||
.expect("failed to spawn grandpa rebroadcast job task");
|
||||
executor.spawn(Box::new(announce_job.select(on_exit.clone()).then(|_| Ok(()))))
|
||||
.expect("failed to spawn grandpa block announce job task");
|
||||
executor.spawn(Box::new(reporting_job.select(on_exit.clone()).then(|_| Ok(()))))
|
||||
.expect("failed to spawn grandpa reporting job task");
|
||||
Ok(())
|
||||
@@ -424,6 +428,7 @@ impl<B: BlockT, N: Network<B>> NetworkBridge<B, N> {
|
||||
network: self.service.clone(),
|
||||
locals,
|
||||
sender: tx,
|
||||
announce_sender: self.announce_sender.clone(),
|
||||
has_voted,
|
||||
};
|
||||
|
||||
@@ -616,6 +621,7 @@ impl<B: BlockT, N: Network<B>> Clone for NetworkBridge<B, N> {
|
||||
service: self.service.clone(),
|
||||
validator: Arc::clone(&self.validator),
|
||||
neighbor_sender: self.neighbor_sender.clone(),
|
||||
announce_sender: self.announce_sender.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -662,6 +668,7 @@ struct OutgoingMessages<Block: BlockT, N: Network<Block>> {
|
||||
set_id: SetIdNumber,
|
||||
locals: Option<(AuthorityPair, AuthorityId)>,
|
||||
sender: mpsc::UnboundedSender<SignedMessage<Block>>,
|
||||
announce_sender: periodic::BlockAnnounceSender<Block>,
|
||||
network: N,
|
||||
has_voted: HasVoted<Block>,
|
||||
}
|
||||
@@ -719,10 +726,10 @@ impl<Block: BlockT, N: Network<Block>> Sink for OutgoingMessages<Block, N>
|
||||
"block" => ?target_hash, "round" => ?self.round, "set_id" => ?self.set_id,
|
||||
);
|
||||
|
||||
// announce our block hash to peers and propagate the
|
||||
// message.
|
||||
self.network.announce(target_hash);
|
||||
// send the target block hash to the background block announcer
|
||||
self.announce_sender.send(target_hash);
|
||||
|
||||
// propagate the message to peers
|
||||
let topic = round_topic::<Block>(self.round, self.set_id);
|
||||
self.network.gossip_message(topic, message.encode(), false);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user