Author: markt Date: Tue Mar 9 22:19:44 2010 New Revision: 921166 URL: http://svn.apache.org/viewvc?rev=921166&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48790 Make maxActive thread safe. Technically a bug but seems like overkill.
Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java?rev=921166&r1=921165&r2=921166&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Tue Mar 9 22:19:44 2010 @@ -1160,7 +1160,7 @@ public class DeltaManager extends Cluste rejectedSessions = 0 ; sessionReplaceCounter = 0 ; counterNoStateTransfered = 0 ; - maxActive = getActiveSessions() ; + setMaxActive(getActiveSessions()); sessionCounter = getActiveSessions() ; counterReceive_EVT_ALL_SESSION_DATA = 0; counterReceive_EVT_GET_ALL_SESSIONS = 0; Modified: tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java?rev=921166&r1=921165&r2=921166&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java (original) +++ tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java Tue Mar 9 22:19:44 2010 @@ -37,6 +37,8 @@ import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.management.MBeanRegistration; import javax.management.MBeanServer; @@ -184,6 +186,7 @@ public abstract class ManagerBase extend protected int sessionCounter=0; protected int maxActive=0; + private final ReadWriteLock maxActiveLock = new ReentrantReadWriteLock(); // number of duplicated session ids - anything >0 means we have problems protected int duplicates=0; @@ -764,8 +767,17 @@ public abstract class ManagerBase extend sessions.put(session.getIdInternal(), session); int size = sessions.size(); - if( size > maxActive ) { - maxActive = size; + + maxActiveLock.readLock().lock(); + if (size > maxActive) { + maxActiveLock.readLock().unlock(); + maxActiveLock.writeLock().lock(); + if (size > maxActive) { + maxActive = size; + } + maxActiveLock.writeLock().unlock(); + } else { + maxActiveLock.readLock().unlock(); } } @@ -1076,12 +1088,17 @@ public abstract class ManagerBase extend * @return The highest number of concurrent active sessions */ public int getMaxActive() { - return maxActive; + maxActiveLock.readLock().lock(); + int result = maxActive; + maxActiveLock.readLock().unlock(); + return result; } public void setMaxActive(int maxActive) { + maxActiveLock.writeLock().lock(); this.maxActive = maxActive; + maxActiveLock.writeLock().unlock(); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org