From 08349fff1938f661cf0323472fbf5e5eaed3dfeb Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 6 May 2026 11:32:44 +0200 Subject: [PATCH 1/2] CAMEL-23216: Fix flaky mina sftp tests Add server readiness probe in SftpEmbeddedInfraService to verify the embedded SFTP server accepts TCP connections before tests run. Throws IOException if the server is not ready within 5 seconds, failing fast with a clear error instead of proceeding to confusing timeout errors. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../embedded/SftpEmbeddedInfraService.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java index 5fafd778f1b0e..58be3c5b8f91a 100644 --- a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java +++ b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; +import java.net.Socket; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -136,6 +137,23 @@ public void setUpServer() throws Exception { sshd.start(); port = ((InetSocketAddress) sshd.getBoundAddresses().iterator().next()).getPort(); + + waitForServerReady(); + } + + private void waitForServerReady() throws IOException { + long deadline = System.nanoTime() + 30_000_000_000L; // 30 seconds + IOException lastException = null; + while (System.nanoTime() < deadline) { + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress("localhost", port), 1000); + return; + } catch (IOException e) { + lastException = e; + Thread.onSpinWait(); + } + } + throw new IOException("SFTP server not ready after 30 seconds on port " + port, lastException); } protected PublickeyAuthenticator getPublickeyAuthenticator() { From f3e65b54556cf85aadc18601df8595319525389b Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 6 May 2026 14:12:54 +0200 Subject: [PATCH 2/2] CAMEL-23216: Address review feedback - Increase server readiness timeout to 30 seconds - Use TimeUnit.SECONDS.toNanos(30) for clarity Co-Authored-By: Claude Opus 4.6 (1M context) --- .../infra/ftp/services/embedded/SftpEmbeddedInfraService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java index 58be3c5b8f91a..35b754ddd1cc0 100644 --- a/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java +++ b/test-infra/camel-test-infra-ftp/src/main/java/org/apache/camel/test/infra/ftp/services/embedded/SftpEmbeddedInfraService.java @@ -28,6 +28,7 @@ import java.security.PublicKey; import java.util.Collections; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import org.apache.camel.spi.annotations.InfraService; @@ -142,7 +143,7 @@ public void setUpServer() throws Exception { } private void waitForServerReady() throws IOException { - long deadline = System.nanoTime() + 30_000_000_000L; // 30 seconds + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(30); IOException lastException = null; while (System.nanoTime() < deadline) { try (Socket socket = new Socket()) {