From 232a5f96edb518a361734b5f91e97dd0ab1d8671 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 13 May 2026 12:42:34 +0200 Subject: [PATCH 1/3] Fix 5 flaky tests in camel-core caused by timing issues under CI load - FileSedaShutdownCompleteAllTasksTest: increase file poll delay to prevent duplicate exchanges from re-reading files before .camel/ move - ShutdownCompleteCurrentTaskOnlyTest: same file poll delay fix - MulticastParallelStreamingTimeoutTest: increase multicast timeout and mock wait time to handle thread pool starvation under CI load - MulticastParallelStreamingTest: use syncDelayed() instead of asyncDelayed() for deterministic delay ordering - MulticastParallelTimeoutStreamCachingTest: increase mock result wait time for IOException propagation under CI load Co-Authored-By: Claude Opus 4.6 (1M context) --- .../component/seda/FileSedaShutdownCompleteAllTasksTest.java | 2 +- .../camel/processor/MulticastParallelStreamingTest.java | 2 +- .../processor/MulticastParallelStreamingTimeoutTest.java | 5 +++-- .../processor/MulticastParallelTimeoutStreamCachingTest.java | 2 ++ .../camel/processor/ShutdownCompleteCurrentTaskOnlyTest.java | 2 +- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/component/seda/FileSedaShutdownCompleteAllTasksTest.java b/core/camel-core/src/test/java/org/apache/camel/component/seda/FileSedaShutdownCompleteAllTasksTest.java index 5d48f341d62b7..e8848183987e0 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/seda/FileSedaShutdownCompleteAllTasksTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/seda/FileSedaShutdownCompleteAllTasksTest.java @@ -33,7 +33,7 @@ public class FileSedaShutdownCompleteAllTasksTest extends ContextTestSupport { @Test public void testShutdownCompleteAllTasks() throws Exception { - String url = fileUri("?initialDelay=0&delay=10"); + String url = fileUri("?initialDelay=0&delay=2000"); // prepare 5 files to begin with template.sendBodyAndHeader(url, "A", Exchange.FILE_NAME, "a.txt"); diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTest.java index 35fdff3b5b391..b5b9d2ba211a3 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTest.java @@ -78,7 +78,7 @@ public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { // use end to indicate end of multicast route .end().to("mock:result"); - from("direct:a").delay(2000).asyncDelayed().setBody(constant("A")); + from("direct:a").delay(2000).syncDelayed().setBody(constant("A")); from("direct:b").setBody(constant("B")); } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTimeoutTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTimeoutTest.java index ba4a4e23a5cc9..7bab3e5d46bea 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTimeoutTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStreamingTimeoutTest.java @@ -33,6 +33,7 @@ public void testMulticastParallelStreamingTimeout() throws Exception { MockEndpoint mock = getMockEndpoint("mock:result"); // A will timeout so we only get B and C (C is faster than B) mock.expectedBodiesReceived("CB"); + mock.setResultWaitTime(20000); template.sendBody("direct:start", "Hello"); @@ -54,11 +55,11 @@ public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { oldExchange.getIn().setBody(body + newExchange.getIn().getBody(String.class)); return oldExchange; } - }).parallelProcessing().streaming().timeout(5000).to("direct:a", "direct:b", "direct:c") + }).parallelProcessing().streaming().timeout(10000).to("direct:a", "direct:b", "direct:c") // use end to indicate end of multicast route .end().to("mock:result"); - from("direct:a").delay(10000).setBody(constant("A")); + from("direct:a").delay(20000).setBody(constant("A")); from("direct:b").delay(500).setBody(constant("B")); diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java index f579b9f2bb223..31c2c0182797a 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java @@ -67,7 +67,9 @@ public void testCreateOutputStreamCacheAfterTimeout() throws Exception { @Test public void testCreateOutputStreamCacheBeforeTimeoutButWriteToOutputStreamCacheAfterTimeout() throws Exception { getMockEndpoint("mock:exception").expectedMessageCount(1); + getMockEndpoint("mock:exception").setResultWaitTime(15000); getMockEndpoint("mock:y").expectedMessageCount(0); + getMockEndpoint("mock:y").setAssertPeriod(2000); template.sendBody("direct:b", "testMessage"); assertMockEndpointsSatisfied(); diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ShutdownCompleteCurrentTaskOnlyTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ShutdownCompleteCurrentTaskOnlyTest.java index f7b18d91418b8..5350de95287a6 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/ShutdownCompleteCurrentTaskOnlyTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/ShutdownCompleteCurrentTaskOnlyTest.java @@ -31,7 +31,7 @@ disabledReason = "This test does not run reliably on s390x (see CAMEL-21438)") public class ShutdownCompleteCurrentTaskOnlyTest extends ContextTestSupport { - public static final String FILE_QUERY = "?initialDelay=0&delay=10&synchronous=true"; + public static final String FILE_QUERY = "?initialDelay=0&delay=2000&synchronous=true"; @Override @BeforeEach From 5c2bebcbc9e922e163a72c227410015057590208 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 13 May 2026 13:46:51 +0200 Subject: [PATCH 2/3] Fix 7 additional flaky tests in camel-core caused by timing issues - MarkerFileExclusiveReadLockStrategyTest: increase file poll delay to prevent duplicate exchanges from re-reading files - MarkerFileExclusiveReadLockStrategyUnlockTest: same file poll delay fix - MarkerFileExclusiveReadLockStrategyRecursiveCleanupTest: same fix across all 5 test methods - FileConsumeFilesAndDeleteTest: same file poll delay fix - SedaBlockWhenFullTest: increase mock result wait time from 390ms to 1300ms to handle CI load delays - AggregateCompleteAllOnStopTest: increase completionTimeout from 100ms to 5000ms to prevent premature timeout-based completion between messages - RecipientListParallelStreamingTest: use syncDelayed() for deterministic delay ordering under thread pool pressure Co-Authored-By: Claude Opus 4.6 (1M context) --- .../component/file/FileConsumeFilesAndDeleteTest.java | 2 +- ...eExclusiveReadLockStrategyRecursiveCleanupTest.java | 10 +++++----- .../MarkerFileExclusiveReadLockStrategyUnlockTest.java | 4 ++-- .../MarkerFileExclusiveReadLockStrategyTest.java | 2 +- .../camel/component/seda/SedaBlockWhenFullTest.java | 2 +- .../processor/RecipientListParallelStreamingTest.java | 4 ++-- .../aggregator/AggregateCompleteAllOnStopTest.java | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumeFilesAndDeleteTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumeFilesAndDeleteTest.java index 366261509387c..f75a1aae8fe47 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumeFilesAndDeleteTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumeFilesAndDeleteTest.java @@ -56,7 +56,7 @@ public void testConsumeAndDelete() throws Exception { protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { public void configure() { - from(fileUri("?initialDelay=0&delay=10&fileName=" + TEST_FILE_NAME_1 + "&delete=true")) + from(fileUri("?initialDelay=0&delay=2000&fileName=" + TEST_FILE_NAME_1 + "&delete=true")) .convertBodyTo(String.class).to("mock:result"); } }; diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyRecursiveCleanupTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyRecursiveCleanupTest.java index 517cfc19c3605..8af8119118989 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyRecursiveCleanupTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyRecursiveCleanupTest.java @@ -56,7 +56,7 @@ public void testNonRecursive() throws Exception { @Override public void configure() { from(fileUri( - "d1?fileName=d1.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=10")) + "d1?fileName=d1.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=2000")) .to("mock:result"); } }); @@ -78,7 +78,7 @@ public void testRecursiveSingleDepth() throws Exception { @Override public void configure() { from(fileUri( - "d1?include=.*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=10&recursive=true&minDepth=2&maxDepth=2")) + "d1?include=.*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=2000&recursive=true&minDepth=2&maxDepth=2")) .to("mock:result"); } }); @@ -104,7 +104,7 @@ public void testRecursiveRange() throws Exception { @Override public void configure() { from(fileUri( - "d1?include=.*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=10&recursive=true&minDepth=2&maxDepth=4")) + "d1?include=.*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=2000&recursive=true&minDepth=2&maxDepth=4")) .to("mock:result"); } }); @@ -129,7 +129,7 @@ public void testRecursiveRangeAntInclude() throws Exception { @Override public void configure() { from(fileUri( - "d1?antInclude=**/*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=10&recursive=true&minDepth=2&maxDepth=4")) + "d1?antInclude=**/*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=2000&recursive=true&minDepth=2&maxDepth=4")) .to("mock:result"); } }); @@ -154,7 +154,7 @@ public void testRecursive() throws Exception { @Override public void configure() { from(fileUri( - "d1?include=.*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=10&recursive=true")) + "d1?include=.*.dat&readLock=markerFile&readLockDeleteOrphanLockFiles=true&initialDelay=0&delay=2000&recursive=true")) .to("mock:result"); } }); diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyUnlockTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyUnlockTest.java index 9bfe76a3f180f..7142ea45d8a37 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyUnlockTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/file/MarkerFileExclusiveReadLockStrategyUnlockTest.java @@ -58,8 +58,8 @@ protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @Override public void configure() { - from(fileUri("input-a?fileName=file1.dat&readLock=markerFile&initialDelay=0&delay=10")) - .pollEnrich(fileUri("input-b?fileName=file2.dat&readLock=markerFile&initialDelay=0&delay=10")) + from(fileUri("input-a?fileName=file1.dat&readLock=markerFile&initialDelay=0&delay=2000")) + .pollEnrich(fileUri("input-b?fileName=file2.dat&readLock=markerFile&initialDelay=0&delay=2000")) .to("mock:result"); } }; diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyTest.java index 94ac7c8600251..de5c9ee790e61 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyTest.java @@ -104,7 +104,7 @@ protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @Override public void configure() { - from(fileUri("in?readLock=markerFile&initialDelay=0&delay=10")).onCompletion() + from(fileUri("in?readLock=markerFile&initialDelay=0&delay=2000")).onCompletion() .process(new Processor() { public void process(Exchange exchange) { numberOfFilesProcessed.addAndGet(1); diff --git a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java index 0af9be03db439..906c4ed413c13 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java @@ -91,7 +91,7 @@ public void testSedaBlockingWhenFull() throws Exception { @Test public void testAsyncSedaBlockingWhenFull() throws Exception { getMockEndpoint(MOCK_URI).setExpectedMessageCount(QUEUE_SIZE + 1); - getMockEndpoint(MOCK_URI).setResultWaitTime(DELAY_LONG * 3); + getMockEndpoint(MOCK_URI).setResultWaitTime(DELAY_LONG * 10); SedaEndpoint seda = context.getEndpoint(BLOCK_WHEN_FULL_URI, SedaEndpoint.class); assertEquals(QUEUE_SIZE, seda.getQueue().remainingCapacity()); diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListParallelStreamingTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListParallelStreamingTest.java index 92f683c6846a0..d7d6fbf278a06 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListParallelStreamingTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListParallelStreamingTest.java @@ -49,8 +49,8 @@ public void configure() { from("direct:streaming").recipientList(header("foo")).parallelProcessing().streaming().to("mock:result"); - from("direct:a").delay(100).transform(constant("a")); - from("direct:b").delay(500).transform(constant("b")); + from("direct:a").delay(100).syncDelayed().transform(constant("a")); + from("direct:b").delay(500).syncDelayed().transform(constant("b")); from("direct:c").transform(constant("c")); } }; diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/AggregateCompleteAllOnStopTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/AggregateCompleteAllOnStopTest.java index c378bf8ea8fe0..36c20d7acb0d1 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/AggregateCompleteAllOnStopTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/AggregateCompleteAllOnStopTest.java @@ -58,7 +58,7 @@ public void configure() { .to("mock:input") .aggregate(header("id"), new BodyInAggregatingStrategy()) .aggregationRepository(new MemoryAggregationRepository()) - .completionSize(2).completionTimeout(100).completeAllOnStop().completionTimeoutCheckerInterval(10) + .completionSize(2).completionTimeout(5000).completeAllOnStop().completionTimeoutCheckerInterval(10) .to("mock:aggregated"); } }; From 5c9083689c6ad012ed078f6d450cbbae28b17c85 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 13 May 2026 14:01:52 +0200 Subject: [PATCH 3/3] Revert SedaBlockWhenFullTest change to avoid overlap with PR #23178 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../org/apache/camel/component/seda/SedaBlockWhenFullTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java index 906c4ed413c13..0af9be03db439 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java @@ -91,7 +91,7 @@ public void testSedaBlockingWhenFull() throws Exception { @Test public void testAsyncSedaBlockingWhenFull() throws Exception { getMockEndpoint(MOCK_URI).setExpectedMessageCount(QUEUE_SIZE + 1); - getMockEndpoint(MOCK_URI).setResultWaitTime(DELAY_LONG * 10); + getMockEndpoint(MOCK_URI).setResultWaitTime(DELAY_LONG * 3); SedaEndpoint seda = context.getEndpoint(BLOCK_WHEN_FULL_URI, SedaEndpoint.class); assertEquals(QUEUE_SIZE, seda.getQueue().remainingCapacity());