From 2957ec0d619c7d29a0d213dcfdf99e9fe5e4fd70 Mon Sep 17 00:00:00 2001 From: markt Date: Tue, 9 Mar 2010 22:19:44 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48790 Make maxActive thread safe. Technically a bug but seems like overkill. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@921166 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/catalina/ha/session/DeltaManager.java | 2 +- java/org/apache/catalina/session/ManagerBase.java | 23 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java b/java/org/apache/catalina/ha/session/DeltaManager.java index 513a75068..034710fd2 100644 --- a/java/org/apache/catalina/ha/session/DeltaManager.java +++ b/java/org/apache/catalina/ha/session/DeltaManager.java @@ -1160,7 +1160,7 @@ public class DeltaManager extends ClusterManagerBase{ rejectedSessions = 0 ; sessionReplaceCounter = 0 ; counterNoStateTransfered = 0 ; - maxActive = getActiveSessions() ; + setMaxActive(getActiveSessions()); sessionCounter = getActiveSessions() ; counterReceive_EVT_ALL_SESSION_DATA = 0; counterReceive_EVT_GET_ALL_SESSIONS = 0; diff --git a/java/org/apache/catalina/session/ManagerBase.java b/java/org/apache/catalina/session/ManagerBase.java index c70ea4cf8..e37124876 100644 --- a/java/org/apache/catalina/session/ManagerBase.java +++ b/java/org/apache/catalina/session/ManagerBase.java @@ -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 extends LifecycleBase 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 extends LifecycleBase 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 extends LifecycleBase * @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(); } -- 2.11.0