test for request_set and remove idle flag
This commit is contained in:
parent
04282be721
commit
f63faea308
@ -140,7 +140,6 @@ struct Peer {
|
|||||||
sent_head: H256, // last chain head we've given them.
|
sent_head: H256, // last chain head we've given them.
|
||||||
last_update: SteadyTime,
|
last_update: SteadyTime,
|
||||||
pending_requests: RequestSet,
|
pending_requests: RequestSet,
|
||||||
idle: bool, // make into a current percentage of max buffer being requested?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Peer {
|
impl Peer {
|
||||||
@ -261,17 +260,11 @@ impl LightProtocol {
|
|||||||
fn max_requests(&self, peer: PeerId, kind: request::Kind) -> usize {
|
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();
|
||||||
let idle = peer.idle;
|
|
||||||
match peer.remote_flow {
|
match peer.remote_flow {
|
||||||
Some((ref mut buf, ref flow)) => {
|
Some((ref mut buf, ref flow)) => {
|
||||||
flow.recharge(buf);
|
flow.recharge(buf);
|
||||||
|
|
||||||
if !idle {
|
|
||||||
Some(0)
|
|
||||||
} else {
|
|
||||||
Some(flow.max_amount(&*buf, kind))
|
Some(flow.max_amount(&*buf, kind))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
None => None,
|
None => None,
|
||||||
}
|
}
|
||||||
}).unwrap_or(0)
|
}).unwrap_or(0)
|
||||||
@ -288,8 +281,6 @@ impl LightProtocol {
|
|||||||
let peer = peers.get(peer_id).ok_or_else(|| Error::UnknownPeer)?;
|
let peer = peers.get(peer_id).ok_or_else(|| Error::UnknownPeer)?;
|
||||||
let mut peer = peer.lock();
|
let mut peer = peer.lock();
|
||||||
|
|
||||||
if !peer.idle { return Err(Error::Overburdened) }
|
|
||||||
|
|
||||||
match peer.remote_flow {
|
match peer.remote_flow {
|
||||||
Some((ref mut buf, ref flow)) => {
|
Some((ref mut buf, ref flow)) => {
|
||||||
flow.recharge(buf);
|
flow.recharge(buf);
|
||||||
@ -315,7 +306,6 @@ impl LightProtocol {
|
|||||||
|
|
||||||
io.send(*peer_id, packet_id, packet_data);
|
io.send(*peer_id, packet_id, packet_data);
|
||||||
|
|
||||||
peer.idle = false;
|
|
||||||
peer.pending_requests.insert(ReqId(req_id), request, SteadyTime::now());
|
peer.pending_requests.insert(ReqId(req_id), request, SteadyTime::now());
|
||||||
|
|
||||||
Ok(ReqId(req_id))
|
Ok(ReqId(req_id))
|
||||||
@ -404,7 +394,6 @@ impl LightProtocol {
|
|||||||
match peers.get(peer) {
|
match peers.get(peer) {
|
||||||
Some(peer_info) => {
|
Some(peer_info) => {
|
||||||
let mut peer_info = peer_info.lock();
|
let mut peer_info = peer_info.lock();
|
||||||
peer_info.idle = true;
|
|
||||||
|
|
||||||
match peer_info.pending_requests.remove(&req_id, SteadyTime::now()) {
|
match peer_info.pending_requests.remove(&req_id, SteadyTime::now()) {
|
||||||
None => return Err(Error::UnsolicitedResponse),
|
None => return Err(Error::UnsolicitedResponse),
|
||||||
@ -596,7 +585,6 @@ impl LightProtocol {
|
|||||||
sent_head: pending.sent_head,
|
sent_head: pending.sent_head,
|
||||||
last_update: pending.last_update,
|
last_update: pending.last_update,
|
||||||
pending_requests: RequestSet::default(),
|
pending_requests: RequestSet::default(),
|
||||||
idle: true,
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
for handler in &self.handlers {
|
for handler in &self.handlers {
|
||||||
|
@ -111,3 +111,30 @@ impl RequestSet {
|
|||||||
self.ids.keys().cloned().collect()
|
self.ids.keys().cloned().collect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use net::{timeout, ReqId};
|
||||||
|
use request::{Request, Receipts};
|
||||||
|
use time::{SteadyTime, Duration};
|
||||||
|
use super::RequestSet;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn multi_timeout() {
|
||||||
|
let test_begin = SteadyTime::now();
|
||||||
|
let mut req_set = RequestSet::default();
|
||||||
|
|
||||||
|
let the_req = Request::Receipts(Receipts { block_hashes: Vec::new() });
|
||||||
|
req_set.insert(ReqId(0), the_req.clone(), test_begin);
|
||||||
|
req_set.insert(ReqId(1), the_req, test_begin + Duration::seconds(1));
|
||||||
|
|
||||||
|
assert_eq!(req_set.base, Some(test_begin));
|
||||||
|
|
||||||
|
let test_end = test_begin + Duration::milliseconds(timeout::RECEIPTS);
|
||||||
|
assert!(req_set.check_timeout(test_end));
|
||||||
|
|
||||||
|
req_set.remove(&ReqId(0), test_begin + Duration::seconds(1)).unwrap();
|
||||||
|
assert!(!req_set.check_timeout(test_end));
|
||||||
|
assert!(req_set.check_timeout(test_end + Duration::seconds(1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user