From d46160f68b2fbb36ddecba12c6e620946366b97c Mon Sep 17 00:00:00 2001 From: Felix Schumacher Date: Wed, 14 Mar 2018 14:02:11 +0100 Subject: [PATCH 5/5] Load, validate and reactivate stored sessions only once. --- .../catalina/session/PersistentManagerBase.java | 31 ++++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/java/org/apache/catalina/session/PersistentManagerBase.java b/java/org/apache/catalina/session/PersistentManagerBase.java index 9397192..e2f1ee5 100644 --- a/java/org/apache/catalina/session/PersistentManagerBase.java +++ b/java/org/apache/catalina/session/PersistentManagerBase.java @@ -183,6 +183,8 @@ public abstract class PersistentManagerBase extends ManagerBase */ private final Map sessionSwapInLocks = new HashMap<>(); + private final ThreadLocal sessionToSwapIn = new ThreadLocal<>(); + // ------------------------------------------------------------- Properties @@ -707,18 +709,25 @@ public abstract class PersistentManagerBase extends ManagerBase session = sessions.get(id); if (session == null) { - session = loadSessionFromStore(id); - - if (session != null && !session.isValid()) { - log.error(sm.getString( - "persistentManager.swapInInvalid", id)); - session.expire(); - removeSession(id); - session = null; - } + Session currentSwapInSession = sessionToSwapIn.get(); + try { + if (currentSwapInSession == null || !id.equals(currentSwapInSession.getId())) { + session = loadSessionFromStore(id); + sessionToSwapIn.set(session); + + if (session != null && !session.isValid()) { + log.error(sm.getString("persistentManager.swapInInvalid", id)); + session.expire(); + removeSession(id); + session = null; + } - if (session != null) { - reactivateLoadedSession(id, session); + if (session != null) { + reactivateLoadedSession(id, session); + } + } + } finally { + sessionToSwapIn.remove(); } } } -- 2.7.4