From d7f4b950ce6e966ed1b410e03d48fe96bc036e73 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 26 Mar 2026 12:42:02 +0000 Subject: [PATCH] fix: pass pre-bound TcpListener to run_server to fix Windows CI test race (#8542) Co-authored-by: Claude Opus 4.6 (1M context) --- backend/src/main.rs | 5 ++++- backend/windmill-api/src/lib.rs | 10 +++++----- backend/windmill-test-utils/src/lib.rs | 7 +++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/backend/src/main.rs b/backend/src/main.rs index ad5b9e14b8..4fe22c517f 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -1099,6 +1099,9 @@ Windmill Community Edition {GIT_VERSION} } let addr = SocketAddr::from((server_bind_address, port)); + let listener = tokio::net::TcpListener::bind(addr) + .await + .context("binding main windmill server")?; let (base_internal_tx, base_internal_rx) = tokio::sync::oneshot::channel::(); @@ -1232,7 +1235,7 @@ Windmill Community Edition {GIT_VERSION} db.clone(), index_reader, log_index_reader, - addr, + listener, server_killpill_rx, base_internal_tx, server_mode, diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index 65ba4cad15..15a674ea37 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -45,8 +45,8 @@ use windmill_common::global_settings::EMAIL_DOMAIN_SETTING; use windmill_common::worker::HUB_CACHE_DIR; use std::fs::DirBuilder; +use std::sync::Arc; use std::time::Duration; -use std::{net::SocketAddr, sync::Arc}; use tokio::sync::RwLock; use tower::ServiceBuilder; use tower_cookies::CookieManagerLayer; @@ -326,7 +326,7 @@ pub async fn run_server( db: DB, job_index_reader: Option, log_index_reader: Option, - addr: SocketAddr, + listener: tokio::net::TcpListener, mut killpill_rx: tokio::sync::broadcast::Receiver<()>, port_tx: tokio::sync::oneshot::Sender, server_mode: bool, @@ -412,6 +412,9 @@ pub async fn run_server( auth_cache: auth_cache.clone(), base_internal_url: _base_internal_url.clone(), }); + let addr = listener + .local_addr() + .unwrap_or_else(|_| std::net::SocketAddr::from(([127, 0, 0, 1], 0))); if let Err(err) = smtp_server.start_listener_thread(addr).await { tracing::error!("Error starting SMTP server: {err:#}"); } @@ -452,9 +455,6 @@ pub async fn run_server( health::start_health_check_loop(db.clone(), killpill_rx.resubscribe()); } - let listener = tokio::net::TcpListener::bind(addr) - .await - .context("binding main windmill server")?; let port = listener.local_addr().map(|x| x.port()).unwrap_or(8000); let ip = listener .local_addr() diff --git a/backend/windmill-test-utils/src/lib.rs b/backend/windmill-test-utils/src/lib.rs index ef2bf66513..d9e22eaa84 100644 --- a/backend/windmill-test-utils/src/lib.rs +++ b/backend/windmill-test-utils/src/lib.rs @@ -97,14 +97,13 @@ impl ApiServer { async fn start_inner(db: Pool, agent_mode: bool) -> anyhow::Result { let (tx, rx) = tokio::sync::broadcast::channel::<()>(1); - let sock = tokio::net::TcpListener::bind("127.0.0.1:0") + let listener = tokio::net::TcpListener::bind("127.0.0.1:0") .await .map_err(|e| anyhow::anyhow!("failed to bind TCP listener: {}", e))?; - let addr = sock + let addr = listener .local_addr() .map_err(|e| anyhow::anyhow!("failed to get local address: {}", e))?; - drop(sock); let (port_tx, _port_rx) = tokio::sync::oneshot::channel::(); let name = next_worker_name(); tracing::info!("starting api server for name={name}"); @@ -112,7 +111,7 @@ impl ApiServer { db.clone(), None, None, - addr, + listener, rx, port_tx, agent_mode,