This is an automated email from the ASF dual-hosted git repository. remm 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 57256efc7f Improve stats thread safety 57256efc7f is described below commit 57256efc7f6a52a7a4c3662c662bf723fb27b17f Author: remm <r...@apache.org> AuthorDate: Mon Jul 7 16:04:06 2025 +0200 Improve stats thread safety Also add a flag to disable them. Found a long time ago by Coverity. --- .../apache/catalina/ha/session/DeltaManager.java | 208 +++++++++++++-------- webapps/docs/changelog.xml | 8 + webapps/docs/config/cluster-manager.xml | 4 + 3 files changed, 144 insertions(+), 76 deletions(-) diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java b/java/org/apache/catalina/ha/session/DeltaManager.java index 81746c26a8..53df6acc43 100644 --- a/java/org/apache/catalina/ha/session/DeltaManager.java +++ b/java/org/apache/catalina/ha/session/DeltaManager.java @@ -23,6 +23,8 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Date; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import org.apache.catalina.Engine; import org.apache.catalina.Host; @@ -76,6 +78,7 @@ public class DeltaManager extends ClusterManagerBase { private int stateTransferTimeout = 60; private boolean sendAllSessions = true; private int sendAllSessionsSize = 1000; + private boolean enableStatistics = true; /** * wait time between send session block (default 2 sec) @@ -88,25 +91,25 @@ public class DeltaManager extends ClusterManagerBase { // -------------------------------------------------------- stats attributes - private volatile long sessionReplaceCounter = 0; - private volatile long counterReceive_EVT_GET_ALL_SESSIONS = 0; - private volatile long counterReceive_EVT_ALL_SESSION_DATA = 0; - private volatile long counterReceive_EVT_SESSION_CREATED = 0; - private volatile long counterReceive_EVT_SESSION_EXPIRED = 0; - private volatile long counterReceive_EVT_SESSION_ACCESSED = 0; - private volatile long counterReceive_EVT_SESSION_DELTA = 0; - private volatile int counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0; - private volatile long counterReceive_EVT_CHANGE_SESSION_ID = 0; - private volatile long counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER = 0; - private volatile long counterSend_EVT_GET_ALL_SESSIONS = 0; - private volatile long counterSend_EVT_ALL_SESSION_DATA = 0; - private volatile long counterSend_EVT_SESSION_CREATED = 0; - private volatile long counterSend_EVT_SESSION_DELTA = 0; - private volatile long counterSend_EVT_SESSION_ACCESSED = 0; - private volatile long counterSend_EVT_SESSION_EXPIRED = 0; - private volatile int counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0; - private volatile long counterSend_EVT_CHANGE_SESSION_ID = 0; - private volatile int counterNoStateTransferred = 0; + private final AtomicLong sessionReplaceCounter = new AtomicLong(0); + private final AtomicLong counterReceive_EVT_GET_ALL_SESSIONS = new AtomicLong(0); + private final AtomicLong counterReceive_EVT_ALL_SESSION_DATA = new AtomicLong(0); + private final AtomicLong counterReceive_EVT_SESSION_CREATED = new AtomicLong(0); + private final AtomicLong counterReceive_EVT_SESSION_EXPIRED = new AtomicLong(0); + private final AtomicLong counterReceive_EVT_SESSION_ACCESSED = new AtomicLong(0); + private final AtomicLong counterReceive_EVT_SESSION_DELTA = new AtomicLong(0); + private final AtomicInteger counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = new AtomicInteger(0); + private final AtomicLong counterReceive_EVT_CHANGE_SESSION_ID = new AtomicLong(0); + private final AtomicLong counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER = new AtomicLong(0); + private final AtomicLong counterSend_EVT_GET_ALL_SESSIONS = new AtomicLong(0); + private final AtomicLong counterSend_EVT_ALL_SESSION_DATA = new AtomicLong(0); + private final AtomicLong counterSend_EVT_SESSION_CREATED = new AtomicLong(0); + private final AtomicLong counterSend_EVT_SESSION_DELTA = new AtomicLong(0); + private final AtomicLong counterSend_EVT_SESSION_ACCESSED = new AtomicLong(0); + private final AtomicLong counterSend_EVT_SESSION_EXPIRED = new AtomicLong(0); + private final AtomicInteger counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = new AtomicInteger(0); + private final AtomicLong counterSend_EVT_CHANGE_SESSION_ID = new AtomicLong(0); + private final AtomicInteger counterNoStateTransferred = new AtomicInteger(0); // ------------------------------------------------------------- Constructor @@ -130,98 +133,98 @@ public class DeltaManager extends ClusterManagerBase { * @return Returns the counterSend_EVT_GET_ALL_SESSIONS. */ public long getCounterSend_EVT_GET_ALL_SESSIONS() { - return counterSend_EVT_GET_ALL_SESSIONS; + return counterSend_EVT_GET_ALL_SESSIONS.get(); } /** * @return Returns the counterSend_EVT_SESSION_ACCESSED. */ public long getCounterSend_EVT_SESSION_ACCESSED() { - return counterSend_EVT_SESSION_ACCESSED; + return counterSend_EVT_SESSION_ACCESSED.get(); } /** * @return Returns the counterSend_EVT_SESSION_CREATED. */ public long getCounterSend_EVT_SESSION_CREATED() { - return counterSend_EVT_SESSION_CREATED; + return counterSend_EVT_SESSION_CREATED.get(); } /** * @return Returns the counterSend_EVT_SESSION_DELTA. */ public long getCounterSend_EVT_SESSION_DELTA() { - return counterSend_EVT_SESSION_DELTA; + return counterSend_EVT_SESSION_DELTA.get(); } /** * @return Returns the counterSend_EVT_SESSION_EXPIRED. */ public long getCounterSend_EVT_SESSION_EXPIRED() { - return counterSend_EVT_SESSION_EXPIRED; + return counterSend_EVT_SESSION_EXPIRED.get(); } /** * @return Returns the counterSend_EVT_ALL_SESSION_DATA. */ public long getCounterSend_EVT_ALL_SESSION_DATA() { - return counterSend_EVT_ALL_SESSION_DATA; + return counterSend_EVT_ALL_SESSION_DATA.get(); } /** * @return Returns the counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE. */ public int getCounterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE() { - return counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE; + return counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE.get(); } /** * @return Returns the counterSend_EVT_CHANGE_SESSION_ID. */ public long getCounterSend_EVT_CHANGE_SESSION_ID() { - return counterSend_EVT_CHANGE_SESSION_ID; + return counterSend_EVT_CHANGE_SESSION_ID.get(); } /** * @return Returns the counterReceive_EVT_ALL_SESSION_DATA. */ public long getCounterReceive_EVT_ALL_SESSION_DATA() { - return counterReceive_EVT_ALL_SESSION_DATA; + return counterReceive_EVT_ALL_SESSION_DATA.get(); } /** * @return Returns the counterReceive_EVT_GET_ALL_SESSIONS. */ public long getCounterReceive_EVT_GET_ALL_SESSIONS() { - return counterReceive_EVT_GET_ALL_SESSIONS; + return counterReceive_EVT_GET_ALL_SESSIONS.get(); } /** * @return Returns the counterReceive_EVT_SESSION_ACCESSED. */ public long getCounterReceive_EVT_SESSION_ACCESSED() { - return counterReceive_EVT_SESSION_ACCESSED; + return counterReceive_EVT_SESSION_ACCESSED.get(); } /** * @return Returns the counterReceive_EVT_SESSION_CREATED. */ public long getCounterReceive_EVT_SESSION_CREATED() { - return counterReceive_EVT_SESSION_CREATED; + return counterReceive_EVT_SESSION_CREATED.get(); } /** * @return Returns the counterReceive_EVT_SESSION_DELTA. */ public long getCounterReceive_EVT_SESSION_DELTA() { - return counterReceive_EVT_SESSION_DELTA; + return counterReceive_EVT_SESSION_DELTA.get(); } /** * @return Returns the counterReceive_EVT_SESSION_EXPIRED. */ public long getCounterReceive_EVT_SESSION_EXPIRED() { - return counterReceive_EVT_SESSION_EXPIRED; + return counterReceive_EVT_SESSION_EXPIRED.get(); } @@ -229,35 +232,35 @@ public class DeltaManager extends ClusterManagerBase { * @return Returns the counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE. */ public int getCounterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE() { - return counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE; + return counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE.get(); } /** * @return Returns the counterReceive_EVT_CHANGE_SESSION_ID. */ public long getCounterReceive_EVT_CHANGE_SESSION_ID() { - return counterReceive_EVT_CHANGE_SESSION_ID; + return counterReceive_EVT_CHANGE_SESSION_ID.get(); } /** * @return Returns the counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER. */ public long getCounterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER() { - return counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER; + return counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER.get(); } /** * @return Returns the sessionReplaceCounter. */ public long getSessionReplaceCounter() { - return sessionReplaceCounter; + return sessionReplaceCounter.get(); } /** * @return Returns the counterNoStateTransferred. */ public int getCounterNoStateTransferred() { - return counterNoStateTransferred; + return counterNoStateTransferred.get(); } public int getReceivedQueueSize() { @@ -391,6 +394,19 @@ public class DeltaManager extends ClusterManagerBase { this.notifyContainerListenersOnReplication = notifyContainerListenersOnReplication; } + /** + * @return the enableStatistics + */ + public boolean getEnableStatistics() { + return this.enableStatistics; + } + + /** + * @param enableStatistics the enableStatistics to set + */ + public void setEnableStatistics(boolean enableStatistics) { + this.enableStatistics = enableStatistics; + } // --------------------------------------------------------- Public Methods @@ -433,7 +449,9 @@ public class DeltaManager extends ClusterManagerBase { log.trace(sm.getString("deltaManager.sendMessage.newSession", name, sessionId)); } msg.setTimestamp(session.getCreationTime()); - counterSend_EVT_SESSION_CREATED++; + if (enableStatistics) { + counterSend_EVT_SESSION_CREATED.incrementAndGet(); + } send(msg); } } @@ -495,7 +513,9 @@ public class DeltaManager extends ClusterManagerBase { SessionMessage msg = new SessionMessageImpl(getName(), SessionMessage.EVT_CHANGE_SESSION_ID, data, orgSessionID, orgSessionID + "-" + System.currentTimeMillis()); msg.setTimestamp(System.currentTimeMillis()); - counterSend_EVT_CHANGE_SESSION_ID++; + if (enableStatistics) { + counterSend_EVT_CHANGE_SESSION_ID.incrementAndGet(); + } send(msg); } catch (IOException e) { log.error(sm.getString("deltaManager.unableSerializeSessionID", newSessionID), e); @@ -573,7 +593,9 @@ public class DeltaManager extends ClusterManagerBase { session.resetDeltaRequest(); // FIXME How inform other session id cache like SingleSignOn if (findSession(session.getIdInternal()) != null) { - sessionReplaceCounter++; + if (enableStatistics) { + sessionReplaceCounter.incrementAndGet(); + } // FIXME better is to grap this sessions again ! if (log.isWarnEnabled()) { log.warn(sm.getString("deltaManager.loading.existing.session", session.getIdInternal())); @@ -684,7 +706,9 @@ public class DeltaManager extends ClusterManagerBase { // set reference time stateTransferCreateSendTime = beforeSendTime; // request session state - counterSend_EVT_GET_ALL_SESSIONS++; + if (enableStatistics) { + counterSend_EVT_GET_ALL_SESSIONS.incrementAndGet(); + } stateTransferred = false; // FIXME This send call block the deploy thread, when sender waitForAck is enabled try { @@ -784,7 +808,9 @@ public class DeltaManager extends ClusterManagerBase { } } if (isTimeout) { - counterNoStateTransferred++; + if (enableStatistics) { + counterNoStateTransferred.incrementAndGet(); + } log.error(sm.getString("deltaManager.noSessionState", getName(), new Date(beforeSendTime), Long.valueOf(reqNow - beforeSendTime))); } else if (isNoContextManagerReceived()) { @@ -893,7 +919,9 @@ public class DeltaManager extends ClusterManagerBase { return null; } if (session.isDirty()) { - counterSend_EVT_SESSION_DELTA++; + if (enableStatistics) { + counterSend_EVT_SESSION_DELTA.incrementAndGet(); + } msg = new SessionMessageImpl(getName(), SessionMessage.EVT_SESSION_DELTA, session.getDiff(), sessionId, sessionId + "-" + System.currentTimeMillis()); } @@ -903,7 +931,9 @@ public class DeltaManager extends ClusterManagerBase { } if (msg == null) { if (!expires && !session.isPrimarySession()) { - counterSend_EVT_SESSION_ACCESSED++; + if (enableStatistics) { + counterSend_EVT_SESSION_ACCESSED.incrementAndGet(); + } msg = new SessionMessageImpl(getName(), SessionMessage.EVT_SESSION_ACCESSED, null, sessionId, sessionId + "-" + System.currentTimeMillis()); if (log.isDebugEnabled()) { @@ -922,7 +952,9 @@ public class DeltaManager extends ClusterManagerBase { if (!expires && (msg == null)) { long replDelta = System.currentTimeMillis() - session.getLastTimeReplicated(); if (session.getMaxInactiveInterval() >= 0 && replDelta > (session.getMaxInactiveInterval() * 1000L)) { - counterSend_EVT_SESSION_ACCESSED++; + if (enableStatistics) { + counterSend_EVT_SESSION_ACCESSED.incrementAndGet(); + } msg = new SessionMessageImpl(getName(), SessionMessage.EVT_SESSION_ACCESSED, null, sessionId, sessionId + "-" + System.currentTimeMillis()); if (log.isDebugEnabled()) { @@ -958,25 +990,25 @@ public class DeltaManager extends ClusterManagerBase { } } rejectedSessions = 0; - sessionReplaceCounter = 0; - counterNoStateTransferred = 0; + sessionReplaceCounter.set(0); + counterNoStateTransferred.set(0); setMaxActive(getActiveSessions()); - counterReceive_EVT_ALL_SESSION_DATA = 0; - counterReceive_EVT_GET_ALL_SESSIONS = 0; - counterReceive_EVT_SESSION_ACCESSED = 0; - counterReceive_EVT_SESSION_CREATED = 0; - counterReceive_EVT_SESSION_DELTA = 0; - counterReceive_EVT_SESSION_EXPIRED = 0; - counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0; - counterReceive_EVT_CHANGE_SESSION_ID = 0; - counterSend_EVT_ALL_SESSION_DATA = 0; - counterSend_EVT_GET_ALL_SESSIONS = 0; - counterSend_EVT_SESSION_ACCESSED = 0; - counterSend_EVT_SESSION_CREATED = 0; - counterSend_EVT_SESSION_DELTA = 0; - counterSend_EVT_SESSION_EXPIRED = 0; - counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0; - counterSend_EVT_CHANGE_SESSION_ID = 0; + counterReceive_EVT_ALL_SESSION_DATA.set(0); + counterReceive_EVT_GET_ALL_SESSIONS.set(0); + counterReceive_EVT_SESSION_ACCESSED.set(0); + counterReceive_EVT_SESSION_CREATED.set(0); + counterReceive_EVT_SESSION_DELTA.set(0); + counterReceive_EVT_SESSION_EXPIRED.set(0); + counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE.set(0); + counterReceive_EVT_CHANGE_SESSION_ID.set(0); + counterSend_EVT_ALL_SESSION_DATA.set(0); + counterSend_EVT_GET_ALL_SESSIONS.set(0); + counterSend_EVT_SESSION_ACCESSED.set(0); + counterSend_EVT_SESSION_CREATED.set(0); + counterSend_EVT_SESSION_DELTA.set(0); + counterSend_EVT_SESSION_EXPIRED.set(0); + counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE.set(0); + counterSend_EVT_CHANGE_SESSION_ID.set(0); } @@ -989,7 +1021,9 @@ public class DeltaManager extends ClusterManagerBase { */ protected void sessionExpired(String id) { if (cluster.getMembers().length > 0) { - counterSend_EVT_SESSION_EXPIRED++; + if (enableStatistics) { + counterSend_EVT_SESSION_EXPIRED.incrementAndGet(); + } SessionMessage msg = new SessionMessageImpl(getName(), SessionMessage.EVT_SESSION_EXPIRED, null, id, id + "-EXPIRED-MSG"); msg.setTimestamp(System.currentTimeMillis()); @@ -1108,7 +1142,9 @@ public class DeltaManager extends ClusterManagerBase { * @param sender Member which sent the message */ protected void handleALL_SESSION_TRANSFERCOMPLETE(SessionMessage msg, Member sender) { - counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE++; + if (enableStatistics) { + counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE.incrementAndGet(); + } if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.receiveMessage.transfercomplete", getName(), sender.getHost(), Integer.valueOf(sender.getPort()))); @@ -1127,7 +1163,9 @@ public class DeltaManager extends ClusterManagerBase { * @throws ClassNotFoundException Serialization error */ protected void handleSESSION_DELTA(SessionMessage msg, Member sender) throws IOException, ClassNotFoundException { - counterReceive_EVT_SESSION_DELTA++; + if (enableStatistics) { + counterReceive_EVT_SESSION_DELTA.incrementAndGet(); + } byte[] delta = msg.getSession(); DeltaSession session = (DeltaSession) findSession(msg.getSessionID()); if (session == null) { @@ -1152,7 +1190,9 @@ public class DeltaManager extends ClusterManagerBase { * @throws IOException Propagated IO error */ protected void handleSESSION_ACCESSED(SessionMessage msg, Member sender) throws IOException { - counterReceive_EVT_SESSION_ACCESSED++; + if (enableStatistics) { + counterReceive_EVT_SESSION_ACCESSED.incrementAndGet(); + } DeltaSession session = (DeltaSession) findSession(msg.getSessionID()); if (session != null) { if (log.isDebugEnabled()) { @@ -1173,7 +1213,9 @@ public class DeltaManager extends ClusterManagerBase { * @throws IOException Propagated IO error */ protected void handleSESSION_EXPIRED(SessionMessage msg, Member sender) throws IOException { - counterReceive_EVT_SESSION_EXPIRED++; + if (enableStatistics) { + counterReceive_EVT_SESSION_EXPIRED.incrementAndGet(); + } DeltaSession session = (DeltaSession) findSession(msg.getSessionID()); if (session != null) { if (log.isDebugEnabled()) { @@ -1190,7 +1232,9 @@ public class DeltaManager extends ClusterManagerBase { * @param sender Member which sent the message */ protected void handleSESSION_CREATED(SessionMessage msg, Member sender) { - counterReceive_EVT_SESSION_CREATED++; + if (enableStatistics) { + counterReceive_EVT_SESSION_CREATED.incrementAndGet(); + } if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.receiveMessage.createNewSession", getName(), msg.getSessionID())); } @@ -1218,7 +1262,9 @@ public class DeltaManager extends ClusterManagerBase { */ protected void handleALL_SESSION_DATA(SessionMessage msg, Member sender) throws ClassNotFoundException, IOException { - counterReceive_EVT_ALL_SESSION_DATA++; + if (enableStatistics) { + counterReceive_EVT_ALL_SESSION_DATA.incrementAndGet(); + } if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.receiveMessage.allSessionDataBegin", getName())); } @@ -1240,7 +1286,9 @@ public class DeltaManager extends ClusterManagerBase { * @throws IOException IO error sending messages */ protected void handleGET_ALL_SESSIONS(SessionMessage msg, Member sender) throws IOException { - counterReceive_EVT_GET_ALL_SESSIONS++; + if (enableStatistics) { + counterReceive_EVT_GET_ALL_SESSIONS.incrementAndGet(); + } // get a list of all the session from this manager if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.receiveMessage.unloadingBegin", getName())); @@ -1277,7 +1325,9 @@ public class DeltaManager extends ClusterManagerBase { if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.createMessage.allSessionTransferred", getName())); } - counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE++; + if (enableStatistics) { + counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE.incrementAndGet(); + } cluster.send(newmsg, sender); } @@ -1290,7 +1340,9 @@ public class DeltaManager extends ClusterManagerBase { * @throws IOException IO error with serialization */ protected void handleCHANGE_SESSION_ID(SessionMessage msg, Member sender) throws IOException { - counterReceive_EVT_CHANGE_SESSION_ID++; + if (enableStatistics) { + counterReceive_EVT_CHANGE_SESSION_ID.incrementAndGet(); + } DeltaSession session = (DeltaSession) findSession(msg.getSessionID()); if (session != null) { String newSessionID = deserializeSessionId(msg.getSession()); @@ -1308,7 +1360,9 @@ public class DeltaManager extends ClusterManagerBase { * @param sender Member which sent the message */ protected void handleALL_SESSION_NOCONTEXTMANAGER(SessionMessage msg, Member sender) { - counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER++; + if (enableStatistics) { + counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER.incrementAndGet(); + } if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.receiveMessage.noContextManager", getName(), sender.getHost(), Integer.valueOf(sender.getPort()))); @@ -1336,7 +1390,9 @@ public class DeltaManager extends ClusterManagerBase { if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.createMessage.allSessionData", getName())); } - counterSend_EVT_ALL_SESSION_DATA++; + if (enableStatistics) { + counterSend_EVT_ALL_SESSION_DATA.incrementAndGet(); + } int sendOptions = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK | Channel.SEND_OPTIONS_USE_ACK; cluster.send(newmsg, sender, sendOptions); } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 3ab0bd6328..d5d2cc16ee 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -105,6 +105,14 @@ issues do not "pop up" wrt. others). --> <section name="Tomcat 11.0.10 (markt)" rtext="in development"> + <subsection name="Cluster"> + <changelog> + <update> + Add <code>enableStatistics</code> configuration attribute for the + <code>DeltaManager</code>, defaulting to <code>true</code>. (remm) + </update> + </changelog> + </subsection> </section> <section name="Tomcat 11.0.9 (markt)" rtext="2025-07-04"> <subsection name="Catalina"> diff --git a/webapps/docs/config/cluster-manager.xml b/webapps/docs/config/cluster-manager.xml index 99bc181985..ac765702d6 100644 --- a/webapps/docs/config/cluster-manager.xml +++ b/webapps/docs/config/cluster-manager.xml @@ -119,6 +119,10 @@ </subsection> <subsection name="org.apache.catalina.ha.session.DeltaManager Attributes"> <attributes> + <attribute name="enableStatistics" required="false"> + Tracks statistics for the session and events of the cluster. + Default value is <code>true</code>. + </attribute> <attribute name="expireSessionsOnShutdown" required="false"> When a web application is being shutdown, Tomcat issues an expire call to each session to notify all the listeners. If you wish for all --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org