From 3342d129c24ed6578bb52ed10d253df8bc789b19 Mon Sep 17 00:00:00 2001 From: Timmy Date: Mon, 29 Jun 2026 19:22:47 +0100 Subject: [PATCH] Unreachable container times out gracefully --- docker/stacks/jvm/Dockerfile.fragment | 4 ++-- .../src/chat/transport/matrix/bot/context.rs | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/docker/stacks/jvm/Dockerfile.fragment b/docker/stacks/jvm/Dockerfile.fragment index 3c7b4f03..8f01266a 100644 --- a/docker/stacks/jvm/Dockerfile.fragment +++ b/docker/stacks/jvm/Dockerfile.fragment @@ -25,8 +25,8 @@ ENV JAVA_HOME="/usr/lib/jvm/java-17-openjdk" # Eclipse JDT Language Server — canonical LSP for Java/JVM (Java, Kotlin, Groovy). # Pin to a specific release; update JDTLS_VERSION + JDTLS_BUILD for upgrades. # All releases: https://github.com/eclipse-jdtls/eclipse.jdt.ls/releases -ENV JDTLS_VERSION="1.38.0" \ - JDTLS_BUILD="202503271418" +ENV JDTLS_VERSION="1.60.0" \ + JDTLS_BUILD="202606262232" RUN mkdir -p /opt/jdtls \ && curl -fsSL \ "https://download.eclipse.org/jdtls/milestones/${JDTLS_VERSION}/jdt-language-server-${JDTLS_VERSION}-${JDTLS_BUILD}.tar.gz" \ diff --git a/server/src/chat/transport/matrix/bot/context.rs b/server/src/chat/transport/matrix/bot/context.rs index 8f155e12..f784b3f2 100644 --- a/server/src/chat/transport/matrix/bot/context.rs +++ b/server/src/chat/transport/matrix/bot/context.rs @@ -183,13 +183,24 @@ impl BotContext { Err(e) => return Some(format!("Failed to serialize RPC request: {e}")), }; - let ws_stream = match tokio_tungstenite::connect_async(&ws_url).await { - Ok((stream, _)) => stream, - Err(e) => { + let connect_timeout = std::time::Duration::from_secs(5); + let ws_stream = match tokio::time::timeout( + connect_timeout, + tokio_tungstenite::connect_async(&ws_url), + ) + .await + { + Ok(Ok((stream, _))) => stream, + Ok(Err(e)) => { return Some(format!( "Failed to connect to project server at {ws_url}: {e}" )); } + Err(_) => { + return Some(format!( + "Project server at {ws_url} is unreachable (connect timed out after {connect_timeout:?})" + )); + } }; let (mut sink, mut stream) = ws_stream.split(); @@ -198,7 +209,9 @@ impl BotContext { return Some(format!("Failed to send RPC request: {e}")); } - while let Some(msg) = stream.next().await { + let response_timeout = std::time::Duration::from_secs(30); + let deadline = tokio::time::Instant::now() + response_timeout; + while let Ok(Some(msg)) = tokio::time::timeout_at(deadline, stream.next()).await { match msg { Ok(WsMsg::Text(text)) => { let Ok(frame) = serde_json::from_str::(&text) else { @@ -239,7 +252,7 @@ impl BotContext { } } - Some("Connection closed before receiving command response".to_string()) + Some("Project server did not respond in time (connection closed or timed out)".to_string()) } }