This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch 10.1.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.1.x by this push: new bc0a08ef3b Refactor to remove syncs for upgraded connections statistics bc0a08ef3b is described below commit bc0a08ef3b3ba9a2a057e927ed9f45fb4a3793a0 Author: remm <r...@apache.org> AuthorDate: Wed Sep 27 15:59:17 2023 +0200 Refactor to remove syncs for upgraded connections statistics Found with coverity, while looking at UpgradeInfo. --- .../coyote/http11/upgrade/UpgradeGroupInfo.java | 63 ++++++++++++---------- webapps/docs/changelog.xml | 4 ++ 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/java/org/apache/coyote/http11/upgrade/UpgradeGroupInfo.java b/java/org/apache/coyote/http11/upgrade/UpgradeGroupInfo.java index 7d729767d8..dc44062461 100644 --- a/java/org/apache/coyote/http11/upgrade/UpgradeGroupInfo.java +++ b/java/org/apache/coyote/http11/upgrade/UpgradeGroupInfo.java @@ -16,8 +16,9 @@ */ package org.apache.coyote.http11.upgrade; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.LongAdder; import org.apache.tomcat.util.modeler.BaseModelMBean; @@ -26,85 +27,89 @@ import org.apache.tomcat.util.modeler.BaseModelMBean; */ public class UpgradeGroupInfo extends BaseModelMBean { - private final List<UpgradeInfo> upgradeInfos = new ArrayList<>(); + private final Set<UpgradeInfo> upgradeInfos = (new ConcurrentHashMap<UpgradeInfo,Boolean>()).keySet(Boolean.TRUE); - private long deadBytesReceived = 0; - private long deadBytesSent = 0; - private long deadMsgsReceived = 0; - private long deadMsgsSent = 0; + private LongAdder deadBytesReceived = new LongAdder(); + private LongAdder deadBytesSent = new LongAdder(); + private LongAdder deadMsgsReceived = new LongAdder(); + private LongAdder deadMsgsSent = new LongAdder(); - public synchronized void addUpgradeInfo(UpgradeInfo ui) { + public void addUpgradeInfo(UpgradeInfo ui) { upgradeInfos.add(ui); } - public synchronized void removeUpgradeInfo(UpgradeInfo ui) { + public void removeUpgradeInfo(UpgradeInfo ui) { if (ui != null) { - deadBytesReceived += ui.getBytesReceived(); - deadBytesSent += ui.getBytesSent(); - deadMsgsReceived += ui.getMsgsReceived(); - deadMsgsSent += ui.getMsgsSent(); + deadBytesReceived.add(ui.getBytesReceived()); + deadBytesSent.add(ui.getBytesSent()); + deadMsgsReceived.add(ui.getMsgsReceived()); + deadMsgsSent.add(ui.getMsgsSent()); upgradeInfos.remove(ui); } } - public synchronized long getBytesReceived() { - long bytes = deadBytesReceived; + public long getBytesReceived() { + long bytes = deadBytesReceived.longValue(); for (UpgradeInfo ui : upgradeInfos) { bytes += ui.getBytesReceived(); } return bytes; } - public synchronized void setBytesReceived(long bytesReceived) { - deadBytesReceived = bytesReceived; + public void setBytesReceived(long bytesReceived) { + deadBytesReceived.reset(); + deadBytesReceived.add(bytesReceived); for (UpgradeInfo ui : upgradeInfos) { ui.setBytesReceived(bytesReceived); } } - public synchronized long getBytesSent() { - long bytes = deadBytesSent; + public long getBytesSent() { + long bytes = deadBytesSent.longValue(); for (UpgradeInfo ui : upgradeInfos) { bytes += ui.getBytesSent(); } return bytes; } - public synchronized void setBytesSent(long bytesSent) { - deadBytesSent = bytesSent; + public void setBytesSent(long bytesSent) { + deadBytesSent.reset(); + deadBytesSent.add(bytesSent); for (UpgradeInfo ui : upgradeInfos) { ui.setBytesSent(bytesSent); } } - public synchronized long getMsgsReceived() { - long msgs = deadMsgsReceived; + public long getMsgsReceived() { + long msgs = deadMsgsReceived.longValue(); for (UpgradeInfo ui : upgradeInfos) { msgs += ui.getMsgsReceived(); } return msgs; } - public synchronized void setMsgsReceived(long msgsReceived) { - deadMsgsReceived = msgsReceived; + public void setMsgsReceived(long msgsReceived) { + deadMsgsReceived.reset(); + deadMsgsReceived.add(msgsReceived); for (UpgradeInfo ui : upgradeInfos) { ui.setMsgsReceived(msgsReceived); } } - public synchronized long getMsgsSent() { - long msgs = deadMsgsSent; + public long getMsgsSent() { + long msgs = deadMsgsSent.longValue(); for (UpgradeInfo ui : upgradeInfos) { msgs += ui.getMsgsSent(); } return msgs; } - public synchronized void setMsgsSent(long msgsSent) { - deadMsgsSent = msgsSent; + public void setMsgsSent(long msgsSent) { + deadMsgsSent.reset(); + deadMsgsSent.add(msgsSent); for (UpgradeInfo ui : upgradeInfos) { ui.setMsgsSent(msgsSent); } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 97b59d4688..7ec749186b 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -156,6 +156,10 @@ <fix> Avoid rare thread safety issue accessing message digest map. (remm) </fix> + <fix> + Improve statistics collection for upgraded connections under load. + (remm) + </fix> </changelog> </subsection> <subsection name="Jasper"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org