From 46c60d5f1970e099fa240fb34ac8dafd76707f97 Mon Sep 17 00:00:00 2001 From: Riz Ashraf Date: Wed, 9 Sep 2026 04:06:19 +0100 Subject: [PATCH] fix: Limit port bind retry loop to 15 seconds before crashing --- server/src/main.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index 3cca0ad..8c8bac5 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -167,9 +167,31 @@ fn run_server(state: Arc) -> Result<(), Box> })) .with_state(app_state); - let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); + let mut retries = 0; + let listener = loop { + match tokio::net::TcpListener::bind("0.0.0.0:3000").await { + Ok(l) => break l, + Err(e) => { + retries += 1; + if retries > 15 { + let log_path = dirs::home_dir().unwrap_or_default().join(".gemini/mcp_memory/daemon_fatal.log"); + let _ = std::fs::write(&log_path, format!("FATAL: Could not bind to 0.0.0.0:3000 after 15 seconds: {}\n", e)); + std::process::exit(1); + } + let log_path = dirs::home_dir().unwrap_or_default().join(".gemini/mcp_memory/daemon_error.log"); + if let Ok(mut file) = std::fs::OpenOptions::new().create(true).append(true).open(&log_path) { + use std::io::Write; + let _ = writeln!(file, "Failed to bind to 0.0.0.0:3000 (attempt {}): {}. Retrying in 1s...", retries, e); + } + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + } + } + }; eprintln!("MCP Memory Server running on http://0.0.0.0:3000/sse"); - axum::serve(listener, app).await.unwrap(); + if let Err(e) = axum::serve(listener, app).await { + let log_path = dirs::home_dir().unwrap_or_default().join(".gemini/mcp_memory/daemon_error.log"); + let _ = std::fs::write(&log_path, format!("Server crashed: {}\n", e)); + } Ok(()) }) }