(tomcat) branch 10.1.x updated: Improve robustness of o.a.c.core package to system clock jumps

[email protected]
Newsgroups gmane.comp.jakarta.tomcat.devel
Message-ID <178774318860.2108249.9034304869584871137@gitbox3-he-fi.apache.org>
This is an automated email from the ASF dual-hosted git repository.

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


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 66ea3b81ae Improve robustness of o.a.c.core package to system clock jumps
66ea3b81ae is described below

commit 66ea3b81ae401b38b6832c9afa8aaa5ae72f7989
Author: Mark Thomas <[email protected]>
AuthorDate: Wed Aug 26 12:17:50 2026 +0100

    Improve robustness of o.a.c.core package to system clock jumps
---
 java/org/apache/catalina/core/StandardContext.java      | 5 +++--
 java/org/apache/catalina/core/StandardServer.java       | 4 ++--
 java/org/apache/catalina/core/StandardWrapper.java      | 7 ++++---
 java/org/apache/catalina/core/StandardWrapperValve.java | 7 ++++---
 4 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java
index b07a7d2cac..c7ba2e4773 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -44,6 +44,7 @@ import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -4833,8 +4834,8 @@ public class StandardContext extends ContainerBase implements Context, Notificat
         // requests will be mapped) but is still available.
 
         // Give the in progress async requests a chance to complete
-        long limit = System.currentTimeMillis() + unloadDelay;
-        while (inProgressAsyncCount.get() > 0 && System.currentTimeMillis() < limit) {
+        long limit = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(unloadDelay);
+        while (inProgressAsyncCount.get() > 0 && (System.nanoTime() - limit) < 0) {
             try {
                 Thread.sleep(50);
             } catch (InterruptedException e) {
diff --git a/java/org/apache/catalina/core/StandardServer.java b/java/org/apache/catalina/core/StandardServer.java
index d54acda7ce..b7838f0c51 100644
--- a/java/org/apache/catalina/core/StandardServer.java
+++ b/java/org/apache/catalina/core/StandardServer.java
@@ -555,7 +555,7 @@ public final class StandardServer extends LifecycleMBeanBase implements Server {
                 StringBuilder command = new StringBuilder();
                 try {
                     InputStream stream;
-                    long acceptStartTime = System.currentTimeMillis();
+                    long acceptStartTime = System.nanoTime();
                     try {
                         socket = serverSocket.accept();
                         socket.setSoTimeout(10 * 1000); // Ten seconds
@@ -564,7 +564,7 @@ public final class StandardServer extends LifecycleMBeanBase implements Server {
                         // This should never happen but bug 56684 suggests that
                         // it does.
                         log.warn(sm.getString("standardServer.accept.timeout",
-                                Long.valueOf(System.currentTimeMillis() - acceptStartTime)), ste);
+                                Long.valueOf(TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - acceptStartTime))), ste);
                         continue;
                     } catch (AccessControlException ace) {
                         log.warn(sm.getString("standardServer.accept.security"), ace);
diff --git a/java/org/apache/catalina/core/StandardWrapper.java b/java/org/apache/catalina/core/StandardWrapper.java
index cd705c6067..eb0303b4da 100644
--- a/java/org/apache/catalina/core/StandardWrapper.java
+++ b/java/org/apache/catalina/core/StandardWrapper.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
@@ -752,7 +753,7 @@ public class StandardWrapper extends ContainerBase implements ServletConfig, Wra
 
         Servlet servlet;
         try {
-            long t1 = System.currentTimeMillis();
+            long t1 = System.nanoTime();
             // Complain if no servlet class has been specified
             if (servletClass == null) {
                 unavailable(null);
@@ -795,13 +796,13 @@ public class StandardWrapper extends ContainerBase implements ServletConfig, Wra
                 ((ContainerServlet) servlet).setWrapper(this);
             }
 
-            classLoadTime = (int) (System.currentTimeMillis() - t1);
+            classLoadTime = (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - t1);
 
             initServlet(servlet);
 
             fireContainerEvent("load", this);
 
-            loadTime = System.currentTimeMillis() - t1;
+            loadTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - t1);
         } finally {
             if (swallowOutput) {
                 String log = SystemLogHandler.stopCapture();
diff --git a/java/org/apache/catalina/core/StandardWrapperValve.java b/java/org/apache/catalina/core/StandardWrapperValve.java
index 5199a1b33b..732dab671e 100644
--- a/java/org/apache/catalina/core/StandardWrapperValve.java
+++ b/java/org/apache/catalina/core/StandardWrapperValve.java
@@ -18,6 +18,7 @@ package org.apache.catalina.core;
 
 
 import java.io.IOException;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.LongAdder;
 
@@ -87,7 +88,7 @@ final class StandardWrapperValve extends ValveBase {
         boolean unavailable = false;
         Throwable throwable = null;
         // This should be a Request attribute...
-        long t1 = System.currentTimeMillis();
+        long t1 = System.nanoTime();
         requestCount.incrementAndGet();
         StandardWrapper wrapper = (StandardWrapper) getContainer();
         Servlet servlet = null;
@@ -240,9 +241,9 @@ final class StandardWrapperValve extends ValveBase {
                     exception(request, response, t);
                 }
             }
-            long t2 = System.currentTimeMillis();
+            long t2 = System.nanoTime();
 
-            long time = t2 - t1;
+            long time = TimeUnit.NANOSECONDS.toMillis(t2 - t1);
             processingTime.add(time);
             if (time > maxTime) {
                 maxTime = time;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.