limit to one pending request per peer
This commit is contained in:
		
							parent
							
								
									a7505be627
								
							
						
					
					
						commit
						653363c572
					
				@ -53,6 +53,7 @@ struct ChainInfo {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct Peer {
 | 
					struct Peer {
 | 
				
			||||||
	status: ChainInfo,
 | 
						status: ChainInfo,
 | 
				
			||||||
 | 
						working: bool,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Peer {
 | 
					impl Peer {
 | 
				
			||||||
@ -60,8 +61,18 @@ impl Peer {
 | 
				
			|||||||
	fn new(chain_info: ChainInfo) -> Self {
 | 
						fn new(chain_info: ChainInfo) -> Self {
 | 
				
			||||||
		Peer {
 | 
							Peer {
 | 
				
			||||||
			status: chain_info,
 | 
								status: chain_info,
 | 
				
			||||||
 | 
								working: false,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// whether the peer is fully loaded with requests.
 | 
				
			||||||
 | 
						fn is_fully_loaded(&self) -> bool { self.working }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// signal that the peer's load has been lightened.
 | 
				
			||||||
 | 
						fn load_lightened(&mut self) { self.working = false }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// signal that the peer's load has been increased.
 | 
				
			||||||
 | 
						fn load_increased(&mut self) { self.working = true }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// search for a common ancestor with the best chain.
 | 
					// search for a common ancestor with the best chain.
 | 
				
			||||||
@ -288,8 +299,9 @@ impl<L: LightChainClient> Handler for LightSync<L> {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn on_block_headers(&self, ctx: &EventContext, req_id: ReqId, headers: &[Bytes]) {
 | 
						fn on_block_headers(&self, ctx: &EventContext, req_id: ReqId, headers: &[Bytes]) {
 | 
				
			||||||
		if !self.peers.read().contains_key(&ctx.peer()) {
 | 
							match self.peers.read().get(&ctx.peer()) {
 | 
				
			||||||
			return;
 | 
								Some(peer) => peer.lock().load_lightened(),
 | 
				
			||||||
 | 
								None => return,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -418,9 +430,15 @@ impl<L: LightChainClient> LightSync<L> {
 | 
				
			|||||||
				rng.shuffle(&mut peer_ids);
 | 
									rng.shuffle(&mut peer_ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for peer in &peer_ids {
 | 
									for peer in &peer_ids {
 | 
				
			||||||
 | 
										let peer_info = peers.get(peer).expect("key known to be present; qed");
 | 
				
			||||||
 | 
										let mut peer_info = peer_info.lock();
 | 
				
			||||||
 | 
										if peer_info.is_fully_loaded() { continue }
 | 
				
			||||||
					if ctx.max_requests(*peer, request::Kind::Headers) >= req.max {
 | 
										if ctx.max_requests(*peer, request::Kind::Headers) >= req.max {
 | 
				
			||||||
						match ctx.request_from(*peer, request::Request::Headers(req.clone())) {
 | 
											match ctx.request_from(*peer, request::Request::Headers(req.clone())) {
 | 
				
			||||||
							Ok(id) => return Some(id),
 | 
												Ok(id) => {
 | 
				
			||||||
 | 
													peer_info.load_increased();
 | 
				
			||||||
 | 
													return Some(id)
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
							Err(e) =>
 | 
												Err(e) =>
 | 
				
			||||||
								trace!(target: "sync", "Error requesting headers from viable peer: {}", e),
 | 
													trace!(target: "sync", "Error requesting headers from viable peer: {}", e),
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user