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.