From 2e32d06c808e53c982aa27554ae5d15ed3936551 Mon Sep 17 00:00:00 2001 From: pero Date: Tue, 9 Sep 2008 06:18:32 +0000 Subject: [PATCH] Handle session suffix rewrite with parallel requests from same client git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@693378 13f79535-47bb-0310-9956-ffa450edef68 --- .../catalina/ha/session/JvmRouteBinderValve.java | 68 +++++++++++++++------- webapps/docs/changelog.xml | 3 + 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java b/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java index 8e574a939..14644a2d3 100644 --- a/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java +++ b/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java @@ -35,6 +35,7 @@ import org.apache.catalina.ha.CatalinaCluster; import org.apache.catalina.ha.ClusterManager; import org.apache.catalina.ha.ClusterMessage; import org.apache.catalina.ha.ClusterValve; +import org.apache.catalina.ha.session.DeltaSession; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.session.ManagerBase; @@ -217,8 +218,8 @@ public class JvmRouteBinderValve extends ValveBase implements ClusterValve, Life * @param response current response */ protected void handlePossibleTurnover(Request request, Response response) { - Session session = request.getSessionInternal(false); - if (session != null) { + String sessionID = request.getRequestedSessionId() ; + if (sessionID != null) { long t1 = System.currentTimeMillis(); String jvmRoute = getLocalJvmRoute(request); if (jvmRoute == null) { @@ -226,7 +227,7 @@ public class JvmRouteBinderValve extends ValveBase implements ClusterValve, Life log.debug(sm.getString("jvmRoute.missingJvmRouteAttribute")); return; } - handleJvmRoute( request, response,session.getIdInternal(), jvmRoute); + handleJvmRoute( request, response, sessionID, jvmRoute); if (log.isDebugEnabled()) { long t2 = System.currentTimeMillis(); long time = t2 - t1; @@ -306,23 +307,32 @@ public class JvmRouteBinderValve extends ValveBase implements ClusterValve, Life log.debug(sm.getString("jvmRoute.failover", requestJvmRoute, localJvmRoute, sessionId)); } - // OK - turnover the session ? - String newSessionID = sessionId.substring(0, index) + "." - + localJvmRoute; Session catalinaSession = null; try { catalinaSession = getManager(request).findSession(sessionId); } catch (IOException e) { // Hups! } + String id = sessionId.substring(0, index); + String newSessionID = id + "." + localJvmRoute; + // OK - turnover the session and inform other cluster nodes if (catalinaSession != null) { changeSessionID(request, response, sessionId, newSessionID, catalinaSession); numberOfSessions++; } else { - if (log.isDebugEnabled()) { - log.debug(sm.getString("jvmRoute.cannotFindSession", - sessionId)); + try { + catalinaSession = getManager(request).findSession(newSessionID); + } catch (IOException e) { + // Hups! + } + if (catalinaSession != null) { + // session is rewrite at other request, rewrite this also + changeRequestSessionID(request, response, sessionId, newSessionID); + } else { + if (log.isDebugEnabled()) { + log.debug(sm.getString("jvmRoute.cannotFindSession",sessionId)); + } } } } @@ -344,11 +354,36 @@ public class JvmRouteBinderValve extends ValveBase implements ClusterValve, Life Response response, String sessionId, String newSessionID, Session catalinaSession) { lifecycle.fireLifecycleEvent("Before session migration", catalinaSession); - request.setRequestedSessionId(newSessionID); + // FIXME: setId trigger session Listener, but only chance to registiert manager with correct id! catalinaSession.setId(newSessionID); + // FIXME: Why we remove change data from other running request? + // setId also trigger resetDeltaRequest!! if (catalinaSession instanceof DeltaSession) ((DeltaSession) catalinaSession).resetDeltaRequest(); - if(request.isRequestedSessionIdFromCookie()) setNewSessionCookie(request, response,newSessionID); + changeRequestSessionID(request, response, sessionId, newSessionID); + // now sending the change to all other clusternode! + ClusterManager manager = (ClusterManager)catalinaSession.getManager(); + sendSessionIDClusterBackup(manager,request,sessionId, newSessionID); + lifecycle.fireLifecycleEvent("After session migration", catalinaSession); + if (log.isDebugEnabled()) { + log.debug(sm.getString("jvmRoute.changeSession", sessionId, + newSessionID)); + } + } + + /** + * Change Request Session id + * @param request current request + * @param response current response + * @param sessionId + * original session id + * @param newSessionID + * new session id for node migration + */ + protected void changeRequestSessionID(Request request, Response response, String sessionId, String newSessionID) { + request.setRequestedSessionId(newSessionID); + if(request.isRequestedSessionIdFromCookie()) + setNewSessionCookie(request, response,newSessionID); // set orginal sessionid at request, to allow application detect the // change if (sessionIdAttribute != null && !"".equals(sessionIdAttribute)) { @@ -357,17 +392,8 @@ public class JvmRouteBinderValve extends ValveBase implements ClusterValve, Life } request.setAttribute(sessionIdAttribute, sessionId); } - // now sending the change to all other clusternode! - ClusterManager manager = (ClusterManager)catalinaSession.getManager(); - sendSessionIDClusterBackup(manager,request,sessionId, newSessionID); - lifecycle - .fireLifecycleEvent("After session migration", catalinaSession); - if (log.isDebugEnabled()) { - log.debug(sm.getString("jvmRoute.changeSession", sessionId, - newSessionID)); - } } - + /** * Send the changed Sessionid to all clusternodes. * diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 8bb81a79b..8d6e4fc7f 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -40,6 +40,9 @@ + + Fix that JvmrouteBinderValve can rewrite session suffix with parallel requests from same client (pero) + 671650
45279
Close multicast socket when calling close
-- 2.11.0