improved timeout detection
This commit is contained in:
parent
d1daf3be00
commit
a64fa75170
@ -19,31 +19,39 @@ pub(crate) fn gen_events(
|
|||||||
.map(|p| (*p, (prev.get(*p), state.get(*p))))
|
.map(|p| (*p, (prev.get(*p), state.get(*p))))
|
||||||
.collect::<HashMap<&ECCKey, (Option<&Peer>, Option<&Peer>)>>()
|
.collect::<HashMap<&ECCKey, (Option<&Peer>, Option<&Peer>)>>()
|
||||||
};
|
};
|
||||||
|
let d_zero = Duration::from_secs(0);
|
||||||
|
let h_ms = Duration::from_millis(100);
|
||||||
for (_id, (prev, cur)) in side_by_side {
|
for (_id, (prev, cur)) in side_by_side {
|
||||||
match (prev, cur) {
|
match (prev, cur) {
|
||||||
(Some(prev), Some(cur)) => {
|
(Some(prev), Some(cur)) => {
|
||||||
let timedout = |peer: &Peer| {
|
|
||||||
peer.last_handshake
|
|
||||||
.map(|shake| {
|
|
||||||
shake.elapsed().unwrap() > timeout
|
|
||||||
|| shake.elapsed().unwrap() + poll_interval < timeout
|
|
||||||
})
|
|
||||||
.unwrap_or(true)
|
|
||||||
};
|
|
||||||
|
|
||||||
if let (Some(prev_addr), Some(cur_addr)) = (prev.endpoint, cur.endpoint) {
|
if let (Some(prev_addr), Some(cur_addr)) = (prev.endpoint, cur.endpoint) {
|
||||||
if prev_addr != cur_addr {
|
if prev_addr != cur_addr {
|
||||||
listeners.roaming(&cur, prev_addr);
|
listeners.roaming(&cur, prev_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !timedout(&prev) && timedout(&cur) {
|
let timedout_now = || {
|
||||||
listeners.disconnected(&cur);
|
if let Some(shake) = cur.last_handshake {
|
||||||
continue;
|
if let Ok(el) = shake.elapsed() {
|
||||||
}
|
return el > timeout && el + poll_interval < timeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
};
|
||||||
|
|
||||||
if timedout(&prev) && !timedout(&cur) {
|
let timedout_prev = || {
|
||||||
listeners.connected(&cur);
|
if let Some(shake) = prev.last_handshake {
|
||||||
|
if let Ok(el) = shake.elapsed().map(|el| el - poll_interval) {
|
||||||
|
return el > timeout && el < timeout + poll_interval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
};
|
||||||
|
|
||||||
|
match (timedout_prev(), timedout_now()) {
|
||||||
|
(false, true) => listeners.disconnected(&cur),
|
||||||
|
(true, false) => listeners.connected(&cur),
|
||||||
|
other => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(None, Some(cur)) => listeners.added(&cur),
|
(None, Some(cur)) => listeners.added(&cur),
|
||||||
@ -56,6 +64,7 @@ pub(crate) fn gen_events(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -88,31 +97,31 @@ mod test {
|
|||||||
fn added<'a>(&self, peer: &'a Peer) {
|
fn added<'a>(&self, peer: &'a Peer) {
|
||||||
self.calls
|
self.calls
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.push(format!("add {}", peer.public_key));
|
.push(format!("add {}", peer.key));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn connected<'a>(&self, peer: &'a Peer) {
|
fn connected<'a>(&self, peer: &'a Peer) {
|
||||||
self.calls
|
self.calls
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.push(format!("con {}", peer.public_key));
|
.push(format!("con {}", peer.key));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn disconnected<'a>(&self, peer: &'a Peer) {
|
fn disconnected<'a>(&self, peer: &'a Peer) {
|
||||||
self.calls
|
self.calls
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.push(format!("dis {}", peer.public_key));
|
.push(format!("dis {}", peer.key));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn removed<'a>(&self, peer: &'a Peer) {
|
fn removed<'a>(&self, peer: &'a Peer) {
|
||||||
self.calls
|
self.calls
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.push(format!("rem {}", peer.public_key));
|
.push(format!("rem {}", peer.key));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn roaming<'a>(&self, peer: &'a Peer, _previous_addr: SocketAddr) {
|
fn roaming<'a>(&self, peer: &'a Peer, _previous_addr: SocketAddr) {
|
||||||
self.calls
|
self.calls
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.push(format!("rom {}", peer.public_key));
|
.push(format!("rom {}", peer.key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,7 +137,7 @@ mod test {
|
|||||||
let peer = peer();
|
let peer = peer();
|
||||||
listeners.connected(&peer);
|
listeners.connected(&peer);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
vec![["con", &peer.public_key].join(" ")],
|
vec![["con", &peer.key].join(" ")],
|
||||||
calls.borrow().clone()
|
calls.borrow().clone()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -141,121 +150,121 @@ mod test {
|
|||||||
let bkey = "HhRgEL2xsnEIqThSTUKLGaTXusorM1MFdjSSYvzBynY=";
|
let bkey = "HhRgEL2xsnEIqThSTUKLGaTXusorM1MFdjSSYvzBynY=";
|
||||||
let key = b2h(bkey);
|
let key = b2h(bkey);
|
||||||
Peer::from_kv(&vec![
|
Peer::from_kv(&vec![
|
||||||
("public_key".to_string(), key.clone()),
|
("key".to_string(), key.clone()),
|
||||||
/*(
|
/*(
|
||||||
"last_handshake_time_nsec".to_string(),
|
"last_handshake_time_nsec".to_string(),
|
||||||
(1000 * 1000 * 1).to_string(),
|
(1000 * 1000 * 1).to_string(),
|
||||||
),*/
|
),*/
|
||||||
("endpoint".to_string(), "1.1.1.1:22222".to_string()),
|
("endpoint".to_string(), "1.1.1.1:22222".to_string()),
|
||||||
])
|
])
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn connected() {
|
|
||||||
let peer = peer();
|
|
||||||
let mut peer_cur = peer.clone();
|
|
||||||
let mut prev: HashMap<String, Peer> = HashMap::new();
|
|
||||||
let mut cur: HashMap<String, Peer> = HashMap::new();
|
|
||||||
cur.insert(peer_cur.public_key.clone(), peer_cur.clone());
|
|
||||||
let (listener, calls) = listeners();
|
|
||||||
let interval = time::Duration::from_secs(3);
|
|
||||||
gen_events(
|
|
||||||
&cur,
|
|
||||||
&prev,
|
|
||||||
&listener,
|
|
||||||
time::Duration::from_secs(3),
|
|
||||||
interval,
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
vec![["add", &peer_cur.public_key].join(" ")],
|
|
||||||
calls.borrow().clone()
|
|
||||||
);
|
|
||||||
|
|
||||||
gen_events(
|
|
||||||
&cur,
|
|
||||||
&cur,
|
|
||||||
&listener,
|
|
||||||
time::Duration::from_secs(3),
|
|
||||||
interval,
|
|
||||||
);
|
|
||||||
|
|
||||||
//Shouldn't gen any new events
|
|
||||||
assert!(calls.borrow().len() == 1);
|
|
||||||
|
|
||||||
let (listener, calls) = listeners();
|
|
||||||
gen_events(
|
|
||||||
&prev,
|
|
||||||
&cur,
|
|
||||||
&listener,
|
|
||||||
time::Duration::from_secs(10),
|
|
||||||
interval,
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
vec![["rem", &peer.public_key].join(" ")],
|
|
||||||
calls.borrow().clone()
|
|
||||||
);
|
|
||||||
|
|
||||||
calls.borrow_mut().clear();
|
|
||||||
|
|
||||||
let mut peer_prev = peer.clone();
|
|
||||||
|
|
||||||
peer_prev.endpoint = Some("2.2.2.2:33333".parse::<SocketAddr>().unwrap());
|
|
||||||
|
|
||||||
peer_prev.last_handshake = Some(time::Duration::from_secs(1000));
|
|
||||||
|
|
||||||
prev.insert(peer_prev.public_key.clone(), peer_prev.clone());
|
|
||||||
|
|
||||||
gen_events(
|
|
||||||
&prev,
|
|
||||||
&cur,
|
|
||||||
&listener,
|
|
||||||
time::Duration::from_secs(10),
|
|
||||||
interval,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(calls
|
|
||||||
.borrow()
|
|
||||||
.clone()
|
|
||||||
.contains(&["rom", &peer.public_key].join(" ")));
|
|
||||||
|
|
||||||
calls.borrow_mut().clear();
|
|
||||||
|
|
||||||
let peer_prev = peer.clone();
|
|
||||||
|
|
||||||
peer_cur.last_handshake = Some(time::Duration::from_secs(5));
|
|
||||||
|
|
||||||
cur.insert(peer_cur.public_key.clone(), peer_cur.clone());
|
|
||||||
prev.insert(peer_prev.public_key.clone(), peer_prev.clone());
|
|
||||||
|
|
||||||
gen_events(
|
|
||||||
&cur,
|
|
||||||
&prev,
|
|
||||||
&listener,
|
|
||||||
time::Duration::from_secs(10),
|
|
||||||
interval,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
vec![["con", &peer.public_key].join(" ")],
|
|
||||||
calls.borrow().clone()
|
|
||||||
);
|
|
||||||
|
|
||||||
calls.borrow_mut().clear();
|
|
||||||
|
|
||||||
//Other way around should be a disconnect
|
|
||||||
gen_events(
|
|
||||||
&prev,
|
|
||||||
&cur,
|
|
||||||
&listener,
|
|
||||||
time::Duration::from_secs(3),
|
|
||||||
interval,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
vec![["dis", &peer.public_key].join(" ")],
|
|
||||||
calls.borrow().clone()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn connected() {
|
||||||
|
let peer = peer();
|
||||||
|
let mut peer_cur = peer.clone();
|
||||||
|
let mut prev: HashMap<String, Peer> = HashMap::new();
|
||||||
|
let mut cur: HashMap<String, Peer> = HashMap::new();
|
||||||
|
cur.insert(peer_cur.key.clone(), peer_cur.clone());
|
||||||
|
let (listener, calls) = listeners();
|
||||||
|
let interval = time::Duration::from_secs(3);
|
||||||
|
gen_events(
|
||||||
|
&cur,
|
||||||
|
&prev,
|
||||||
|
&listener,
|
||||||
|
time::Duration::from_secs(3),
|
||||||
|
interval,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
vec![["add", &peer_cur.key].join(" ")],
|
||||||
|
calls.borrow().clone()
|
||||||
|
);
|
||||||
|
|
||||||
|
gen_events(
|
||||||
|
&cur,
|
||||||
|
&cur,
|
||||||
|
&listener,
|
||||||
|
time::Duration::from_secs(3),
|
||||||
|
interval,
|
||||||
|
);
|
||||||
|
|
||||||
|
//Shouldn't gen any new events
|
||||||
|
assert!(calls.borrow().len() == 1);
|
||||||
|
|
||||||
|
let (listener, calls) = listeners();
|
||||||
|
gen_events(
|
||||||
|
&prev,
|
||||||
|
&cur,
|
||||||
|
&listener,
|
||||||
|
time::Duration::from_secs(10),
|
||||||
|
interval,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
vec![["rem", &peer.key].join(" ")],
|
||||||
|
calls.borrow().clone()
|
||||||
|
);
|
||||||
|
|
||||||
|
calls.borrow_mut().clear();
|
||||||
|
|
||||||
|
let mut peer_prev = peer.clone();
|
||||||
|
|
||||||
|
peer_prev.endpoint = Some("2.2.2.2:33333".parse::<SocketAddr>().unwrap());
|
||||||
|
|
||||||
|
peer_prev.last_handshake = Some(time::Duration::from_secs(1000));
|
||||||
|
|
||||||
|
prev.insert(peer_prev.key.clone(), peer_prev.clone());
|
||||||
|
|
||||||
|
gen_events(
|
||||||
|
&prev,
|
||||||
|
&cur,
|
||||||
|
&listener,
|
||||||
|
time::Duration::from_secs(10),
|
||||||
|
interval,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert!(calls
|
||||||
|
.borrow()
|
||||||
|
.clone()
|
||||||
|
.contains(&["rom", &peer.key].join(" ")));
|
||||||
|
|
||||||
|
calls.borrow_mut().clear();
|
||||||
|
|
||||||
|
let peer_prev = peer.clone();
|
||||||
|
|
||||||
|
peer_cur.last_handshake = Some(time::Duration::from_secs(5));
|
||||||
|
|
||||||
|
cur.insert(peer_cur.key.clone(), peer_cur.clone());
|
||||||
|
prev.insert(peer_prev.key.clone(), peer_prev.clone());
|
||||||
|
|
||||||
|
gen_events(
|
||||||
|
&cur,
|
||||||
|
&prev,
|
||||||
|
&listener,
|
||||||
|
time::Duration::from_secs(10),
|
||||||
|
interval,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
vec![["con", &peer.key].join(" ")],
|
||||||
|
calls.borrow().clone()
|
||||||
|
);
|
||||||
|
|
||||||
|
calls.borrow_mut().clear();
|
||||||
|
|
||||||
|
//Other way around should be a disconnect
|
||||||
|
gen_events(
|
||||||
|
&prev,
|
||||||
|
&cur,
|
||||||
|
&listener,
|
||||||
|
time::Duration::from_secs(3),
|
||||||
|
interval,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
vec![["dis", &peer.key].join(" ")],
|
||||||
|
calls.borrow().clone()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user