Skip to content

Commit

Permalink
Avoid counting async dispatches in request count stats
Browse files Browse the repository at this point in the history
Fixme cleanup.
Remove fragile instanceof logic.
  • Loading branch information
rmaucher committed Feb 22, 2024
1 parent 7f9af2f commit f63f144
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 24 deletions.
4 changes: 3 additions & 1 deletion java/org/apache/catalina/ha/session/DeltaManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -1052,7 +1054,7 @@ public void expireAllLocalSessions() {

@Override
public String[] getInvalidatedSessions() {
return new String[0];
return EMPTY_STRING_ARRAY;
}

// -------------------------------------------------------- message receive
Expand Down
42 changes: 20 additions & 22 deletions java/org/apache/catalina/ha/tcp/ReplicationValve.java
Original file line number Diff line number Diff line change
Expand Up @@ -306,12 +306,12 @@ public void invoke(Request request, Response response) throws IOException, Servl
}
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);
Expand All @@ -324,7 +324,7 @@ public void invoke(Request request, Response response) throws IOException, Servl
return;
}
if (cluster.hasMembers()) {
sendReplicationMessage(request, totalstart, isCrossContext, clusterManager);
sendReplicationMessage(request, totalstart, isCrossContext, isAsync, clusterManager);
} else {
resetReplicationRequest(request, isCrossContext);
}
Expand Down Expand Up @@ -380,7 +380,7 @@ protected void startInternal() throws LifecycleException {

// --------------------------------------------------------- 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;
Expand All @@ -389,10 +389,7 @@ protected void sendReplicationMessage(Request request, long totalstart, boolean
}
try {
// send invalid sessions
// DeltaManager returns String[0]
if (!(clusterManager instanceof DeltaManager)) {
sendInvalidSessions(clusterManager);
}
sendInvalidSessions(clusterManager);
// send replication
sendSessionReplicationMessage(request, clusterManager);
if (isCrossContext) {
Expand All @@ -403,7 +400,7 @@ protected void sendReplicationMessage(Request request, long totalstart, boolean
log.error(sm.getString("ReplicationValve.send.failure"), x);
} finally {
if (doStatistics()) {
updateStats(totalstart, start);
updateStats(totalstart, start, isAsync);
}
}
}
Expand All @@ -415,8 +412,8 @@ protected void sendCrossContextSession() {
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());
Expand Down Expand Up @@ -557,23 +554,24 @@ protected boolean isRequestWithoutSessionChange(String uri) {
*
* @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()) }));
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@

/**
* 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
Expand Down
7 changes: 7 additions & 0 deletions webapps/docs/changelog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,13 @@
</update>
</changelog>
</subsection>
<subsection name="Cluster">
<changelog>
<fix>
Avoid updating request count stats on async. (remm)
</fix>
</changelog>
</subsection>
</section>
<section name="Tomcat 11.0.0-M17 (markt)" rtext="2024-02-19">
<subsection name="Catalina">
Expand Down

0 comments on commit f63f144

Please sign in to comment.