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;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to