This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/9.0.x by this push:
new 0c0ac9fb50 Improve robustness of o.a.c.core package to system clock jumps
0c0ac9fb50 is described below
commit 0c0ac9fb50a6f14aacb160eae287b28f7afb99f9
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 86083b447d..d6a7ba4790 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -43,6 +43,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;
@@ -4860,8 +4861,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 dbfe21a58b..5d4574549b 100644
--- a/java/org/apache/catalina/core/StandardServer.java
+++ b/java/org/apache/catalina/core/StandardServer.java
@@ -559,7 +559,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
@@ -568,7 +568,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 e639cfca71..1e9c338cae 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.Set;
import java.util.Stack;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -889,7 +890,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);
@@ -932,7 +933,7 @@ 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);
if (servlet instanceof SingleThreadModel) {
if (instancePool == null) {
@@ -945,7 +946,7 @@ public class StandardWrapper extends ContainerBase implements ServletConfig, Wra
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 1afc0dc5f7..aac293024d 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;
@@ -88,7 +89,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;
@@ -241,9 +242,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.