From: markt Date: Wed, 17 Nov 2010 23:36:25 +0000 (+0000) Subject: Narrow the manager-wide sync X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=8a72ee3c3cf5ed3328ee0cefb9585aaf32b96041;p=tomcat7.0 Narrow the manager-wide sync git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1036286 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/session/ManagerBase.java b/java/org/apache/catalina/session/ManagerBase.java index f92d2e4ba..0c914ec4b 100644 --- a/java/org/apache/catalina/session/ManagerBase.java +++ b/java/org/apache/catalina/session/ManagerBase.java @@ -179,7 +179,8 @@ public abstract class ManagerBase extends LifecycleMBeanBase /** * The longest time (in seconds) that an expired session had been alive. */ - protected int sessionMaxAliveTime; + protected volatile int sessionMaxAliveTime; + private final Object sessionMaxAliveTimeUpdateLock = new Object(); /** @@ -1009,10 +1010,8 @@ public abstract class ManagerBase extends LifecycleMBeanBase if (!session.isValid()) { long timeNow = System.currentTimeMillis(); int timeAlive = (int) ((timeNow - session.getCreationTime())/1000); + updateSessionMaxAliveTime(timeAlive); synchronized (this) { - if (timeAlive > getSessionMaxAliveTime()) { - setSessionMaxAliveTime(timeAlive); - } long numExpired = getExpiredSessions(); numExpired++; setExpiredSessions(numExpired); @@ -1291,18 +1290,37 @@ public abstract class ManagerBase extends LifecycleMBeanBase /** * Sets the longest time (in seconds) that an expired session had been - * alive. + * alive. Typically used for resetting the current value. * * @param sessionMaxAliveTime Longest time (in seconds) that an expired * session had been alive. */ @Override public void setSessionMaxAliveTime(int sessionMaxAliveTime) { - this.sessionMaxAliveTime = sessionMaxAliveTime; + synchronized (sessionMaxAliveTimeUpdateLock) { + this.sessionMaxAliveTime = sessionMaxAliveTime; + } } /** + * Updates the sessionMaxAliveTime attribute if the candidate value is + * larger than the current value. + * + * @param sessionAliveTime The candidate value (in seconds) for the new + * sessionMaxAliveTime value. + */ + public void updateSessionMaxAliveTime(int sessionAliveTime) { + if (sessionAliveTime > this.sessionMaxAliveTime) { + synchronized (sessionMaxAliveTimeUpdateLock) { + if (sessionAliveTime > this.sessionMaxAliveTime) { + this.sessionMaxAliveTime = sessionAliveTime; + } + } + } + } + + /** * Gets the average time (in seconds) that expired sessions had been * alive. *