From 8b0c37bc8385b8fa4fd37cd7383fa75e1d6c3496 Mon Sep 17 00:00:00 2001 From: Nils Andreas Svee Date: Sun, 5 Jul 2026 12:44:30 +0700 Subject: [PATCH] refactor: simplify control flow and error handling in metrics and netlink --- src/metrics.rs | 20 ++++++++---------- src/netlink.rs | 24 ++++++++++------------ src/ratecontroller.rs | 48 ++++++++++++++++++++++--------------------- 3 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/metrics.rs b/src/metrics.rs index 1fcf806..35d8762 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -78,12 +78,13 @@ impl Transport { let full_data = format!("{}\n", data); // take the stream out, write, put it back or set None on failure - if let Some(s) = stream { - if let Err(e) = std::io::Write::write_all(s, full_data.as_bytes()) { - warn!("TCP send failed: {}", e); - *stream = None; - *reconnect_backoff = (*reconnect_backoff * 2).min(MAX_RECONNECT_BACKOFF); - } + let write_error = stream + .as_mut() + .and_then(|s| std::io::Write::write_all(s, full_data.as_bytes()).err()); + if let Some(e) = write_error { + warn!("TCP send failed: {}", e); + *stream = None; + *reconnect_backoff = (*reconnect_backoff * 2).min(MAX_RECONNECT_BACKOFF); } } } @@ -209,11 +210,8 @@ impl Metrics { } // greedily drain without blocking - loop { - match self.metrics_rx.try_recv() { - Ok(metric) => batch.push(metric), - Err(_) => break, - } + while let Ok(metric) = self.metrics_rx.try_recv() { + batch.push(metric); if batch.len() >= batch_size { break; } diff --git a/src/netlink.rs b/src/netlink.rs index d100553..84e3df8 100644 --- a/src/netlink.rs +++ b/src/netlink.rs @@ -85,19 +85,17 @@ impl Netlink { while let Some(reply) = iter.recv() { let (header, attrs) = reply?; - if header.ifindex == ifindex { - if let Ok(kind) = attrs.get_kind() { - if kind - .to_str() - .map_err(|_| NetlinkError::NlQdiscError("Invalid UTF-8".to_string()))? - == "cake" - { - return Ok(Qdisc { - ifindex, - parent: header.parent, - }); - } - } + if header.ifindex == ifindex + && let Ok(kind) = attrs.get_kind() + && kind + .to_str() + .map_err(|_| NetlinkError::NlQdiscError("Invalid UTF-8".to_string()))? + == "cake" + { + return Ok(Qdisc { + ifindex, + parent: header.parent, + }); } } diff --git a/src/ratecontroller.rs b/src/ratecontroller.rs index fbd5385..824afba 100644 --- a/src/ratecontroller.rs +++ b/src/ratecontroller.rs @@ -446,8 +446,8 @@ impl Ratecontroller { delta_delay_up: self.state_ul.delta_stat, }); - if let Some(ref mut fd) = stats_fd { - if let Err(e) = fd.write_all( + let stats_write_error = stats_fd.as_mut().and_then(|fd| { + fd.write_all( format!( "{},{},{},{},{},{},{},{}\n", stats_time.secs(), @@ -460,34 +460,36 @@ impl Ratecontroller { self.state_ul.current_rate as u64 ) .as_bytes(), - ) { - warn!("Failed to write statistics: {}", e); - } + ) + .err() + }); + if let Some(e) = stats_write_error { + warn!("Failed to write statistics: {}", e); } lastchg_t = now_t; } - if let Some(ref mut fd) = speed_hist_fd { - if now_t.duration_since(lastdump_t).as_secs_f64() > 300.0 { - for i in 0..self.config.speed_hist_size as usize { - let hist_time = Time::new(ClockId::Realtime); - if let Err(e) = fd.write_all( - format!( - "{},{},{},{}\n", - hist_time.as_secs_f64(), - i, - self.state_ul.safe_rates[i], - self.state_dl.safe_rates[i] - ) - .as_bytes(), - ) { - warn!("Failed to write speed history file: {}", e); - } + if let Some(ref mut fd) = speed_hist_fd + && now_t.duration_since(lastdump_t).as_secs_f64() > 300.0 + { + for i in 0..self.config.speed_hist_size as usize { + let hist_time = Time::new(ClockId::Realtime); + if let Err(e) = fd.write_all( + format!( + "{},{},{},{}\n", + hist_time.as_secs_f64(), + i, + self.state_ul.safe_rates[i], + self.state_dl.safe_rates[i] + ) + .as_bytes(), + ) { + warn!("Failed to write speed history file: {}", e); } - - lastdump_t = now_t; } + + lastdump_t = now_t; } } }