You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/01/31 15:55:48 UTC

[camel] 04/07: 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.

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