Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48790
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 9 Mar 2010 22:19:44 +0000 (22:19 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 9 Mar 2010 22:19:44 +0000 (22:19 +0000)
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

java/org/apache/catalina/ha/session/DeltaManager.java
java/org/apache/catalina/session/ManagerBase.java

index 513a750..034710f 100644 (file)
@@ -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;
index c70ea4c..e371248 100644 (file)
@@ -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();
     }