This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit abd37329a5167332b86f5299a20676ff38b705e5 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Jan 31 16:38:51 2021 +0100 CAMEL-16103: Fixed multicast based EIPs (splitter, recipient list) in transacted mode will cause stackframe sizes to grown deep and lead to stack overflow error. --- ...> TransactedStackSizeBreakOnExceptionTest.java} | 36 +++++++++++++--------- ...TransactedStackSizeParallelProcessingTest.java} | 20 +++++++----- .../interceptor/TransactedStackSizeTest.java | 7 +++-- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeBreakOnExceptionTest.java similarity index 67% copy from components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java copy to components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeBreakOnExceptionTest.java index 9aa6b67..1eb29f2 100644 --- a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java +++ b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeBreakOnExceptionTest.java @@ -16,45 +16,46 @@ */ package org.apache.camel.spring.interceptor; +import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class TransactedStackSizeTest extends TransactionClientDataSourceSupport { +public class TransactedStackSizeBreakOnExceptionTest extends TransactionClientDataSourceSupport { private int total = 100; + private int failAt = 70; private static final boolean PRINT_STACK_TRACE = false; @Test public void testStackSize() throws Exception { - getMockEndpoint("mock:line").expectedMessageCount(total); - getMockEndpoint("mock:result").expectedMessageCount(1); + getMockEndpoint("mock:line").expectedMessageCount(failAt); + getMockEndpoint("mock:line").assertNoDuplicates(body()); + getMockEndpoint("mock:result").expectedMessageCount(0); StringBuilder sb = new StringBuilder(); for (int i = 0; i < total; i++) { sb.append(i); sb.append(","); } + template.sendBody("seda:start", "" + sb.toString()); assertMockEndpointsSatisfied(); - int[] sizes = new int[total + 1]; - for (int i = 0; i < total; i++) { + int[] sizes = new int[failAt]; + for (int i = 0; i < failAt; i++) { int size = getMockEndpoint("mock:line").getReceivedExchanges().get(i).getMessage().getHeader("stackSize", int.class); sizes[i] = size; Assertions.assertTrue(size < 100, "Stackframe should be < 100"); log.info("#{} size {}", i, size); } - int size = getMockEndpoint("mock:result").getReceivedExchanges().get(0).getMessage().getHeader("stackSize", int.class); - sizes[total] = size; - log.info("#{} size {}", total, size); int prev = sizes[0]; // last may be shorter, so use total - 1 - for (int i = 1; i < total - 1; i++) { - size = sizes[i]; + for (int i = 1; i < failAt; i++) { + int size = sizes[i]; Assertions.assertEquals(prev, size, "Stackframe should be same size"); } } @@ -66,13 +67,18 @@ public class TransactedStackSizeTest extends TransactionClientDataSourceSupport public void configure() throws Exception { from("seda:start") .transacted() - .split(body()) - .setHeader("stackSize", TransactedStackSizeTest::currentStackSize) - .log("${body} stack-size ${header.stackSize}") + .setHeader("stackSize", TransactedStackSizeBreakOnExceptionTest::currentStackSize) + .log("BEGIN: ${body} stack-size ${header.stackSize}") + .split(body()).stopOnException() + .setHeader("stackSize", TransactedStackSizeBreakOnExceptionTest::currentStackSize) + .log("LINE: ${body} stack-size ${header.stackSize}") .to("mock:line") + .filter(header(Exchange.SPLIT_INDEX).isEqualTo(failAt)) + .throwException(new IllegalStateException("Forced")) + .end() .end() - .setHeader("stackSize", TransactedStackSizeTest::currentStackSize) - .log("${body} stack-size ${header.stackSize}") + .setHeader("stackSize", TransactedStackSizeBreakOnExceptionTest::currentStackSize) + .log("RESULT: ${body} stack-size ${header.stackSize}") .to("mock:result"); } }; diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeParallelProcessingTest.java similarity index 78% copy from components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java copy to components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeParallelProcessingTest.java index 9aa6b67..739a9ed 100644 --- a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java +++ b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeParallelProcessingTest.java @@ -18,16 +18,20 @@ package org.apache.camel.spring.interceptor; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; -public class TransactedStackSizeTest extends TransactionClientDataSourceSupport { +public class TransactedStackSizeParallelProcessingTest extends TransactionClientDataSourceSupport { private int total = 100; private static final boolean PRINT_STACK_TRACE = false; - @Test + @Disabled("Flaky - May report 101 or 102 messages") + @RepeatedTest(value = 100) public void testStackSize() throws Exception { getMockEndpoint("mock:line").expectedMessageCount(total); + getMockEndpoint("mock:line").assertNoDuplicates(body()); getMockEndpoint("mock:result").expectedMessageCount(1); StringBuilder sb = new StringBuilder(); @@ -66,13 +70,15 @@ public class TransactedStackSizeTest extends TransactionClientDataSourceSupport public void configure() throws Exception { from("seda:start") .transacted() - .split(body()) - .setHeader("stackSize", TransactedStackSizeTest::currentStackSize) - .log("${body} stack-size ${header.stackSize}") + .setHeader("stackSize", TransactedStackSizeParallelProcessingTest::currentStackSize) + .log("BEGIN: ${body} stack-size ${header.stackSize}") + .split(body()).parallelProcessing() + .setHeader("stackSize", TransactedStackSizeParallelProcessingTest::currentStackSize) + .log("LINE: ${body} stack-size ${header.stackSize}") .to("mock:line") .end() - .setHeader("stackSize", TransactedStackSizeTest::currentStackSize) - .log("${body} stack-size ${header.stackSize}") + .setHeader("stackSize", TransactedStackSizeParallelProcessingTest::currentStackSize) + .log("RESULT: ${body} stack-size ${header.stackSize}") .to("mock:result"); } }; diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java index 9aa6b67..2f0bf71 100644 --- a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java +++ b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactedStackSizeTest.java @@ -28,6 +28,7 @@ public class TransactedStackSizeTest extends TransactionClientDataSourceSupport @Test public void testStackSize() throws Exception { getMockEndpoint("mock:line").expectedMessageCount(total); + getMockEndpoint("mock:line").assertNoDuplicates(body()); getMockEndpoint("mock:result").expectedMessageCount(1); StringBuilder sb = new StringBuilder(); @@ -66,13 +67,15 @@ public class TransactedStackSizeTest extends TransactionClientDataSourceSupport public void configure() throws Exception { from("seda:start") .transacted() + .setHeader("stackSize", TransactedStackSizeTest::currentStackSize) + .log("BEGIN: ${body} stack-size ${header.stackSize}") .split(body()) .setHeader("stackSize", TransactedStackSizeTest::currentStackSize) - .log("${body} stack-size ${header.stackSize}") + .log("LINE: ${body} stack-size ${header.stackSize}") .to("mock:line") .end() .setHeader("stackSize", TransactedStackSizeTest::currentStackSize) - .log("${body} stack-size ${header.stackSize}") + .log("RESULT: ${body} stack-size ${header.stackSize}") .to("mock:result"); } };