You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kf...@apache.org on 2010/06/16 13:01:46 UTC

svn commit: r955190 - in /tomcat/trunk/java/org/apache/catalina/ha/session: DeltaManager.java LocalStrings.properties SessionMessage.java SessionMessageImpl.java mbeans-descriptors.xml

Author: kfujino
Date: Wed Jun 16 11:01:45 2010
New Revision: 955190

URL: http://svn.apache.org/viewvc?rev=955190&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/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
    tomcat/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessage.java
    tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java
    tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml

Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java?rev=955190&r1=955189&r2=955190&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Wed Jun 16 11:01:45 2010
@@ -125,22 +125,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();
@@ -218,7 +219,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.
      */
@@ -268,6 +276,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.
@@ -603,6 +618,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)
@@ -1031,7 +1105,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);
@@ -1169,6 +1244,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 ;
@@ -1176,6 +1252,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;
         
     }
    
@@ -1313,6 +1390,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;
@@ -1481,6 +1562,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/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties?rev=955190&r1=955189&r2=955190&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties Wed Jun 16 11:01:45 2010
@@ -55,6 +55,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/trunk/java/org/apache/catalina/ha/session/SessionMessage.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessage.java?rev=955190&r1=955189&r2=955190&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessage.java (original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessage.java Wed Jun 16 11:01:45 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/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java?rev=955190&r1=955189&r2=955190&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java Wed Jun 16 11:01:45 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
@@ -141,6 +143,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/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml?rev=955190&r1=955189&r2=955190&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml (original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml Wed Jun 16 11:01:45 2010
@@ -139,6 +139,11 @@
       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"
@@ -174,6 +179,11 @@
       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="distributable"
       description="The distributable flag for Sessions created by this Manager"
       type="boolean"/>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org