From 5552d2320ae2f3a9fa5baef5dc8e8f0e427bfeed Mon Sep 17 00:00:00 2001 From: Christian Duvholt Date: Wed, 2 Jul 2025 18:47:44 +0200 Subject: [PATCH 1/2] Reconnect to z2m websocket everytime the service fails --- src/backend/z2m/mod.rs | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/src/backend/z2m/mod.rs b/src/backend/z2m/mod.rs index cefd96db..c77781d4 100644 --- a/src/backend/z2m/mod.rs +++ b/src/backend/z2m/mod.rs @@ -176,7 +176,12 @@ impl Service for Z2mBackend { sanitized_url ); } + Ok(()) + } + async fn run(&mut self) -> ApiResult<()> { + let sanitized_url = self.server.get_sanitized_url(); + let url = self.server.get_url(); // if tls verification is disabled, build a TlsConnector that explicitly // does not check certificate validity. This is obviously neither safe // nor recommended. @@ -195,28 +200,19 @@ impl Service for Z2mBackend { }; log::info!("[{}] Connecting to {}", self.name, &sanitized_url); - match connect_async_tls_with_config(url.as_str(), None, false, connector.clone()).await { - Ok((socket, _)) => { - self.socket = Some(socket); - Ok(()) - } - Err(err) => { - log::error!("[{}] Connect failed: {err:?}", self.name); - Err(err.into()) - } - } - } + let socket = + match connect_async_tls_with_config(url.as_str(), None, false, connector.clone()).await + { + Ok((socket, _)) => socket, + Err(err) => { + log::error!("[{}] Connect failed: {err:?}", self.name); + return Err(err.into()); + } + }; - async fn run(&mut self) -> ApiResult<()> { - if let Some(socket) = self.socket.take() { - let z2m_socket = Z2mWebSocket::new(self.name.clone(), socket); - let mut chan = self.state.lock().await.backend_event_stream(); - let res = self.event_loop(&mut chan, z2m_socket).await; - if let Err(err) = res { - log::error!("[{}] Event loop broke: {err}", self.name); - } - } - Ok(()) + let z2m_socket = Z2mWebSocket::new(self.name.clone(), socket); + let mut chan = self.state.lock().await.backend_event_stream(); + self.event_loop(&mut chan, z2m_socket).await } async fn stop(&mut self) -> ApiResult<()> { From c1b89d56f07f8a6205887228d0f37ee0aba9c8a3 Mon Sep 17 00:00:00 2001 From: Christian Duvholt Date: Wed, 2 Jul 2025 18:48:14 +0200 Subject: [PATCH 2/2] Change default service restart policy to 'forever' --- crates/svc/src/runservice.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/svc/src/runservice.rs b/crates/svc/src/runservice.rs index bf2058fd..bc366f75 100644 --- a/crates/svc/src/runservice.rs +++ b/crates/svc/src/runservice.rs @@ -66,7 +66,9 @@ impl StandardService { start_policy: Policy::new() .with_delay(Duration::from_secs(1)) .with_retry(Retry::Limit(3)), - run_policy: Policy::new().with_delay(Duration::from_secs(1)), + run_policy: Policy::new() + .with_retry(Retry::Forever) + .with_delay(Duration::from_secs(1)), stop_policy: Policy::new(), } }