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");
             }
         };

Reply via email to