light: max requests as 0 on unknown peer

This commit is contained in:
Robert Habermeier 2016-12-13 20:13:55 +01:00
parent 2a01b43bd1
commit 484023b171
3 changed files with 17 additions and 15 deletions

View File

@ -16,13 +16,9 @@
//! Light client implementation. Stores data from light sync //! Light client implementation. Stores data from light sync
use std::sync::Arc;
use ethcore::engines::Engine;
use ethcore::ids::BlockId;
use ethcore::block_import_error::BlockImportError; use ethcore::block_import_error::BlockImportError;
use ethcore::block_status::BlockStatus; use ethcore::block_status::BlockStatus;
use ethcore::verification::queue::{HeaderQueue, QueueInfo, Config as QueueConfig}; use ethcore::verification::queue::{self, HeaderQueue};
use ethcore::transaction::SignedTransaction; use ethcore::transaction::SignedTransaction;
use ethcore::blockchain_info::BlockChainInfo; use ethcore::blockchain_info::BlockChainInfo;
use ethcore::spec::Spec; use ethcore::spec::Spec;
@ -37,12 +33,13 @@ use request;
use self::header_chain::HeaderChain; use self::header_chain::HeaderChain;
mod cht;
mod header_chain; mod header_chain;
/// Configuration for the light client. /// Configuration for the light client.
#[derive(Debug, Default, Clone)] #[derive(Debug, Default, Clone)]
pub struct Config { pub struct Config {
queue: QueueConfig, queue: queue::Config,
} }
/// Light client implementation. /// Light client implementation.
@ -79,15 +76,19 @@ impl Client {
self.tx_pool.lock().values().cloned().collect() self.tx_pool.lock().values().cloned().collect()
} }
/// Inquire about the status of a given block (or header). /// Inquire about the status of a given header.
pub fn status(&self, id: BlockId) -> BlockStatus { pub fn status(&self, hash: &H256) -> BlockStatus {
BlockStatus::Unknown match self.queue.status(hash) {
queue::Status::Unknown => self.chain.status(hash),
other => other.into(),
}
} }
/// Get the header queue info. /// Get the header queue info.
pub fn queue_info(&self) -> QueueInfo { pub fn queue_info(&self) -> queue::QueueInfo {
self.queue.queue_info() self.queue.queue_info()
} }
} }
// dummy implementation -- may draw from canonical cache further on. // dummy implementation -- may draw from canonical cache further on.

View File

@ -95,7 +95,7 @@ pub trait EventContext {
/// Find the maximum number of requests of a specific type which can be made from /// Find the maximum number of requests of a specific type which can be made from
/// supplied peer. /// supplied peer.
fn max_requests(&self, peer: PeerId, kind: request::Kind) -> Option<usize>; fn max_requests(&self, peer: PeerId, kind: request::Kind) -> usize;
/// Disconnect a peer. /// Disconnect a peer.
fn disconnect_peer(&self, peer: PeerId); fn disconnect_peer(&self, peer: PeerId);
@ -132,7 +132,7 @@ impl<'a> EventContext for Ctx<'a> {
self.proto.make_announcement(self.io, announcement); self.proto.make_announcement(self.io, announcement);
} }
fn max_requests(&self, peer: PeerId, kind: request::Kind) -> Option<usize> { fn max_requests(&self, peer: PeerId, kind: request::Kind) -> usize {
self.proto.max_requests(peer, kind) self.proto.max_requests(peer, kind)
} }

View File

@ -255,8 +255,9 @@ impl LightProtocol {
} }
/// Check the maximum amount of requests of a specific type /// Check the maximum amount of requests of a specific type
/// which a peer would be able to serve. /// which a peer would be able to serve. Returns zero if the
pub fn max_requests(&self, peer: PeerId, kind: request::Kind) -> Option<usize> { /// peer is unknown or has no buffer flow parameters.
pub fn max_requests(&self, peer: PeerId, kind: request::Kind) -> usize {
self.peers.read().get(&peer).and_then(|peer| { self.peers.read().get(&peer).and_then(|peer| {
let mut peer = peer.lock(); let mut peer = peer.lock();
match peer.remote_flow.as_mut() { match peer.remote_flow.as_mut() {
@ -266,7 +267,7 @@ impl LightProtocol {
} }
None => None, None => None,
} }
}) }).unwrap_or(0)
} }
/// Make a request to a peer. /// Make a request to a peer.