From 4b8578e7e4ae3f30dd05e8b257bad97bb42e43ee Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Sat, 9 Nov 2019 09:11:13 +0100 Subject: [PATCH] Fix sync downloading ancient chains (#4060) * Update best block on announcement * Added a test --- substrate/core/network/src/protocol/sync.rs | 2 +- substrate/core/network/src/test/sync.rs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/substrate/core/network/src/protocol/sync.rs b/substrate/core/network/src/protocol/sync.rs index d4ecd0e1dc..c9465e4b74 100644 --- a/substrate/core/network/src/protocol/sync.rs +++ b/substrate/core/network/src/protocol/sync.rs @@ -1037,7 +1037,7 @@ impl ChainSync { peer.recently_announced.pop_front(); } peer.recently_announced.push_back(hash.clone()); - if is_best && number > peer.best_number { + if is_best { // update their best block peer.best_number = number; peer.best_hash = hash; diff --git a/substrate/core/network/src/test/sync.rs b/substrate/core/network/src/test/sync.rs index dd9185373f..768ee1c34e 100644 --- a/substrate/core/network/src/test/sync.rs +++ b/substrate/core/network/src/test/sync.rs @@ -633,3 +633,21 @@ fn syncs_header_only_forks() { })).unwrap(); } +#[test] +fn does_not_sync_announced_old_best_block() { + let _ = ::env_logger::try_init(); + let mut runtime = current_thread::Runtime::new().unwrap(); + let mut net = TestNet::new(3); + + let old_hash = net.peer(0).push_blocks(1, false); + net.peer(0).push_blocks(19, true); + net.peer(1).push_blocks(20, true); + + net.peer(0).announce_block(old_hash, Vec::new()); + runtime.block_on(futures::future::poll_fn::<(), (), _>(|| -> Result<_, ()> { + // poll once to import announcement + net.poll(); + Ok(Async::Ready(())) + })).unwrap(); + assert!(!net.peer(1).is_major_syncing()); +}