This is an automated email from the ASF dual-hosted git repository.
remm 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 a8edff0153 Avoid counting async dispatches in request count stats
a8edff0153 is described below
commit a8edff015315047570ce6d6266829ff2da9c1600
Author: remm <[email protected]>
AuthorDate: Thu Feb 22 14:10:06 2024 +0100
Avoid counting async dispatches in request count stats
Fixme cleanup.
Remove fragile instanceof logic.
---
.../apache/catalina/ha/session/DeltaManager.java | 4 ++-
.../apache/catalina/ha/tcp/ReplicationValve.java | 42 +++++++++++-----------
.../apache/catalina/ha/tcp/SimpleTcpCluster.java | 2 +-
webapps/docs/changelog.xml | 7 ++++
4 files changed, 31 insertions(+), 24 deletions(-)
diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java
b/java/org/apache/catalina/ha/session/DeltaManager.java
index 03a9475b5d..5183025868 100644
--- a/java/org/apache/catalina/ha/session/DeltaManager.java
+++ b/java/org/apache/catalina/ha/session/DeltaManager.java
@@ -62,6 +62,8 @@ public class DeltaManager extends ClusterManagerBase {
*/
protected static final StringManager sm =
StringManager.getManager(DeltaManager.class);
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
// ----------------------------------------------------- Instance Variables
protected String name = null;
@@ -1171,7 +1173,7 @@ public class DeltaManager extends ClusterManagerBase {
@Override
public String[] getInvalidatedSessions() {
- return new String[0];
+ return EMPTY_STRING_ARRAY;
}
// -------------------------------------------------------- message receive
diff --git a/java/org/apache/catalina/ha/tcp/ReplicationValve.java
b/java/org/apache/catalina/ha/tcp/ReplicationValve.java
index a277cb995f..e034cd9385 100644
--- a/java/org/apache/catalina/ha/tcp/ReplicationValve.java
+++ b/java/org/apache/catalina/ha/tcp/ReplicationValve.java
@@ -306,12 +306,12 @@ public class ReplicationValve extends ValveBase
implements ClusterValve {
}
Context context = request.getContext();
boolean isCrossContext = context != null && context instanceof
StandardContext && context.getCrossContext();
+ boolean isAsync = request.getAsyncContextInternal() != null;
try {
if (isCrossContext) {
if (log.isTraceEnabled()) {
log.trace(sm.getString("ReplicationValve.crossContext.add"));
}
- // FIXME add Pool of Arraylists
crossContextSessions.set(new ArrayList<>());
}
getNext().invoke(request, response);
@@ -324,7 +324,7 @@ public class ReplicationValve extends ValveBase implements
ClusterValve {
return;
}
if (cluster.hasMembers()) {
- sendReplicationMessage(request, totalstart,
isCrossContext, clusterManager);
+ sendReplicationMessage(request, totalstart,
isCrossContext, isAsync, clusterManager);
} else {
resetReplicationRequest(request, isCrossContext);
}
@@ -380,7 +380,7 @@ public class ReplicationValve extends ValveBase implements
ClusterValve {
// --------------------------------------------------------- Protected
Methods
- protected void sendReplicationMessage(Request request, long totalstart,
boolean isCrossContext,
+ protected void sendReplicationMessage(Request request, long totalstart,
boolean isCrossContext, boolean isAsync,
ClusterManager clusterManager) {
// this happens after the request
long start = 0;
@@ -389,10 +389,7 @@ public class ReplicationValve extends ValveBase implements
ClusterValve {
}
try {
// send invalid sessions
- // DeltaManager returns String[0]
- if (!(clusterManager instanceof DeltaManager)) {
- sendInvalidSessions(clusterManager);
- }
+ sendInvalidSessions(clusterManager);
// send replication
sendSessionReplicationMessage(request, clusterManager);
if (isCrossContext) {
@@ -403,7 +400,7 @@ public class ReplicationValve extends ValveBase implements
ClusterValve {
log.error(sm.getString("ReplicationValve.send.failure"), x);
} finally {
if (doStatistics()) {
- updateStats(totalstart, start);
+ updateStats(totalstart, start, isAsync);
}
}
}
@@ -415,8 +412,8 @@ public class ReplicationValve extends ValveBase implements
ClusterValve {
List<DeltaSession> sessions = crossContextSessions.get();
if (sessions != null && sessions.size() > 0) {
for (DeltaSession session : sessions) {
- if (log.isDebugEnabled()) {
-
log.debug(sm.getString("ReplicationValve.crossContext.sendDelta",
+ if (log.isTraceEnabled()) {
+
log.trace(sm.getString("ReplicationValve.crossContext.sendDelta",
session.getManager().getContext().getName()));
}
sendMessage(session, (ClusterManager) session.getManager());
@@ -557,23 +554,24 @@ public class ReplicationValve extends ValveBase
implements ClusterValve {
*
* @param requestTime Request time
* @param clusterTime Cluster time
+ * @param isAsync if the request was in async mode
*/
- protected void updateStats(long requestTime, long clusterTime) {
- // TODO: Async requests may trigger multiple replication requests. How,
- // if at all, should the stats handle this?
+ protected void updateStats(long requestTime, long clusterTime, boolean
isAsync) {
long currentTime = System.currentTimeMillis();
lastSendTime.set(currentTime);
totalSendTime.add(currentTime - clusterTime);
totalRequestTime.add(currentTime - requestTime);
- nrOfRequests.increment();
- if (log.isInfoEnabled()) {
- if ((nrOfRequests.longValue() % 100) == 0) {
- log.info(sm.getString("ReplicationValve.stats",
- new Object[] {
Long.valueOf(totalRequestTime.longValue() / nrOfRequests.longValue()),
- Long.valueOf(totalSendTime.longValue() /
nrOfRequests.longValue()), Long.valueOf(nrOfRequests.longValue()),
- Long.valueOf(nrOfSendRequests.longValue()),
Long.valueOf(nrOfCrossContextSendRequests.longValue()),
- Long.valueOf(nrOfFilterRequests.longValue()),
Long.valueOf(totalRequestTime.longValue()),
- Long.valueOf(totalSendTime.longValue()) }));
+ if (!isAsync) {
+ nrOfRequests.increment();
+ if (log.isDebugEnabled()) {
+ if ((nrOfRequests.longValue() % 100) == 0) {
+ log.debug(sm.getString("ReplicationValve.stats",
+ new Object[] {
Long.valueOf(totalRequestTime.longValue() / nrOfRequests.longValue()),
+ Long.valueOf(totalSendTime.longValue() /
nrOfRequests.longValue()), Long.valueOf(nrOfRequests.longValue()),
+
Long.valueOf(nrOfSendRequests.longValue()),
Long.valueOf(nrOfCrossContextSendRequests.longValue()),
+
Long.valueOf(nrOfFilterRequests.longValue()),
Long.valueOf(totalRequestTime.longValue()),
+ Long.valueOf(totalSendTime.longValue())
}));
+ }
}
}
}
diff --git a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
index c0d3cad81c..7e787dc956 100644
--- a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
+++ b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
@@ -58,7 +58,7 @@ import org.apache.tomcat.util.res.StringManager;
/**
* A <b>Cluster </b> implementation using simple multicast. Responsible for
setting up a cluster and provides callers
- * with a valid multicast receiver/sender. FIXME wrote testcases
+ * with a valid multicast receiver/sender.
*
* @author Remy Maucherat
* @author Peter Rossbach
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index e0177f3d45..08cb1e994c 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -105,6 +105,13 @@
issues do not "pop up" wrt. others).
-->
<section name="Tomcat 9.0.87 (remm)" rtext="in development">
+ <subsection name="Cluster">
+ <changelog>
+ <fix>
+ Avoid updating request count stats on async. (remm)
+ </fix>
+ </changelog>
+ </subsection>
</section>
<section name="Tomcat 9.0.86 (remm)" rtext="2024-02-19">
<subsection name="Catalina">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]