SystemTime::now not work stable on my win7 32, change to Instant
This commit is contained in:
parent
f8fe47d53f
commit
5d143f57d7
@ -21,7 +21,7 @@ use std::{
|
|||||||
atomic::{AtomicBool, Ordering},
|
atomic::{AtomicBool, Ordering},
|
||||||
Arc, Mutex,
|
Arc, Mutex,
|
||||||
},
|
},
|
||||||
time::{Instant, SystemTime},
|
time::Instant,
|
||||||
};
|
};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
@ -113,24 +113,23 @@ impl RendezvousMediator {
|
|||||||
|
|
||||||
const TIMER_OUT: Duration = Duration::from_secs(1);
|
const TIMER_OUT: Duration = Duration::from_secs(1);
|
||||||
let mut timer = interval(TIMER_OUT);
|
let mut timer = interval(TIMER_OUT);
|
||||||
let mut last_timer = SystemTime::UNIX_EPOCH;
|
let mut last_timer: Option<Instant> = None;
|
||||||
const REG_TIMEOUT: i64 = 3_000;
|
const REG_TIMEOUT: i64 = 3_000;
|
||||||
const MAX_FAILS1: i64 = 3;
|
const MAX_FAILS1: i64 = 3;
|
||||||
const MAX_FAILS2: i64 = 6;
|
const MAX_FAILS2: i64 = 6;
|
||||||
const DNS_INTERVAL: i64 = 60_000;
|
const DNS_INTERVAL: i64 = 60_000;
|
||||||
let mut fails = 0;
|
let mut fails = 0;
|
||||||
let mut last_register_resp = SystemTime::UNIX_EPOCH;
|
let mut last_register_resp: Option<Instant> = None;
|
||||||
let mut last_register_sent = SystemTime::UNIX_EPOCH;
|
let mut last_register_sent: Option<Instant> = None;
|
||||||
let mut last_dns_check = SystemTime::UNIX_EPOCH;
|
let mut last_dns_check = Instant::now();
|
||||||
let mut old_latency = 0;
|
let mut old_latency = 0;
|
||||||
let mut ema_latency = 0;
|
let mut ema_latency = 0;
|
||||||
loop {
|
loop {
|
||||||
let mut update_latency = || {
|
let mut update_latency = || {
|
||||||
last_register_resp = SystemTime::now();
|
last_register_resp = Some(Instant::now());
|
||||||
fails = 0;
|
fails = 0;
|
||||||
let mut latency = last_register_resp
|
let mut latency = last_register_sent
|
||||||
.duration_since(last_register_sent)
|
.map(|x| x.elapsed().as_micros() as i64)
|
||||||
.map(|d| d.as_micros() as i64)
|
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
if latency < 0 || latency > 1_000_000 {
|
if latency < 0 || latency > 1_000_000 {
|
||||||
return;
|
return;
|
||||||
@ -224,14 +223,14 @@ impl RendezvousMediator {
|
|||||||
if SHOULD_EXIT.load(Ordering::SeqCst) {
|
if SHOULD_EXIT.load(Ordering::SeqCst) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
let now = SystemTime::now();
|
let now = Some(Instant::now());
|
||||||
if now.duration_since(last_timer).map(|d| d < TIMER_OUT).unwrap_or(false) {
|
if last_timer.map(|x| x.elapsed() < TIMER_OUT).unwrap_or(false) {
|
||||||
// a workaround of tokio timer bug
|
// a workaround of tokio timer bug
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
last_timer = now;
|
last_timer = now;
|
||||||
let elapsed_resp = now.duration_since(last_register_resp).map(|d| d.as_millis() as i64).unwrap_or(REG_INTERVAL);
|
let elapsed_resp = last_register_resp.map(|x| x.elapsed().as_millis() as i64).unwrap_or(REG_INTERVAL);
|
||||||
let timeout = last_register_sent.duration_since(last_register_resp).map(|d| d.as_millis() as i64).unwrap_or(0) >= REG_TIMEOUT;
|
let timeout = (last_register_sent.map(|x| x.elapsed().as_millis() as i64).unwrap_or(REG_INTERVAL) - elapsed_resp) > REG_TIMEOUT;
|
||||||
if timeout || elapsed_resp >= REG_INTERVAL {
|
if timeout || elapsed_resp >= REG_INTERVAL {
|
||||||
allow_err!(rz.register_peer(&mut socket).await);
|
allow_err!(rz.register_peer(&mut socket).await);
|
||||||
last_register_sent = now;
|
last_register_sent = now;
|
||||||
@ -240,14 +239,14 @@ impl RendezvousMediator {
|
|||||||
if fails > MAX_FAILS2 {
|
if fails > MAX_FAILS2 {
|
||||||
Config::update_latency(&host, -1);
|
Config::update_latency(&host, -1);
|
||||||
old_latency = 0;
|
old_latency = 0;
|
||||||
if now.duration_since(last_dns_check).map(|d| d.as_millis() as i64).unwrap_or(0) > DNS_INTERVAL {
|
if last_dns_check.elapsed().as_millis() as i64 > DNS_INTERVAL {
|
||||||
rz.addr = socket_client::get_target_addr(&crate::check_port(&host, RENDEZVOUS_PORT))?;
|
rz.addr = socket_client::get_target_addr(&crate::check_port(&host, RENDEZVOUS_PORT))?;
|
||||||
// in some case of network reconnect (dial IP network),
|
// in some case of network reconnect (dial IP network),
|
||||||
// old UDP socket not work any more after network recover
|
// old UDP socket not work any more after network recover
|
||||||
if let Some(s) = socket_client::rebind_udp(any_addr).await? {
|
if let Some(s) = socket_client::rebind_udp(any_addr).await? {
|
||||||
socket = s;
|
socket = s;
|
||||||
}
|
}
|
||||||
last_dns_check = now;
|
last_dns_check = Instant::now();
|
||||||
}
|
}
|
||||||
} else if fails > MAX_FAILS1 {
|
} else if fails > MAX_FAILS1 {
|
||||||
Config::update_latency(&host, 0);
|
Config::update_latency(&host, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user