mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-31 04:23:40 +00:00
feat: wait for db commit after tunnel add/remove
Add a typed DbWatch at the end of add_tunnel and remove_tunnel that waits up to 15s for the sync loop to commit the gateway state change to patch-db before returning.
This commit is contained in:
@@ -1379,6 +1379,21 @@ net.tor.client-error:
|
|||||||
fr_FR: "Erreur du client Tor : %{error}"
|
fr_FR: "Erreur du client Tor : %{error}"
|
||||||
pl_PL: "Błąd klienta Tor: %{error}"
|
pl_PL: "Błąd klienta Tor: %{error}"
|
||||||
|
|
||||||
|
# net/tunnel.rs
|
||||||
|
net.tunnel.timeout-waiting-for-add:
|
||||||
|
en_US: "timed out waiting for gateway %{gateway} to appear in database"
|
||||||
|
de_DE: "Zeitüberschreitung beim Warten auf das Erscheinen von Gateway %{gateway} in der Datenbank"
|
||||||
|
es_ES: "se agotó el tiempo esperando que la puerta de enlace %{gateway} aparezca en la base de datos"
|
||||||
|
fr_FR: "délai d'attente dépassé pour l'apparition de la passerelle %{gateway} dans la base de données"
|
||||||
|
pl_PL: "upłynął limit czasu oczekiwania na pojawienie się bramy %{gateway} w bazie danych"
|
||||||
|
|
||||||
|
net.tunnel.timeout-waiting-for-remove:
|
||||||
|
en_US: "timed out waiting for gateway %{gateway} to be removed from database"
|
||||||
|
de_DE: "Zeitüberschreitung beim Warten auf das Entfernen von Gateway %{gateway} aus der Datenbank"
|
||||||
|
es_ES: "se agotó el tiempo esperando que la puerta de enlace %{gateway} sea eliminada de la base de datos"
|
||||||
|
fr_FR: "délai d'attente dépassé pour la suppression de la passerelle %{gateway} de la base de données"
|
||||||
|
pl_PL: "upłynął limit czasu oczekiwania na usunięcie bramy %{gateway} z bazy danych"
|
||||||
|
|
||||||
# net/wifi.rs
|
# net/wifi.rs
|
||||||
net.wifi.ssid-no-special-characters:
|
net.wifi.ssid-no-special-characters:
|
||||||
en_US: "SSID may not have special characters"
|
en_US: "SSID may not have special characters"
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use imbl_value::InternedString;
|
use imbl_value::InternedString;
|
||||||
use patch_db::json_ptr::JsonPointer;
|
use patch_db::json_ptr::JsonPointer;
|
||||||
@@ -8,7 +10,9 @@ use ts_rs::TS;
|
|||||||
|
|
||||||
use crate::GatewayId;
|
use crate::GatewayId;
|
||||||
use crate::context::{CliContext, RpcContext};
|
use crate::context::{CliContext, RpcContext};
|
||||||
use crate::db::model::public::{GatewayType, NetworkInterfaceInfo, NetworkInterfaceType};
|
use crate::db::model::public::{
|
||||||
|
GatewayType, NetworkInfo, NetworkInterfaceInfo, NetworkInterfaceType,
|
||||||
|
};
|
||||||
use crate::net::host::all_hosts;
|
use crate::net::host::all_hosts;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use crate::util::Invoke;
|
use crate::util::Invoke;
|
||||||
@@ -139,6 +143,34 @@ pub async fn add_tunnel(
|
|||||||
.result?;
|
.result?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wait for the sync loop to fully commit gateway state (addresses, hosts)
|
||||||
|
// to the database, with a 15-second timeout.
|
||||||
|
if tokio::time::timeout(Duration::from_secs(15), async {
|
||||||
|
let mut watch = ctx
|
||||||
|
.db
|
||||||
|
.watch("/public/serverInfo/network".parse::<JsonPointer>().unwrap())
|
||||||
|
.await
|
||||||
|
.typed::<NetworkInfo>();
|
||||||
|
loop {
|
||||||
|
if watch
|
||||||
|
.peek()?
|
||||||
|
.as_gateways()
|
||||||
|
.as_idx(&iface)
|
||||||
|
.and_then(|g| g.as_ip_info().transpose_ref())
|
||||||
|
.is_some()
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
watch.changed().await?;
|
||||||
|
}
|
||||||
|
Ok::<_, Error>(())
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.is_err()
|
||||||
|
{
|
||||||
|
tracing::warn!("{}", t!("net.tunnel.timeout-waiting-for-add", gateway = iface.as_str()));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(iface)
|
Ok(iface)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,5 +256,27 @@ pub async fn remove_tunnel(
|
|||||||
.await
|
.await
|
||||||
.result?;
|
.result?;
|
||||||
|
|
||||||
|
// Wait for the sync loop to fully commit gateway removal to the database,
|
||||||
|
// with a 15-second timeout.
|
||||||
|
if tokio::time::timeout(Duration::from_secs(15), async {
|
||||||
|
let mut watch = ctx
|
||||||
|
.db
|
||||||
|
.watch("/public/serverInfo/network".parse::<JsonPointer>().unwrap())
|
||||||
|
.await
|
||||||
|
.typed::<NetworkInfo>();
|
||||||
|
loop {
|
||||||
|
if watch.peek()?.as_gateways().as_idx(&id).is_none() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
watch.changed().await?;
|
||||||
|
}
|
||||||
|
Ok::<_, Error>(())
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.is_err()
|
||||||
|
{
|
||||||
|
tracing::warn!("{}", t!("net.tunnel.timeout-waiting-for-remove", gateway = id.as_str()));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user