guard import order
This commit is contained in:
		
							parent
							
								
									e57ab96731
								
							
						
					
					
						commit
						2c0f456e4d
					
				@ -104,13 +104,16 @@ impl HeaderChain {
 | 
			
		||||
		let number = view.number();
 | 
			
		||||
		let parent_hash = view.parent_hash();
 | 
			
		||||
 | 
			
		||||
		// hold candidates the whole time to guard import order.
 | 
			
		||||
		let mut candidates = self.candidates.write();
 | 
			
		||||
 | 
			
		||||
		// find parent details.
 | 
			
		||||
		let parent_td = {
 | 
			
		||||
			if number == 1 {
 | 
			
		||||
				let g_view = HeaderView::new(&self.genesis_header);
 | 
			
		||||
				g_view.difficulty()
 | 
			
		||||
			} else {
 | 
			
		||||
				let maybe_td = self.candidates.read().get(&(number - 1))
 | 
			
		||||
				let maybe_td = candidates.get(&(number - 1))
 | 
			
		||||
					.and_then(|entry| entry.candidates.iter().find(|c| c.hash == parent_hash))
 | 
			
		||||
					.map(|c| c.total_difficulty);
 | 
			
		||||
 | 
			
		||||
@ -124,7 +127,6 @@ impl HeaderChain {
 | 
			
		||||
		let total_difficulty = parent_td + view.difficulty();
 | 
			
		||||
 | 
			
		||||
		// insert headers and candidates entries.
 | 
			
		||||
		let mut candidates = self.candidates.write();
 | 
			
		||||
		candidates.entry(number).or_insert_with(|| Entry { candidates: SmallVec::new(), canonical_hash: hash})
 | 
			
		||||
			.candidates.push(Candidate {
 | 
			
		||||
				hash: hash,
 | 
			
		||||
 | 
			
		||||
@ -76,6 +76,7 @@ pub struct Client {
 | 
			
		||||
	queue: HeaderQueue,
 | 
			
		||||
	chain: HeaderChain,
 | 
			
		||||
	tx_pool: Mutex<H256FastMap<SignedTransaction>>,
 | 
			
		||||
	import_lock: Mutex<()>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Client {
 | 
			
		||||
@ -85,6 +86,7 @@ impl Client {
 | 
			
		||||
			queue: HeaderQueue::new(config.queue, spec.engine.clone(), io_channel, true),
 | 
			
		||||
			chain: HeaderChain::new(&::rlp::encode(&spec.genesis_header())),
 | 
			
		||||
			tx_pool: Mutex::new(Default::default()),
 | 
			
		||||
			import_lock: Mutex::new(()),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -149,15 +151,17 @@ impl Client {
 | 
			
		||||
	pub fn import_verified(&self) {
 | 
			
		||||
		const MAX: usize = 256;
 | 
			
		||||
 | 
			
		||||
		let _lock = self.import_lock.lock();
 | 
			
		||||
 | 
			
		||||
		let mut bad = Vec::new();
 | 
			
		||||
		let mut good = Vec::new();
 | 
			
		||||
		for verified_header in self.queue.drain(MAX) {
 | 
			
		||||
			let hash = verified_header.hash();
 | 
			
		||||
			let (num, hash) = (verified_header.number(), verified_header.hash());
 | 
			
		||||
 | 
			
		||||
			match self.chain.insert(::rlp::encode(&verified_header).to_vec()) {
 | 
			
		||||
				Ok(()) => good.push(hash),
 | 
			
		||||
				Err(e) => {
 | 
			
		||||
					debug!(target: "client", "Error importing header {}: {}", hash, e);
 | 
			
		||||
					debug!(target: "client", "Error importing header {:?}: {}", (num, hash), e);
 | 
			
		||||
					bad.push(hash);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user