You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2024/01/08 17:33:07 UTC

(tomcat) 06/08: This test is very timing sensitive. Add some test specific margins.

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

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 7a2352969b484212fa230c5df97c9bd64e24d886
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Jan 8 12:11:31 2024 +0000

    This test is very timing sensitive. Add some test specific margins.
    
    The current margins are based on local testing and reports on the dev
    list. They may need to be relaxed further or if the results are very
    inconsistent between systems it may need to be disabled by default.
---
 .../server/TestAsyncMessagesPerformance.java       | 47 +++++++++++++++++-----
 1 file changed, 38 insertions(+), 9 deletions(-)

diff --git a/test/org/apache/tomcat/websocket/server/TestAsyncMessagesPerformance.java b/test/org/apache/tomcat/websocket/server/TestAsyncMessagesPerformance.java
index c169f61a60..5304bee2ca 100644
--- a/test/org/apache/tomcat/websocket/server/TestAsyncMessagesPerformance.java
+++ b/test/org/apache/tomcat/websocket/server/TestAsyncMessagesPerformance.java
@@ -36,6 +36,11 @@ import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.websocket.TesterAsyncTiming;
 import org.apache.tomcat.websocket.TesterMessageCountClient.TesterProgrammaticEndpoint;
 
+/*
+ * This test is very timing sensitive. Any failures need to be checked to see if the thresholds just need adjusting to
+ * support a wider range of platforms and/or Java versions or if the failure is an indication of a performance drop in
+ * the WebSocket implementation.
+ */
 public class TestAsyncMessagesPerformance extends TomcatBaseTest {
 
     @Test
@@ -69,11 +74,20 @@ public class TestAsyncMessagesPerformance extends TomcatBaseTest {
         private long lastMessage = 0;
         private int sequence = 0;
         private int count = 0;
+        private long seqZeroTimingFailureCount = 0;
+        private long seqOneTimingFailureCount = 0;
+        private long seqTwoTimingFailureCount = 0;
+
         private CountDownLatch latch = new CountDownLatch(1);
         private volatile boolean fail = false;
 
         @Override
         public void onMessage(ByteBuffer message, boolean last) {
+            // Expected received data is:
+            // 1 * 16k message in 2 * 8k chunks
+            // 1 * 4k message in 1 * 4k chunk
+            // 50 ms pause
+            // loop
             if (lastMessage == 0) {
                 // First message. Don't check
                 sequence++;
@@ -87,34 +101,36 @@ public class TestAsyncMessagesPerformance extends TomcatBaseTest {
                     sequence++;
                     if (message.capacity() != 8192) {
                         System.out.println(
-                                "Expected size 8192 but was [" + message.capacity() + "], count [" + count + "]");
+                                "SEQ0: Expected size 8192 but was [" + message.capacity() + "], count [" + count + "]");
                         fail = true;
                     }
                     if (diff < 40000000) {
-                        System.out.println("Expected diff > 40ms but was [" + diff + "], count [" + count + "]");
-                        fail = true;
+                        System.out.println("SEQ0: Expected diff > 40ms but was [" + diff + "], count [" + count + "]");
+                        seqZeroTimingFailureCount++;
                     }
                 } else if (sequence == 1) {
                     sequence++;
                     if (message.capacity() != 8192) {
                         System.out.println(
-                                "Expected size 8192 but was [" + message.capacity() + "], count [" + count + "]");
+                                "SEQ1: Expected size 8192 but was [" + message.capacity() + "], count [" + count + "]");
                         fail = true;
                     }
+                    // Gap between 2* 8k chunks of 16k message expected to be less than 0.5ms
                     if (diff > 500000) {
-                        System.out.println("Expected diff < 500,000 but was [" + diff + "], count [" + count + "]");
-                        fail = true;
+                        System.out.println("SEQ1: Expected diff < 500,000 but was [" + diff + "], count [" + count + "]");
+                        seqOneTimingFailureCount++;
                     }
                 } else if (sequence == 2) {
                     sequence = 0;
                     if (message.capacity() != 4096) {
                         System.out.println(
-                                "Expected size 4096 but was [" + message.capacity() + "], count [" + count + "]");
+                                "SEQ2: Expected size 4096 but was [" + message.capacity() + "], count [" + count + "]");
                         fail = true;
                     }
+                    // Gap between 16k message and 4k message expected to be less than 0.5ms
                     if (diff > 500000) {
-                        System.out.println("Expected diff < 500,000 but was [" + diff + "], count [" + count + "]");
-                        fail = true;
+                        System.out.println("SEQ2: Expected diff < 500,000 but was [" + diff + "], count [" + count + "]");
+                        seqTwoTimingFailureCount++;
                     }
                 }
             }
@@ -130,6 +146,19 @@ public class TestAsyncMessagesPerformance extends TomcatBaseTest {
         }
 
         public boolean hasFailed() {
+            // Total iterations are 1500
+            if (!fail) {
+                if (seqZeroTimingFailureCount > 1) {
+                    // The 50ms pause after the short message may very rarely appear to be less than 40ms
+                    fail = true;
+                } else if (seqOneTimingFailureCount > 5) {
+                    // The two chunks of the 16k message may rarely be more than 0.5ms apart
+                    fail = true;
+                } else if (seqTwoTimingFailureCount > 100) {
+                    // The short message may often be more than 0.5ms after the long message
+                    fail = true;
+                }
+            }
             return fail;
         }
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org