fix(irtt): retry terminal targets without restarting healthy sessions
Build binaries / Build (arm-musleabi) (push) Failing after 24m1s
Build binaries / Build (aarch64-musl) (push) Failing after 24m1s
Build binaries / Build (armv7-musleabi) (push) Failing after 11m33s
Build binaries / Build (arm-musleabihf) (push) Failing after 30m39s
Build binaries / Build (i686-musl) (push) Successful in 2m7s
Build binaries / Build (armv7-musleabihf) (push) Successful in 2m9s
Build binaries / Build (mips-musl) (push) Successful in 2m7s
Build binaries / Build (mips64-muslabi64) (push) Successful in 2m11s
Build binaries / Build (mips64el-muslabi64) (push) Successful in 2m11s
Build binaries / Build (mipsel-musl) (push) Successful in 2m15s
Build binaries / Build (riscv64gc-musl) (push) Successful in 1m42s
Build binaries / Build (x86_64-musl) (push) Successful in 2m0s
Build binaries / Build (arm-musleabi) (push) Failing after 24m1s
Build binaries / Build (aarch64-musl) (push) Failing after 24m1s
Build binaries / Build (armv7-musleabi) (push) Failing after 11m33s
Build binaries / Build (arm-musleabihf) (push) Failing after 30m39s
Build binaries / Build (i686-musl) (push) Successful in 2m7s
Build binaries / Build (armv7-musleabihf) (push) Successful in 2m9s
Build binaries / Build (mips-musl) (push) Successful in 2m7s
Build binaries / Build (mips64-muslabi64) (push) Successful in 2m11s
Build binaries / Build (mips64el-muslabi64) (push) Successful in 2m11s
Build binaries / Build (mipsel-musl) (push) Successful in 2m15s
Build binaries / Build (riscv64gc-musl) (push) Successful in 1m42s
Build binaries / Build (x86_64-musl) (push) Successful in 2m0s
This commit is contained in:
1 file changed
+22
-3
+22
-3
@@ -7,7 +7,7 @@ use irtt_client::{
|
||||
ManagedClient, ManagedClientConfig, ManagedClientHandle, ManagedClientTask,
|
||||
ManagedCommandApplyError, ManagedCommandError, ManagedCompletionPolicy, ManagedConfigError,
|
||||
ManagedEndReason, ManagedEvent, ManagedLifecycle, ManagedSubscribeError,
|
||||
ManagedTargetConfig, ManagedTargetEndReason, TargetAuth, TargetId,
|
||||
ManagedTargetConfig, ManagedTargetEndReason, ManagedTargetLifecycle, TargetAuth, TargetId,
|
||||
},
|
||||
};
|
||||
use log::{debug, trace, warn};
|
||||
@@ -81,6 +81,7 @@ pub struct IrttEngine {
|
||||
client: ManagedClientHandle,
|
||||
|
||||
bindings: HashMap<MeasurementStreamId, IrttBinding>,
|
||||
targets: Vec<ManagedTargetConfig>,
|
||||
|
||||
origin: Instant,
|
||||
|
||||
@@ -104,6 +105,7 @@ impl IrttEngine {
|
||||
Self {
|
||||
client: handle,
|
||||
bindings: HashMap::new(),
|
||||
targets: Vec::new(),
|
||||
origin,
|
||||
binding_rx,
|
||||
observation_tx,
|
||||
@@ -126,9 +128,10 @@ impl IrttEngine {
|
||||
}
|
||||
target
|
||||
})
|
||||
.collect();
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
self.client.update_targets(targets)?.await?;
|
||||
self.client.update_targets(targets.clone())?.await?;
|
||||
self.targets = targets;
|
||||
|
||||
self.bindings = bindings
|
||||
.into_iter()
|
||||
@@ -166,6 +169,11 @@ impl IrttEngine {
|
||||
|
||||
async fn run_events(&mut self) -> Result<(), IrttError> {
|
||||
let mut events = self.client.subscribe()?;
|
||||
// Durable status catches failures even if their presentation events were lost.
|
||||
// Resubmitting the full desired set restarts terminal targets only.
|
||||
let mut retry = tokio::time::interval(std::time::Duration::from_secs(5));
|
||||
retry.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Delay);
|
||||
retry.tick().await;
|
||||
loop {
|
||||
tokio::select! {
|
||||
bindings = self.binding_rx.recv_async() => {
|
||||
@@ -175,6 +183,17 @@ impl IrttEngine {
|
||||
self.set_bindings(bindings).await?;
|
||||
}
|
||||
|
||||
_ = retry.tick() => {
|
||||
if SHUTDOWN.load(std::sync::atomic::Ordering::Relaxed) {
|
||||
return Ok(());
|
||||
}
|
||||
if self.client.status().targets.iter().any(|target| {
|
||||
target.desired && target.lifecycle == ManagedTargetLifecycle::Terminal
|
||||
}) {
|
||||
self.client.update_targets(self.targets.clone())?.await?;
|
||||
}
|
||||
}
|
||||
|
||||
event = events.recv() => {
|
||||
let event = match event {
|
||||
Ok(event) => event,
|
||||
|
||||
Reference in new issue
Block a user