diff --git a/substrate/core/network/src/protocol.rs b/substrate/core/network/src/protocol.rs index 88252d7786..b561322b5b 100644 --- a/substrate/core/network/src/protocol.rs +++ b/substrate/core/network/src/protocol.rs @@ -442,6 +442,11 @@ impl, H: ExHashT> Protocol { self.sync.status().num_peers } + /// Number of blocks in the import queue. + pub fn num_queued_blocks(&self) -> u32 { + self.sync.status().queued_blocks + } + /// Starts a new data demand request. /// /// The parameter contains a `Sender` where the result, once received, must be sent. diff --git a/substrate/core/network/src/protocol/sync.rs b/substrate/core/network/src/protocol/sync.rs index 12f0ac6568..80b0662c6b 100644 --- a/substrate/core/network/src/protocol/sync.rs +++ b/substrate/core/network/src/protocol/sync.rs @@ -198,7 +198,9 @@ pub struct Status { /// Target sync block number. pub best_seen_block: Option>, /// Number of peers participating in syncing. - pub num_peers: u32 + pub num_peers: u32, + /// Number of blocks queued for import + pub queued_blocks: u32, } /// A peer did not behave as expected and should be reported. @@ -317,7 +319,8 @@ impl ChainSync { Status { state: sync_state, best_seen_block: best_seen, - num_peers: self.peers.len() as u32 + num_peers: self.peers.len() as u32, + queued_blocks: self.queue_blocks.len() as u32, } } diff --git a/substrate/core/network/src/service.rs b/substrate/core/network/src/service.rs index ff5db5f702..eed5de85ed 100644 --- a/substrate/core/network/src/service.rs +++ b/substrate/core/network/src/service.rs @@ -280,6 +280,11 @@ impl, H: ExHashT> NetworkWorker self.network_service.user_protocol().num_sync_peers() } + /// Number of blocks in the import queue. + pub fn num_queued_blocks(&self) -> u32 { + self.network_service.user_protocol().num_queued_blocks() + } + /// Adds an address for a node. pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { self.network_service.add_known_address(peer_id, addr); diff --git a/substrate/core/network/src/test/mod.rs b/substrate/core/network/src/test/mod.rs index f12b4c8237..091047394b 100644 --- a/substrate/core/network/src/test/mod.rs +++ b/substrate/core/network/src/test/mod.rs @@ -591,6 +591,9 @@ pub trait TestNetFactory: Sized { // Return `NotReady` if there's a mismatch in the highest block number. let mut highest = None; for peer in self.peers().iter() { + if peer.is_major_syncing() || peer.network.num_queued_blocks() != 0 { + return Async::NotReady + } match (highest, peer.client.info().chain.best_number) { (None, b) => highest = Some(b), (Some(ref a), ref b) if a == b => {},