Merge pull request #10 from razvandimescu/fix/fast-network-detect

Reduce network change detection to 5s
This commit is contained in:
Razvan Dimescu
2026-03-22 21:47:25 +02:00
committed by GitHub
2 changed files with 9 additions and 6 deletions

2
Cargo.lock generated
View File

@@ -932,7 +932,7 @@ dependencies = [
[[package]] [[package]]
name = "numa" name = "numa"
version = "0.3.0" version = "0.3.1"
dependencies = [ dependencies = [
"axum", "axum",
"env_logger", "env_logger",

View File

@@ -279,14 +279,17 @@ async fn main() -> numa::Result<()> {
} }
async fn network_watch_loop(ctx: Arc<numa::ctx::ServerCtx>) { async fn network_watch_loop(ctx: Arc<numa::ctx::ServerCtx>) {
let mut interval = tokio::time::interval(Duration::from_secs(30)); let mut tick: u64 = 0;
let mut interval = tokio::time::interval(Duration::from_secs(5));
interval.tick().await; // skip immediate tick interval.tick().await; // skip immediate tick
loop { loop {
interval.tick().await; interval.tick().await;
tick += 1;
let mut changed = false; let mut changed = false;
// Check LAN IP change // Check LAN IP change (every 5s — cheap, one UDP socket call)
if let Some(new_ip) = numa::lan::detect_lan_ip() { if let Some(new_ip) = numa::lan::detect_lan_ip() {
let mut current_ip = ctx.lan_ip.lock().unwrap(); let mut current_ip = ctx.lan_ip.lock().unwrap();
if new_ip != *current_ip { if new_ip != *current_ip {
@@ -296,10 +299,10 @@ async fn network_watch_loop(ctx: Arc<numa::ctx::ServerCtx>) {
} }
} }
// Check upstream change (only for auto-detected upstream) // Check upstream change every 30s or immediately on LAN IP change
if ctx.upstream_auto { // (heavier — spawns scutil/ipconfig, only when auto-detected)
if ctx.upstream_auto && (changed || tick.is_multiple_of(6)) {
let dns_info = numa::system_dns::discover_system_dns(); let dns_info = numa::system_dns::discover_system_dns();
// Use detected upstream, or try DHCP-provided DNS, or fall back to Quad9
let new_addr = dns_info let new_addr = dns_info
.default_upstream .default_upstream
.or_else(numa::system_dns::detect_dhcp_dns) .or_else(numa::system_dns::detect_dhcp_dns)