Author: kfujino Date: Tue Jun 22 10:09:14 2010 New Revision: 956838 URL: http://svn.apache.org/viewvc?rev=956838&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49445 The change in session ID is notified to other node.
Modified: tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc6.0.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=956838&r1=956837&r2=956838&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Tue Jun 22 10:09:14 2010 @@ -137,12 +137,6 @@ PATCHES PROPOSED TO BACKPORT: +1: kkolinko, markt -1: -* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49445 - The change in session ID is notified to other node. - http://svn.apache.org/viewvc?view=revision&revision=955190 - +1: kfujino, markt, rjung - -1: - * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49443 Use remoteIpHeader rather then remoteIPHeader consistently http://people.apache.org/~markt/patches/2010-06-18-bug49443-tc6.patch Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java?rev=956838&r1=956837&r2=956838&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Tue Jun 22 10:09:14 2010 @@ -133,22 +133,23 @@ public class DeltaManager extends Cluste private long sessionReplaceCounter = 0 ; long processingTime = 0; private long counterReceive_EVT_GET_ALL_SESSIONS = 0 ; - private long counterSend_EVT_ALL_SESSION_DATA = 0 ; private long counterReceive_EVT_ALL_SESSION_DATA = 0 ; private long counterReceive_EVT_SESSION_CREATED = 0 ; private long counterReceive_EVT_SESSION_EXPIRED = 0; private long counterReceive_EVT_SESSION_ACCESSED = 0 ; private long counterReceive_EVT_SESSION_DELTA = 0; + private int counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ; + private long counterReceive_EVT_CHANGE_SESSION_ID = 0 ; private long counterSend_EVT_GET_ALL_SESSIONS = 0 ; + private long counterSend_EVT_ALL_SESSION_DATA = 0 ; private long counterSend_EVT_SESSION_CREATED = 0; private long counterSend_EVT_SESSION_DELTA = 0 ; private long counterSend_EVT_SESSION_ACCESSED = 0; private long counterSend_EVT_SESSION_EXPIRED = 0; private int counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ; - private int counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ; + private long counterSend_EVT_CHANGE_SESSION_ID = 0; private int counterNoStateTransfered = 0 ; - // ------------------------------------------------------------- Constructor public DeltaManager() { super(); @@ -224,7 +225,14 @@ public class DeltaManager extends Cluste public int getCounterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE() { return counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE; } - + + /** + * @return Returns the counterSend_EVT_CHANGE_SESSION_ID. + */ + public long getCounterSend_EVT_CHANGE_SESSION_ID() { + return counterSend_EVT_CHANGE_SESSION_ID; + } + /** * @return Returns the counterReceive_EVT_ALL_SESSION_DATA. */ @@ -274,6 +282,13 @@ public class DeltaManager extends Cluste public int getCounterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE() { return counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE; } + + /** + * @return Returns the counterReceive_EVT_CHANGE_SESSION_ID. + */ + public long getCounterReceive_EVT_CHANGE_SESSION_ID() { + return counterReceive_EVT_CHANGE_SESSION_ID; + } /** * @return Returns the processingTime. @@ -605,6 +620,65 @@ public class DeltaManager extends Cluste } /** + * Change the session ID of the current session to a new randomly generated + * session ID. + * + * @param session The session to change the session ID for + */ + @Override + public void changeSessionId(Session session) { + changeSessionId(session, true); + } + + public void changeSessionId(Session session, boolean notify) { + // original sessionID + String orgSessionID = session.getId(); + super.changeSessionId(session); + if (notify) { + // changed sessionID + String newSessionID = session.getId(); + try { + // serialize sessionID + byte[] data = serializeSessionId(newSessionID); + // notify change sessionID + SessionMessage msg = new SessionMessageImpl(getName(), + SessionMessage.EVT_CHANGE_SESSION_ID, data, + orgSessionID, orgSessionID + "-" + + System.currentTimeMillis()); + counterSend_EVT_CHANGE_SESSION_ID++; + send(msg); + } catch (IOException e) { + log.error(sm.getString("deltaManager.unableSerializeSessionID", + newSessionID), e); + } + } + } + + /** + * serialize sessionID + * @throws IOException if an input/output error occurs + */ + protected byte[] serializeSessionId(String sessionId) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeUTF(sessionId); + oos.flush(); + oos.close(); + return bos.toByteArray(); + } + + /** + * Load sessionID + * @throws IOException if an input/output error occurs + */ + protected String deserializeSessionId(byte[] data) throws IOException { + ReplicationStream ois = getReplicationStream(data); + String sessionId = ois.readUTF(); + ois.close(); + return sessionId; + } + + /** * Load Deltarequest from external node * Load the Class at container classloader * @see DeltaRequest#readExternal(java.io.ObjectInput) @@ -1078,7 +1152,8 @@ public class DeltaManager extends Cluste case SessionMessage.EVT_SESSION_CREATED: case SessionMessage.EVT_SESSION_EXPIRED: case SessionMessage.EVT_SESSION_ACCESSED: - case SessionMessage.EVT_SESSION_DELTA: { + case SessionMessage.EVT_SESSION_DELTA: + case SessionMessage.EVT_CHANGE_SESSION_ID: { synchronized(receivedMessageQueue) { if(receiverQueue) { receivedMessageQueue.add(msg); @@ -1216,6 +1291,7 @@ public class DeltaManager extends Cluste counterReceive_EVT_SESSION_DELTA = 0 ; counterReceive_EVT_SESSION_EXPIRED = 0 ; counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0; + counterReceive_EVT_CHANGE_SESSION_ID = 0; counterSend_EVT_ALL_SESSION_DATA = 0; counterSend_EVT_GET_ALL_SESSIONS = 0; counterSend_EVT_SESSION_ACCESSED = 0 ; @@ -1223,6 +1299,7 @@ public class DeltaManager extends Cluste counterSend_EVT_SESSION_DELTA = 0 ; counterSend_EVT_SESSION_EXPIRED = 0 ; counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0; + counterSend_EVT_CHANGE_SESSION_ID = 0; } @@ -1360,6 +1437,10 @@ public class DeltaManager extends Cluste handleSESSION_DELTA(msg,sender); break; } + case SessionMessage.EVT_CHANGE_SESSION_ID: { + handleCHANGE_SESSION_ID(msg,sender); + break; + } default: { //we didn't recognize the message type, do nothing break; @@ -1528,6 +1609,24 @@ public class DeltaManager extends Cluste cluster.send(newmsg, sender); } + /** + * handle receive change sessionID at other node + * @param msg + * @param sender + * @throws IOException + */ + protected void handleCHANGE_SESSION_ID(SessionMessage msg,Member sender) throws IOException { + counterReceive_EVT_CHANGE_SESSION_ID++; + DeltaSession session = (DeltaSession) findSession(msg.getSessionID()); + String newSessionID = deserializeSessionId(msg.getSession()); + session.setPrimarySession(false); + if(notifySessionListenersOnReplication) { + session.setId(newSessionID); + } else { + session.setIdInternal(newSessionID); + add(session); + } + } /** * send a block of session to sender Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties?rev=956838&r1=956837&r2=956838&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties Tue Jun 22 10:09:14 2010 @@ -56,6 +56,7 @@ deltaManager.startClustering=Starting cl deltaManager.stopped=Manager [{0}] is stopping deltaManager.unloading.ioe=IOException while saving persisted sessions: {0} deltaManager.waitForSessionState=Manager [{0}], requesting session state from {1}. This operation will timeout if no session state has been received within {2} seconds. +deltaManager.unableSerializeSessionID =Unable to serialize sessionID [{0}] deltaRequest.showPrincipal=Principal [{0}] is set to session {1} deltaRequest.wrongPrincipalClass=DeltaManager only support GenericPrincipal. Your realm used principal class {0}. deltaSession.notifying=Notifying cluster of expiration primary={0} sessionId [{1}] Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java?rev=956838&r1=956837&r2=956838&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java Tue Jun 22 10:09:14 2010 @@ -26,15 +26,13 @@ import org.apache.catalina.ha.ClusterMes * The following events are currently available: * <ul> * <li><pre>public static final int EVT_SESSION_CREATED</pre><li> + * <li><pre>public static final int EVT_SESSION_EXPIRED</pre><li> * <li><pre>public static final int EVT_SESSION_ACCESSED</pre><li> - * <li><pre>public static final int EVT_ATTRIBUTE_ADDED</pre><li> - * <li><pre>public static final int EVT_ATTRIBUTE_REMOVED</pre><li> - * <li><pre>public static final int EVT_SESSION_EXPIRED_WONOTIFY</pre><li> - * <li><pre>public static final int EVT_SESSION_EXPIRED_WNOTIFY</pre><li> * <li><pre>public static final int EVT_GET_ALL_SESSIONS</pre><li> - * <li><pre>public static final int EVT_SET_USER_PRINCIPAL</pre><li> - * <li><pre>public static final int EVT_SET_SESSION_NOTE</pre><li> - * <li><pre>public static final int EVT_REMOVE_SESSION_NOTE</pre><li> + * <li><pre>public static final int EVT_SESSION_DELTA</pre><li> + * <li><pre>public static final int EVT_ALL_SESSION_DATA</pre><li> + * <li><pre>public static final int EVT_ALL_SESSION_TRANSFERCOMPLETE</pre><li> + * <li><pre>public static final int EVT_CHANGE_SESSION_ID</pre><li> * </ul> * */ @@ -78,7 +76,11 @@ public interface SessionMessage extends * When a session state is complete transferred, this is the event. */ public static final int EVT_ALL_SESSION_TRANSFERCOMPLETE = 14; - + + /** + * Event type used when a sessionID has been changed. + */ + public static final int EVT_CHANGE_SESSION_ID = 15; public String getContextName(); Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java?rev=956838&r1=956837&r2=956838&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java Tue Jun 22 10:09:14 2010 @@ -69,8 +69,8 @@ public class SessionMessageImpl extends * The parameters: sessionID must be set.<BR> * <B>EVT_SESSION_ACCESSED</B><BR> * The parameters: sessionID must be set.<BR> - * <B>EVT_SESSION_EXPIRED_XXXX</B><BR> - * The parameters: sessionID must be set.<BR> + * <B>EVT_GET_ALL_SESSIONS</B><BR> + * get all sessions from from one of the nodes.<BR> * <B>EVT_SESSION_DELTA</B><BR> * Send attribute delta (add,update,remove attribute or principal, ...).<BR> * <B>EVT_ALL_SESSION_DATA</B><BR> @@ -78,6 +78,8 @@ public class SessionMessageImpl extends * <B>EVT_ALL_SESSION_TRANSFERCOMPLETE</B><BR> * send that all session state information are transfered * after GET_ALL_SESSION received from this sender.<BR> + * <B>EVT_CHANGE_SESSION_ID</B><BR> + * send original sessionID and new sessionID.<BR> * @param contextName - the name of the context (application * @param eventtype - one of the 8 event type defined in this class * @param session - the serialized byte array of the session itself @@ -139,6 +141,7 @@ public class SessionMessageImpl extends case EVT_SESSION_DELTA : return "SESSION-DELTA"; case EVT_ALL_SESSION_DATA : return "ALL-SESSION-DATA"; case EVT_ALL_SESSION_TRANSFERCOMPLETE : return "SESSION-STATE-TRANSFERED"; + case EVT_CHANGE_SESSION_ID : return "SESSION-ID-CHANGED"; default : return "UNKNOWN-EVENT-TYPE"; } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml?rev=956838&r1=956837&r2=956838&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml Tue Jun 22 10:09:14 2010 @@ -223,6 +223,11 @@ created by this Manager" type="long" writeable="false"/> <attribute + name="counterReceive_EVT_CHANGE_SESSION_ID" + description="Count receive EVT_CHANGE_SESSION_ID messages" + type="long" + writeable="false"/> + <attribute name="counterSend_EVT_GET_ALL_SESSIONS" description="Count send EVT_GET_ALL_SESSIONS messages" type="long" @@ -258,6 +263,11 @@ created by this Manager" type="long" writeable="false"/> <attribute + name="counterSend_EVT_CHANGE_SESSION_ID" + description="Count send EVT_CHANGE_SESSION_ID messages" + type="long" + writeable="false"/> + <attribute name="counterNoStateTransfered" description="Count the failed session transfers noStateTransfered" type="int" Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=956838&r1=956837&r2=956838&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Tue Jun 22 10:09:14 2010 @@ -48,6 +48,15 @@ </fix> </changelog> </subsection> + <subsection name="Cluster"> + <changelog> + <fix> + <bug>49445</bug>: When session ID is changed after authentication, + ensure the DeltaManager replicates the change in ID to the other nodes + in the cluster. (kfujino) + </fix> + </changelog> + </subsection> <subsection name="Webapps"> <changelog> <fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org