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;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]