This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch fix/camel-lumberjack-flaky-tests
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 2ae8f1349e5d8e96919859298ba644b5f1b0d1a6
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Jul 16 11:33:47 2026 +0200

    camel-lumberjack: fix flaky tests by awaiting Netty shutdown
    
    - Await shutdownGracefully() on all Netty thread groups in 
LumberjackServer.stop()
      so the port is fully released before the next test binds a new server
    - Await channel.close() and event loop shutdown in test client 
(LumberjackUtil)
      to prevent half-open connections from causing spurious ack count 
mismatches
    - Make ErrorProcessor.count thread-safe with AtomicInteger in disconnection 
test
    - Add explicit 30s Awaitility timeout in LumberjackUtil (was relying on 10s 
default)
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../apache/camel/component/lumberjack/io/LumberjackServer.java    | 8 +++++---
 .../camel/component/lumberjack/LumberjackDisconnectionTest.java   | 6 +++---
 .../org/apache/camel/component/lumberjack/LumberjackUtil.java     | 7 ++++---
 3 files changed, 12 insertions(+), 9 deletions(-)

diff --git 
a/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/io/LumberjackServer.java
 
b/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/io/LumberjackServer.java
index 6aa80d1a0539..8a4222f46683 100644
--- 
a/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/io/LumberjackServer.java
+++ 
b/components/camel-lumberjack/src/main/java/org/apache/camel/component/lumberjack/io/LumberjackServer.java
@@ -107,9 +107,11 @@ public final class LumberjackServer {
             // Wait for the channel to be indeed closed before shutting the 
groups & service
             channel.close().sync();
         } finally {
-            bossGroup.shutdownGracefully();
-            workerGroup.shutdownGracefully();
-            executorService.shutdownGracefully();
+            // Await graceful shutdown of all thread groups so the port is 
fully released
+            // before the next test (or consumer restart) binds a new server
+            bossGroup.shutdownGracefully().syncUninterruptibly();
+            workerGroup.shutdownGracefully().syncUninterruptibly();
+            executorService.shutdownGracefully().syncUninterruptibly();
         }
 
         LOG.info("LUMBERJACK server is stopped (host={}, port={}).", host, 
port);
diff --git 
a/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackDisconnectionTest.java
 
b/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackDisconnectionTest.java
index ad7d046e2378..3ea40e32eda2 100644
--- 
a/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackDisconnectionTest.java
+++ 
b/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackDisconnectionTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.lumberjack;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
@@ -76,12 +77,11 @@ public class LumberjackDisconnectionTest extends 
CamelTestSupport {
      * This processor throws an exception as the fourth message received.
      */
     private static final class ErrorProcessor implements Processor {
-        int count;
+        private final AtomicInteger count = new AtomicInteger();
 
         @Override
         public void process(Exchange exchange) {
-            count++;
-            if (count == 4) {
+            if (count.incrementAndGet() == 4) {
                 throw new RuntimeCamelException("Ooops");
             }
         }
diff --git 
a/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackUtil.java
 
b/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackUtil.java
index 32e14079b0c1..06008beff30c 100644
--- 
a/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackUtil.java
+++ 
b/components/camel-lumberjack/src/test/java/org/apache/camel/component/lumberjack/LumberjackUtil.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import javax.net.ssl.SSLEngine;
 
@@ -94,16 +95,16 @@ final class LumberjackUtil {
             // send 5 frame windows, without pausing
             windows.stream().forEach(window -> 
channel.writeAndFlush(readSample(String.format("io/window%s.bin", window))));
             if (waitForResult) {
-                Awaitility.await().until(() -> windows.size() == 
responses.size());
+                Awaitility.await().atMost(30, TimeUnit.SECONDS).until(() -> 
windows.size() == responses.size());
             }
 
-            channel.close();
+            channel.close().sync();
 
             synchronized (responses) {
                 return responses;
             }
         } finally {
-            eventLoopGroup.shutdownGracefully();
+            eventLoopGroup.shutdownGracefully().syncUninterruptibly();
         }
     }
 

Reply via email to