Author: markt Date: Wed Mar 3 22:46:14 2010 New Revision: 918746 URL: http://svn.apache.org/viewvc?rev=918746&view=rev Log: Backport: Handle session suffix rewrite at JvmRouteBinderValve with parallel requests from same client (pero) Should have been applied at the same time o.a.c.cluster.session.JvMRouteBinderValve was patched
Modified: tomcat/tc5.5.x/trunk/container/modules/ha/src/share/org/apache/catalina/ha/session/JvmRouteBinderValve.java Modified: tomcat/tc5.5.x/trunk/container/modules/ha/src/share/org/apache/catalina/ha/session/JvmRouteBinderValve.java URL: http://svn.apache.org/viewvc/tomcat/tc5.5.x/trunk/container/modules/ha/src/share/org/apache/catalina/ha/session/JvmRouteBinderValve.java?rev=918746&r1=918745&r2=918746&view=diff ============================================================================== --- tomcat/tc5.5.x/trunk/container/modules/ha/src/share/org/apache/catalina/ha/session/JvmRouteBinderValve.java (original) +++ tomcat/tc5.5.x/trunk/container/modules/ha/src/share/org/apache/catalina/ha/session/JvmRouteBinderValve.java Wed Mar 3 22:46:14 2010 @@ -35,6 +35,7 @@ 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; @@ -235,16 +236,19 @@ * @param response current response */ protected void handlePossibleTurnover(Request request, Response response) { - Session session = request.getSessionInternal(false); - if (session != null) { - long t1 = System.currentTimeMillis(); + String sessionID = request.getRequestedSessionId() ; + if (sessionID != null) { + long t1 = 0 ; + if (log.isDebugEnabled()) { + t1 = System.currentTimeMillis(); + } String jvmRoute = getLocalJvmRoute(request); if (jvmRoute == null) { if (log.isWarnEnabled()) log.warn(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; @@ -324,23 +328,32 @@ 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)); + } } } } @@ -362,20 +375,14 @@ 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); - // set orginal sessionid at request, to allow application detect the - // change - if (sessionIdAttribute != null && !"".equals(sessionIdAttribute)) { - if (log.isDebugEnabled()) { - log.debug(sm.getString("jvmRoute.set.orignalsessionid",sessionIdAttribute,sessionId)); - } - request.setAttribute(sessionIdAttribute, sessionId); - } - + changeRequestSessionID(request, response, sessionId, newSessionID); + if (getCluster() != null) { // now sending the change to all other clusternode! ClusterManager manager = (ClusterManager)catalinaSession.getManager(); @@ -386,6 +393,29 @@ 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)) { + if (log.isDebugEnabled()) { + log.debug(sm.getString("jvmRoute.set.orignalsessionid",sessionIdAttribute,sessionId)); + } + request.setAttribute(sessionIdAttribute, sessionId); } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org