Mark,

On 9/22/25 11:55 AM, [email protected] wrote:
This is an automated email from the ASF dual-hosted git repository.

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


The following commit(s) were added to refs/heads/11.0.x by this push:
      new 203f0a07ee Refactor recording of request start time
203f0a07ee is described below

commit 203f0a07eea0ffc93a74ea8b83b31acca10f6133
Author: Mark Thomas <[email protected]>
AuthorDate: Mon Sep 22 16:55:02 2025 +0100

     Refactor recording of request start time
---
  java/org/apache/coyote/AbstractProcessor.java        |  2 +-
  java/org/apache/coyote/Request.java                  | 12 ++++++++++++
  java/org/apache/coyote/ajp/AjpProcessor.java         |  2 +-
  java/org/apache/coyote/http11/Http11InputBuffer.java |  2 +-
  java/org/apache/coyote/http2/Stream.java             |  2 +-
  5 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/java/org/apache/coyote/AbstractProcessor.java 
b/java/org/apache/coyote/AbstractProcessor.java
index df51a4ee87..a341735d19 100644
--- a/java/org/apache/coyote/AbstractProcessor.java
+++ b/java/org/apache/coyote/AbstractProcessor.java
@@ -1045,7 +1045,7 @@ public abstract class AbstractProcessor extends 
AbstractProcessorLight implement
          // information (e.g. client IP)
          setSocketWrapper(socketWrapper);
          // Set up the minimal request information
-        request.setStartTimeNanos(System.nanoTime());
+        request.markStartTime();
          // Set up the minimal response information
          response.setStatus(400);
          response.setError();

I think reasonable people can disagree about exactly where the start-of-request timestamp should be taken, but I think maybe it should be as close to the web application as possible.

Should we move the call to request.markStartTime to the end of this method?

In ms the difference is probably negligible but in ns, it might make a difference.

diff --git a/java/org/apache/coyote/Request.java 
b/java/org/apache/coyote/Request.java
index 302589494f..2252e126e0 100644
--- a/java/org/apache/coyote/Request.java
+++ b/java/org/apache/coyote/Request.java
@@ -754,10 +754,22 @@ public final class Request {
          return startTimeNanos;
      }
+ /**
+     * Set the start time using the value provided by {@code 
System.nanoTime()}.
+     *
+     * @param startTimeNanos The value returned from {@code System.nanoTime()} 
at the point the requests started.
+     *
+     * @deprecated Unused. Will be removed in Tomcat 12 onwards. Use {@link 
#markStartTime()}.
+     */
+    @Deprecated
      public void setStartTimeNanos(long startTimeNanos) {
          this.startTimeNanos = startTimeNanos;
      }
+ public void markStartTime() {
+        startTimeNanos = System.nanoTime();
+    }

Should this call setStartTimeNanos(System.nanoTime) for backward compatibility?

I'll go ahead and say it now since I won't be around to say "I told you so" later, but we're set up here for a year-2554 bug. :D

+
      public long getThreadId() {
          return threadId;
      }
diff --git a/java/org/apache/coyote/ajp/AjpProcessor.java 
b/java/org/apache/coyote/ajp/AjpProcessor.java
index 0a8728a14b..53fb933336 100644
--- a/java/org/apache/coyote/ajp/AjpProcessor.java
+++ b/java/org/apache/coyote/ajp/AjpProcessor.java
@@ -380,7 +380,7 @@ public class AjpProcessor extends AbstractProcessor {
                      setErrorState(ErrorState.CLOSE_CONNECTION_NOW, null);
                      break;
                  }
-                request.setStartTimeNanos(System.nanoTime());
+                request.markStartTime();
              } catch (IOException ioe) {
                  setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
                  break;
diff --git a/java/org/apache/coyote/http11/Http11InputBuffer.java 
b/java/org/apache/coyote/http11/Http11InputBuffer.java
index 977036b093..dc1d30ac85 100644
--- a/java/org/apache/coyote/http11/Http11InputBuffer.java
+++ b/java/org/apache/coyote/http11/Http11InputBuffer.java
@@ -355,7 +355,7 @@ public class Http11InputBuffer implements InputBuffer, 
ApplicationBufferHandler,
                  // just skipping blank lines)
                  if (parsingRequestLinePhase == 0) {
                      parsingRequestLinePhase = 1;
-                    request.setStartTimeNanos(System.nanoTime());
+                    request.markStartTime();
                  }
                  chr = byteBuffer.get();
              } while (chr == Constants.CR || chr == Constants.LF);
diff --git a/java/org/apache/coyote/http2/Stream.java 
b/java/org/apache/coyote/http2/Stream.java
index 3b811179b3..61966dea0f 100644
--- a/java/org/apache/coyote/http2/Stream.java
+++ b/java/org/apache/coyote/http2/Stream.java
@@ -161,7 +161,7 @@ class Stream extends AbstractNonZeroStream implements 
HeaderEmitter {
          this.coyoteResponse.setOutputBuffer(http2OutputBuffer);
          this.coyoteRequest.setResponse(coyoteResponse);
          this.coyoteRequest.protocol().setString("HTTP/2.0");
-        this.coyoteRequest.setStartTimeNanos(System.nanoTime());
+        this.coyoteRequest.markStartTime();
      }

-chris


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

Reply via email to