From ad253e9908e9a13cd3fc6fbd5984eabd9dc07687 Mon Sep 17 00:00:00 2001 From: Cousjava Date: Thu, 16 Aug 2018 17:49:02 +0100 Subject: [PATCH] Merge pull request #3048 from Cousjava/PAYARA-2931-memoryleak-persistenmanager PAYARA-2931 Resolved memory leak --- .../apache/catalina/session/FileStore.java | 14 ++++------ .../session/PersistentManagerBase.java | 27 +++++++++++++++---- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/session/FileStore.java b/appserver/web/web-core/src/main/java/org/apache/catalina/session/FileStore.java index 31b5180ed01..eb93d819248 100644 --- a/appserver/web/web-core/src/main/java/org/apache/catalina/session/FileStore.java +++ b/appserver/web/web-core/src/main/java/org/apache/catalina/session/FileStore.java @@ -55,6 +55,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +// Portions Copyright [2018] Payara Foundation and/or affiliates package org.apache.catalina.session; @@ -78,8 +79,8 @@ import java.io.ObjectOutputStream; import java.text.MessageFormat; import java.util.ArrayList; -import java.util.Hashtable; import java.util.ResourceBundle; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -140,7 +141,7 @@ public final class FileStore extends StoreBase { * Our write-through cache of session objects * HERCULES: addition */ - private Hashtable sessions = new Hashtable(); + private final ConcurrentHashMap sessions = new ConcurrentHashMap(); // ------------------------------------------------------------- Properties @@ -346,13 +347,8 @@ public Session load(String id) } try { - StandardSession session = - StandardSession.deserialize(ois, manager); - session.setManager(manager); - //HERCULES: addition - // Put it in the cache - sessions.put(session.getIdInternal(), session); - //HERCULES: addition + StandardSession session = StandardSession.deserialize(ois, manager); + session.setManager(manager); return (session); } finally { // Close the input stream diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/session/PersistentManagerBase.java b/appserver/web/web-core/src/main/java/org/apache/catalina/session/PersistentManagerBase.java index 2c852fb9726..d47b67ab863 100644 --- a/appserver/web/web-core/src/main/java/org/apache/catalina/session/PersistentManagerBase.java +++ b/appserver/web/web-core/src/main/java/org/apache/catalina/session/PersistentManagerBase.java @@ -55,7 +55,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -// Portions Copyright [2016] [Payara Foundation and/or its affiliates] +// Portions Copyright [2016-2018] [Payara Foundation and/or its affiliates] package org.apache.catalina.session; @@ -659,11 +659,20 @@ protected void processInvalidatedSessions() { * aren't too many active sessions, or if there is no limit, * a session is created or retrieved from the recycled pool. * + * @return the new session * @exception IllegalStateException if a new session cannot be * instantiated for any reason */ + @Override public Session createSession() { - + if (((maxActiveSessions >= 0) && (sessions.size() >= maxActiveSessions))) { + if (store == null){ + //too many active sessions and no store + throw new IllegalStateException(rb.getString(LogFacade.CREATE_SESSION_EXCEPTION)); + } + //swap out active sessions to store + processMaxActiveSwaps(); + } return (super.createSession()); } @@ -686,8 +695,16 @@ public Session createSession() { * @return the new session, or null if a session with the * requested id already exists */ + @Override public Session createSession(String sessionId) { - + if (((maxActiveSessions >= 0) && (sessions.size() >= maxActiveSessions))) { + if (store == null){ + //too many active sessions and no store + throw new IllegalStateException(rb.getString(LogFacade.CREATE_SESSION_EXCEPTION)); + } + //swap out active sessions to store + processMaxActiveSwaps(); + } return (super.createSession(sessionId)); } @@ -1336,11 +1353,11 @@ protected void processMaxActiveSwaps() { Session sessions[] = findSessions(); // FIXME: Smarter algorithm (LRU) - if (getMaxActiveSessions() > sessions.length) + if (getMaxActiveSessions() >= sessions.length) return; if(log.isLoggable(Level.FINE)) { - log.log(Level.FINE, LogFacade.TOO_MANY_ACTIVE_SESSION, Integer.valueOf(sessions.length)); + log.log(Level.FINE, LogFacade.TOO_MANY_ACTIVE_SESSION, sessions.length); } int toswap = sessions.length - getMaxActiveSessions(); long timeNow = System.currentTimeMillis();