refactor: use tokio watch channel for bindings
Build binaries / Build (arm-musleabi) (push) Successful in 1m41s
Build binaries / Build (aarch64-musl) (push) Successful in 1m42s
Build binaries / Build (armv7-musleabi) (push) Successful in 1m42s
Build binaries / Build (arm-musleabihf) (push) Successful in 1m42s
Build binaries / Build (armv7-musleabihf) (push) Successful in 1m41s
Build binaries / Build (i686-musl) (push) Successful in 1m42s
Build binaries / Build (mips-musl) (push) Successful in 1m52s
Build binaries / Build (mips64-muslabi64) (push) Successful in 1m51s
Build binaries / Build (mips64el-muslabi64) (push) Successful in 1m55s
Build binaries / Build (mipsel-musl) (push) Successful in 1m56s
Build binaries / Build (x86_64-musl) (push) Successful in 1m39s
Build binaries / Build (riscv64gc-musl) (push) Successful in 1m39s
Build binaries / Build (arm-musleabi) (push) Successful in 1m41s
Build binaries / Build (aarch64-musl) (push) Successful in 1m42s
Build binaries / Build (armv7-musleabi) (push) Successful in 1m42s
Build binaries / Build (arm-musleabihf) (push) Successful in 1m42s
Build binaries / Build (armv7-musleabihf) (push) Successful in 1m41s
Build binaries / Build (i686-musl) (push) Successful in 1m42s
Build binaries / Build (mips-musl) (push) Successful in 1m52s
Build binaries / Build (mips64-muslabi64) (push) Successful in 1m51s
Build binaries / Build (mips64el-muslabi64) (push) Successful in 1m55s
Build binaries / Build (mipsel-musl) (push) Successful in 1m56s
Build binaries / Build (x86_64-musl) (push) Successful in 1m39s
Build binaries / Build (riscv64gc-musl) (push) Successful in 1m39s
This commit is contained in:
4 files changed
+26
-24
No files matched your search
@@ -5,7 +5,6 @@ use std::{
|
||||
time::{Duration, Instant, SystemTime},
|
||||
};
|
||||
|
||||
use flume::Receiver;
|
||||
use icmp_socket2::{
|
||||
AsyncIcmpSocket, IcmpSocket4, Icmpv4Message, Icmpv4Packet,
|
||||
packet::{IcmpPacketBuildError, WithEchoRequest, WithTimestampRequest},
|
||||
@@ -13,7 +12,7 @@ use icmp_socket2::{
|
||||
};
|
||||
use log::debug;
|
||||
use thiserror::Error;
|
||||
use tokio::sync::mpsc::UnboundedSender;
|
||||
use tokio::sync::{mpsc::UnboundedSender, watch};
|
||||
|
||||
use crate::{
|
||||
measurement::model::{
|
||||
@@ -25,6 +24,7 @@ use crate::{
|
||||
time::{ClockSample, Realtime},
|
||||
};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct IcmpBinding {
|
||||
pub stream: MeasurementStream,
|
||||
pub schedule: ProbeSchedule,
|
||||
@@ -104,7 +104,7 @@ pub struct IcmpEngine {
|
||||
|
||||
origin: Instant,
|
||||
|
||||
binding_rx: Receiver<Vec<IcmpBinding>>,
|
||||
binding_rx: watch::Receiver<Vec<IcmpBinding>>,
|
||||
observation_tx: UnboundedSender<MeasurementEvent>,
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ impl IcmpEngine {
|
||||
origin: Instant,
|
||||
#[allow(unused)] settings: &NetworkSettings,
|
||||
observation_tx: UnboundedSender<MeasurementEvent>,
|
||||
binding_rx: Receiver<Vec<IcmpBinding>>,
|
||||
binding_rx: watch::Receiver<Vec<IcmpBinding>>,
|
||||
) -> Result<Self, IcmpError> {
|
||||
#[allow(unused_mut)]
|
||||
let mut socket = IcmpSocket4::new()?;
|
||||
@@ -446,10 +446,10 @@ impl IcmpEngine {
|
||||
let deadline = self.next_deadline();
|
||||
|
||||
tokio::select! {
|
||||
bindings = self.binding_rx.recv_async() => {
|
||||
let bindings = bindings
|
||||
.map_err(|_| IcmpError::BindingChannelClosed)?;
|
||||
bindings = self.binding_rx.changed() => {
|
||||
bindings.map_err(|_| IcmpError::BindingChannelClosed)?;
|
||||
|
||||
let bindings = self.binding_rx.borrow_and_update().clone();
|
||||
self.set_bindings(bindings)?;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
use std::{collections::HashMap, net::SocketAddr};
|
||||
|
||||
use flume::Receiver;
|
||||
use irtt_client::{
|
||||
ClientConfig, ClientEvent, NegotiationPolicy, OpenPolicy,
|
||||
managed::{
|
||||
@@ -12,7 +11,7 @@ use irtt_client::{
|
||||
};
|
||||
use log::{debug, trace, warn};
|
||||
use thiserror::Error;
|
||||
use tokio::sync::{broadcast::error::RecvError, mpsc::UnboundedSender};
|
||||
use tokio::sync::{broadcast::error::RecvError, mpsc::UnboundedSender, watch};
|
||||
|
||||
use crate::SHUTDOWN;
|
||||
use crate::measurement::model::{
|
||||
@@ -51,6 +50,7 @@ pub enum IrttError {
|
||||
ManagedAbandoned,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct IrttBinding {
|
||||
stream: MeasurementStream,
|
||||
port: u16,
|
||||
@@ -69,7 +69,7 @@ pub struct IrttEngine {
|
||||
bindings: HashMap<MeasurementStreamId, IrttBinding>,
|
||||
targets: Vec<ManagedTargetConfig>,
|
||||
|
||||
binding_rx: Receiver<Vec<IrttBinding>>,
|
||||
binding_rx: watch::Receiver<Vec<IrttBinding>>,
|
||||
observation_tx: UnboundedSender<MeasurementEvent>,
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ impl IrttEngine {
|
||||
interval: std::time::Duration,
|
||||
settings: &NetworkSettings,
|
||||
observation_tx: UnboundedSender<MeasurementEvent>,
|
||||
binding_rx: Receiver<Vec<IrttBinding>>,
|
||||
binding_rx: watch::Receiver<Vec<IrttBinding>>,
|
||||
) -> Result<(ManagedClientTask, Self), IrttError> {
|
||||
let config = managed_client_config(interval, settings);
|
||||
let (task, handle) = ManagedClient::task(config, Vec::new())?;
|
||||
@@ -158,10 +158,10 @@ impl IrttEngine {
|
||||
retry.tick().await;
|
||||
loop {
|
||||
tokio::select! {
|
||||
bindings = self.binding_rx.recv_async() => {
|
||||
let bindings = bindings
|
||||
.map_err(|_| IrttError::BindingChannelClosed)?;
|
||||
bindings = self.binding_rx.changed() => {
|
||||
bindings.map_err(|_| IrttError::BindingChannelClosed)?;
|
||||
|
||||
let bindings = self.binding_rx.borrow_and_update().clone();
|
||||
self.set_bindings(bindings).await?;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user