Commit 1493ed25 authored by nanamicat's avatar nanamicat

time

parent 2f63dc93
Pipeline #42444 passed with stages
in 45 seconds
...@@ -3,7 +3,7 @@ use crate::data::Router as RouterData; ...@@ -3,7 +3,7 @@ use crate::data::Router as RouterData;
use crate::protocol::{Hello, MessageType, Uplink}; use crate::protocol::{Hello, MessageType, Uplink};
use crate::router::Router; use crate::router::Router;
use crate::server::Server; use crate::server::Server;
use crate::settings::{Settings, INTERVAL, LEARN}; use crate::settings::{Settings, INTERVAL, WINDOW};
use config::Config; use config::Config;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::fs; use std::fs;
...@@ -85,10 +85,10 @@ async fn main() -> anyhow::Result<()> { ...@@ -85,10 +85,10 @@ async fn main() -> anyhow::Result<()> {
id: config.id, id: config.id,
action: if server.online {MessageType::Update} else {MessageType::Query}, action: if server.online {MessageType::Update} else {MessageType::Query},
version: server.version, version: server.version,
peers: if now.duration_since(start) < LEARN { Default::default() } else { connections peers: if now.duration_since(start) < INTERVAL * WINDOW { Default::default() } else { connections
.iter() .iter()
.filter(|(_, to)| to.contains_key(&config.id)) .filter(|(_, to)| to.contains_key(&config.id))
.map(|(from,_)|routers.get_mut(from).unwrap().update(now, start)) .map(|(from,_)|routers.get_mut(from).unwrap().update(now))
.collect()}, .collect()},
via: Default::default(), via: Default::default(),
plan: Default::default() plan: Default::default()
......
use crate::data::Router as RouterData; use crate::data::Router as RouterData;
use crate::protocol::{Hello, PeerQuality}; use crate::protocol::{Hello, PeerQuality};
use crate::settings::{Settings, INTERVAL}; use crate::settings::{Settings, INTERVAL, WINDOW};
use saturating_cast::SaturatingCast; use saturating_cast::SaturatingCast;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::net::{IpAddr, Ipv4Addr, SocketAddr};
...@@ -44,13 +44,15 @@ impl Router { ...@@ -44,13 +44,15 @@ impl Router {
pub fn on_message(&mut self, data: &Hello) { pub fn on_message(&mut self, data: &Hello) {
let delta = (data.time.wrapping_sub(self.remote_time) as i32 as f32 / INTERVAL.as_millis() as f32).round() as i32; let delta = (data.time.wrapping_sub(self.remote_time) as i32 as f32 / INTERVAL.as_millis() as f32).round() as i32;
const WINDOW_MAX: i32 = WINDOW as i32;
const WINDOW_MIN: i32 = 1 - WINDOW_MAX;
match delta { match delta {
-63..=-1 => { WINDOW_MIN..0 => {
self.receive |= 1 << (-delta); self.receive |= 1 << (-delta);
return; return;
} }
0 => return, 0 => return,
1..=63 => { 1..WINDOW_MAX => {
self.receive = (self.receive << delta) | 1; self.receive = (self.receive << delta) | 1;
self.remote_time = data.time; self.remote_time = data.time;
self.local_time = Instant::now(); self.local_time = Instant::now();
...@@ -71,21 +73,18 @@ impl Router { ...@@ -71,21 +73,18 @@ impl Router {
self.prev_delay = delay; self.prev_delay = delay;
} }
pub(crate) fn update(&mut self, now: Instant, start: Instant) -> PeerQuality { pub(crate) fn update(&mut self, now: Instant) -> PeerQuality {
let reliability = self.receive.count_ones() as u8; let reliability = self.receive.count_ones() as u8;
if reliability > 0 { if reliability > 0 {
let max = now.duration_since(start).div_duration_f32(INTERVAL) as u32; let duration = now.duration_since(self.local_time).div_duration_f32(INTERVAL) as u8;
let reliability = if max < 64 { (reliability as u32 * 64 / max) as u8 } else { reliability }; if duration > WINDOW as u8 {
let duration = now.duration_since(self.local_time).div_duration_f32(INTERVAL) as u32;
if duration > 64 {
self.receive = 0; self.receive = 0;
Default::default() Default::default()
} else { } else {
PeerQuality { PeerQuality {
delay: self.delay.saturating_cast(), delay: self.delay.saturating_cast(),
jitter: self.jitter.saturating_cast(), jitter: self.jitter.saturating_cast(),
reliability: reliability.saturating_sub((duration as u8).saturating_sub(1)), reliability: reliability.saturating_sub((duration).saturating_sub(1)),
} }
} }
} else { } else {
......
...@@ -43,7 +43,6 @@ impl Endpoint { ...@@ -43,7 +43,6 @@ impl Endpoint {
Ok(SocketAddr::new(ip, self.port)) Ok(SocketAddr::new(ip, self.port))
} }
} }
pub const WINDOW: u32 = 64;
pub const INTERVAL: Duration = Duration::from_secs(1); pub const INTERVAL: Duration = Duration::from_secs(1);
pub const LEARN: Duration = Duration::from_secs(10);
pub const ROUTE_PROTOCOL: RouteProtocol = RouteProtocol::Other(252); pub const ROUTE_PROTOCOL: RouteProtocol = RouteProtocol::Other(252);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment