sync: retry different peer after empty subchain heads response (#9753)
* If no subchain heads then try a different peer * Add log when useless chain head * Restrict ChainHead useless peer to ancient blocks * sync: replace `limit_reorg` with `block_set` condition
This commit is contained in:
		
							parent
							
								
									f4c421f77a
								
							
						
					
					
						commit
						9a2c4a34ee
					
				@ -136,8 +136,6 @@ pub struct BlockDownloader {
 | 
			
		||||
	target_hash: Option<H256>,
 | 
			
		||||
	/// Probing range for seeking common best block.
 | 
			
		||||
	retract_step: u64,
 | 
			
		||||
	/// Whether reorg should be limited.
 | 
			
		||||
	limit_reorg: bool,
 | 
			
		||||
	/// consecutive useless headers this round
 | 
			
		||||
	useless_headers_count: usize,
 | 
			
		||||
}
 | 
			
		||||
@ -146,12 +144,12 @@ impl BlockDownloader {
 | 
			
		||||
	/// Create a new instance of syncing strategy.
 | 
			
		||||
	/// For BlockSet::NewBlocks this won't reorganize to before the last kept state.
 | 
			
		||||
	pub fn new(block_set: BlockSet, start_hash: &H256, start_number: BlockNumber) -> Self {
 | 
			
		||||
		let (limit_reorg, sync_receipts) = match block_set {
 | 
			
		||||
			BlockSet::NewBlocks => (true, false),
 | 
			
		||||
			BlockSet::OldBlocks => (false, true)
 | 
			
		||||
		let sync_receipts = match block_set {
 | 
			
		||||
			BlockSet::NewBlocks => false,
 | 
			
		||||
			BlockSet::OldBlocks => true
 | 
			
		||||
		};
 | 
			
		||||
		BlockDownloader {
 | 
			
		||||
			block_set: block_set,
 | 
			
		||||
			block_set,
 | 
			
		||||
			state: State::Idle,
 | 
			
		||||
			highest_block: None,
 | 
			
		||||
			last_imported_block: start_number,
 | 
			
		||||
@ -164,7 +162,6 @@ impl BlockDownloader {
 | 
			
		||||
			download_receipts: sync_receipts,
 | 
			
		||||
			target_hash: None,
 | 
			
		||||
			retract_step: 1,
 | 
			
		||||
			limit_reorg: limit_reorg,
 | 
			
		||||
			useless_headers_count: 0,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -321,12 +318,20 @@ impl BlockDownloader {
 | 
			
		||||
					self.state = State::Blocks;
 | 
			
		||||
					return Ok(DownloadAction::Reset);
 | 
			
		||||
				} else {
 | 
			
		||||
					trace_sync!(self, "No useful subchain heads received, expected hash {:?}", expected_hash);
 | 
			
		||||
					let best = io.chain().chain_info().best_block_number;
 | 
			
		||||
					let oldest_reorg = io.chain().pruning_info().earliest_state;
 | 
			
		||||
					let last = self.last_imported_block;
 | 
			
		||||
					if self.limit_reorg && best > last && (last == 0 || last < oldest_reorg) {
 | 
			
		||||
						trace_sync!(self, "No common block, disabling peer");
 | 
			
		||||
						return Err(BlockDownloaderImportError::Invalid);
 | 
			
		||||
					match self.block_set {
 | 
			
		||||
						BlockSet::NewBlocks if best > last && (last == 0 || last < oldest_reorg) => {
 | 
			
		||||
							trace_sync!(self, "No common block, disabling peer");
 | 
			
		||||
							return Err(BlockDownloaderImportError::Invalid)
 | 
			
		||||
						},
 | 
			
		||||
						BlockSet::OldBlocks => {
 | 
			
		||||
							trace_sync!(self, "Expected some useful headers for downloading OldBlocks. Try a different peer");
 | 
			
		||||
							return Err(BlockDownloaderImportError::Useless)
 | 
			
		||||
						},
 | 
			
		||||
						_ => (),
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
@ -429,7 +434,7 @@ impl BlockDownloader {
 | 
			
		||||
				} else {
 | 
			
		||||
					let best = io.chain().chain_info().best_block_number;
 | 
			
		||||
					let oldest_reorg = io.chain().pruning_info().earliest_state;
 | 
			
		||||
					if self.limit_reorg && best > start && start < oldest_reorg {
 | 
			
		||||
					if self.block_set == BlockSet::NewBlocks && best > start && start < oldest_reorg {
 | 
			
		||||
						debug_sync!(self, "Could not revert to previous ancient block, last: {} ({})", start, start_hash);
 | 
			
		||||
						self.reset();
 | 
			
		||||
					} else {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user