diff --git a/client/network/sync/src/blocks.rs b/client/network/sync/src/blocks.rs index 2cca13bfd7cc7..8d9b039b14fba 100644 --- a/client/network/sync/src/blocks.rs +++ b/client/network/sync/src/blocks.rs @@ -18,7 +18,7 @@ use crate::message; use libp2p::PeerId; -use log::{debug, trace}; +use log::trace; use sp_runtime::traits::{Block as BlockT, NumberFor, One}; use std::{ cmp, @@ -212,18 +212,13 @@ impl BlockCollection { } pub fn clear_queued(&mut self, from_hash: &B::Hash) { - match self.queued_blocks.remove(from_hash) { - None => { - debug!(target: "sync", "Can't clear unknown queued blocks from {:?}", from_hash); - }, - Some((from, to)) => { - let mut block_num = from; - while block_num < to { - self.blocks.remove(&block_num); - block_num += One::one(); - } - trace!(target: "sync", "Cleared blocks from {:?} to {:?}", from, to); - }, + if let Some((from, to)) = self.queued_blocks.remove(from_hash) { + let mut block_num = from; + while block_num < to { + self.blocks.remove(&block_num); + block_num += One::one(); + } + trace!(target: "sync", "Cleared blocks from {:?} to {:?}", from, to); } } diff --git a/client/network/sync/src/lib.rs b/client/network/sync/src/lib.rs index 4465e840c5ef5..5b5216c745c98 100644 --- a/client/network/sync/src/lib.rs +++ b/client/network/sync/src/lib.rs @@ -1520,9 +1520,7 @@ where let mut has_error = false; for (_, hash) in &results { self.queue_blocks.remove(hash); - } - if let Some(from_hash) = results.first().map(|(_, h)| h) { - self.blocks.clear_queued(from_hash); + self.blocks.clear_queued(hash); } for (result, hash) in results { if has_error { @@ -3299,23 +3297,34 @@ mod test { ); } + let mut notify_imported: Vec<_> = resp_blocks + .iter() + .rev() + .map(|b| { + ( + Ok(BlockImportStatus::ImportedUnknown( + b.header().number().clone(), + Default::default(), + Some(peer_id1.clone()), + )), + b.hash(), + ) + }) + .collect(); + + // The import queue may send notifications in batches of varying size. So we simulate + // this here by splitting the batch into 2 notifications. + let second_batch = notify_imported.split_off(notify_imported.len() / 2); let _ = sync.on_blocks_processed( MAX_BLOCKS_TO_REQUEST as usize, MAX_BLOCKS_TO_REQUEST as usize, - resp_blocks - .iter() - .rev() - .map(|b| { - ( - Ok(BlockImportStatus::ImportedUnknown( - b.header().number().clone(), - Default::default(), - Some(peer_id1.clone()), - )), - b.hash(), - ) - }) - .collect(), + notify_imported, + ); + + let _ = sync.on_blocks_processed( + MAX_BLOCKS_TO_REQUEST as usize, + MAX_BLOCKS_TO_REQUEST as usize, + second_batch, ); resp_blocks