Author: rjung Date: Wed Sep 23 11:24:22 2009 New Revision: 818061 URL: http://svn.apache.org/viewvc?rev=818061&view=rev Log: DeltaManager needs to replicate changed attributes even if session gets invalidated. Otherwise session listeners will not see the right data on the secondary nodes.
Ported from r812427 of OACC. Modified: tomcat/tc5.5.x/trunk/STATUS.txt tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaManager.java tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaSession.java tomcat/tc5.5.x/trunk/container/webapps/docs/changelog.xml Modified: tomcat/tc5.5.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc5.5.x/trunk/STATUS.txt?rev=818061&r1=818060&r2=818061&view=diff ============================================================================== --- tomcat/tc5.5.x/trunk/STATUS.txt (original) +++ tomcat/tc5.5.x/trunk/STATUS.txt Wed Sep 23 11:24:22 2009 @@ -94,15 +94,6 @@ +1: markt -1: -* Fix cluster replication problem: session expiration uses a replication - shortcut, so that attributes changed immediately before invalidation do - not get replicated before the expiration replication message. - That's a problem in case a session listener needs the changed attribute. - Patch: http://people.apache.org/~rjung/patches/TC5.5-cluster-replicate-before-expire.patch - This has already been applied to OACC: http://svn.apache.org/viewvc?rev=812427&view=rev - +1: rjung, pero, markt - -1: - * Port r795052 from modules/ha to modules/cluster Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=40551 Enable the JvmRouteBinderValve to work with PersistentManagers as well as clusters Modified: tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaManager.java URL: http://svn.apache.org/viewvc/tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaManager.java?rev=818061&r1=818060&r2=818061&view=diff ============================================================================== --- tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaManager.java (original) +++ tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaManager.java Wed Sep 23 11:24:22 2009 @@ -1308,6 +1308,25 @@ * @return a SessionMessage to be sent, */ public ClusterMessage requestCompleted(String sessionId) { + return requestCompleted(sessionId, false); + } + + /** + * When the request has been completed, the replication valve will notify + * the manager, and the manager will decide whether any replication is + * needed or not. If there is a need for replication, the manager will + * create a session message and that will be replicated. The cluster + * determines where it gets sent. + * + * Session expiration also calls this method, but with expires == true. + * + * @param sessionId - + * the sessionId that just completed. + * @param expires - + * whether this method has been called during session expiration + * @return a SessionMessage to be sent, + */ + public ClusterMessage requestCompleted(String sessionId, boolean expires) { try { DeltaSession session = (DeltaSession) findSession(sessionId); DeltaRequest deltaRequest = session.getDeltaRequest(); @@ -1325,7 +1344,7 @@ } } if(!isDeltaRequest) { - if(!session.isPrimarySession()) { + if(!expires && !session.isPrimarySession()) { counterSend_EVT_SESSION_ACCESSED++; msg = new SessionMessageImpl(getName(), SessionMessage.EVT_SESSION_ACCESSED, null, sessionId, @@ -1343,9 +1362,10 @@ getName(), sessionId)); } } - session.setPrimarySession(true); + if (!expires) + session.setPrimarySession(true); //check to see if we need to send out an access message - if ((msg == null)) { + if (!expires && (msg == null)) { long replDelta = System.currentTimeMillis() - session.getLastTimeReplicated(); if (replDelta >= updateActiveInterval*1000 || Modified: tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaSession.java URL: http://svn.apache.org/viewvc/tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaSession.java?rev=818061&r1=818060&r2=818061&view=diff ============================================================================== --- tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaSession.java (original) +++ tomcat/tc5.5.x/trunk/container/modules/cluster/src/share/org/apache/catalina/cluster/session/DeltaSession.java Wed Sep 23 11:24:22 2009 @@ -49,7 +49,9 @@ import org.apache.catalina.Session; import org.apache.catalina.SessionEvent; import org.apache.catalina.SessionListener; +import org.apache.catalina.cluster.CatalinaCluster; import org.apache.catalina.cluster.ClusterSession; +import org.apache.catalina.cluster.ClusterMessage; import org.apache.catalina.realm.GenericPrincipal; import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.StringManager; @@ -717,6 +719,19 @@ expiring = true; + if(expiredId != null && manager instanceof DeltaManager) { + DeltaManager dmanager = (DeltaManager)manager; + CatalinaCluster cluster = dmanager.getCluster(); + ClusterMessage msg = dmanager.requestCompleted(expiredId, true); + if (msg != null) { + if(dmanager.isSendClusterDomainOnly()) { + cluster.sendClusterDomain(msg); + } else { + cluster.send(msg); + } + } + } + // Notify interested application event listeners // FIXME - Assumes we call listeners in reverse order Context context = (Context) manager.getContainer(); Modified: tomcat/tc5.5.x/trunk/container/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc5.5.x/trunk/container/webapps/docs/changelog.xml?rev=818061&r1=818060&r2=818061&view=diff ============================================================================== --- tomcat/tc5.5.x/trunk/container/webapps/docs/changelog.xml (original) +++ tomcat/tc5.5.x/trunk/container/webapps/docs/changelog.xml Wed Sep 23 11:24:22 2009 @@ -88,6 +88,11 @@ </subsection> <subsection name="Cluster"> <changelog> + <fix> + DeltaManager needs to replicate changed attributes even if session + gets invalidated. Otherwise session listeners will not see the right + data on the secondary nodes. (rjung) + </fix> </changelog> </subsection> <subsection name="Webapps"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org