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

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

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


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

commit 3631e8518eba34c053c95b032ddb9625191cc85b
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 58e3c48618..4fce57e7ee 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -42,6 +42,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;
@@ -4765,8 +4766,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 2c4856e018..cb2961f2dd 100644
--- a/java/org/apache/catalina/core/StandardServer.java
+++ b/java/org/apache/catalina/core/StandardServer.java
@@ -554,7 +554,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
@@ -563,7 +563,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 (IOException ioe) {
                         if (stopAwait) {
diff --git a/java/org/apache/catalina/core/StandardWrapper.java b/java/org/apache/catalina/core/StandardWrapper.java
index de2298992a..d0ed7f9bac 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;
 
@@ -745,7 +746,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);
@@ -788,13 +789,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 bf306a28cd..4341c5e6ae 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.LongAdder;
 
 import jakarta.servlet.DispatcherType;
@@ -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.increment();
         StandardWrapper wrapper = (StandardWrapper) getContainer();
         Servlet servlet = null;
@@ -247,9 +248,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.