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 2011/10/31 11:22:32 UTC

svn commit: r1195393 - in /tomcat/tc7.0.x/trunk: java/org/apache/catalina/ha/session/ webapps/docs/

Author: kfujino
Date: Mon Oct 31 10:22:31 2011
New Revision: 1195393

URL: http://svn.apache.org/viewvc?rev=1195393&view=rev
Log:
When Context manager does not exist, no context manager message is replied in order to avoid timeout (default 60 sec) of GET_ALL_SESSIONS sync phase.

Modified:
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterSessionListener.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterSessionListener.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterSessionListener.java?rev=1195393&r1=1195392&r2=1195393&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterSessionListener.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterSessionListener.java Mon Oct 31 10:22:31 2011
@@ -88,10 +88,22 @@ public class ClusterSessionListener exte
                 }
             } else {
                 ClusterManager mgr = managers.get(ctxname);
-                if (mgr != null)
+                if (mgr != null) {
                     mgr.messageDataReceived(msg);
-                else if (log.isWarnEnabled())
-                    log.warn("Context manager doesn't exist:" + ctxname);
+                } else {
+                    if (log.isWarnEnabled())
+                        log.warn("Context manager doesn't exist:" + ctxname);
+
+                    // A no context manager message is replied in order to avoid 
+                    // timeout of GET_ALL_SESSIONS sync phase.  
+                    if (msg.getEventType() == SessionMessage.EVT_GET_ALL_SESSIONS) {
+                        SessionMessage replymsg = new SessionMessageImpl(ctxname,
+                                SessionMessage.EVT_ALL_SESSION_NOCONTEXTMANAGER, 
+                                null, "NO-CONTEXT-MANAGER","NO-CONTEXT-MANAGER-" + ctxname);
+                        cluster.send(replymsg, msg.getAddress());
+                    }
+                }
+                    
             }
         }
         return;

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java?rev=1195393&r1=1195392&r2=1195393&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Mon Oct 31 10:22:31 2011
@@ -97,6 +97,7 @@ public class DeltaManager extends Cluste
     private boolean notifySessionListenersOnReplication = true;
     private boolean notifyContainerListenersOnReplication  = true;
     private volatile boolean stateTransfered = false ;
+    private volatile boolean noContextManagerReceived = false ;
     private int stateTransferTimeout = 60;
     private boolean sendAllSessions = true;
     private int sendAllSessionsSize = 1000 ;
@@ -122,6 +123,7 @@ public class DeltaManager extends Cluste
     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 counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER = 0 ;
     private long counterSend_EVT_GET_ALL_SESSIONS = 0 ;
     private long counterSend_EVT_ALL_SESSION_DATA = 0 ;
     private long counterSend_EVT_SESSION_CREATED = 0;
@@ -131,6 +133,7 @@ public class DeltaManager extends Cluste
     private int counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ;
     private long counterSend_EVT_CHANGE_SESSION_ID = 0;
     private int counterNoStateTransfered = 0 ;
+    
 
     // ------------------------------------------------------------- Constructor
     public DeltaManager() {
@@ -274,7 +277,14 @@ public class DeltaManager extends Cluste
     public long getCounterReceive_EVT_CHANGE_SESSION_ID() {
         return counterReceive_EVT_CHANGE_SESSION_ID;
     }
-    
+
+    /**
+     * @return Returns the counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER.
+     */
+    public long getCounterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER() {
+        return counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER;
+    }
+
     /**
      * @return Returns the processingTime.
      */
@@ -329,7 +339,15 @@ public class DeltaManager extends Cluste
     public void setStateTransfered(boolean stateTransfered) {
         this.stateTransfered = stateTransfered;
     }
-    
+
+    public boolean isNoContextManagerReceived() {
+        return noContextManagerReceived;
+    }
+
+    public void setNoContextManagerReceived(boolean noContextManagerReceived) {
+        this.noContextManagerReceived = noContextManagerReceived;
+    }
+
     /**
      * @return Returns the sendAllSessionsWaitTime in msec
      */
@@ -898,7 +916,7 @@ public class DeltaManager extends Cluste
                 }
                 reqNow = System.currentTimeMillis();
                 isTimeout = ((reqNow - reqStart) > (1000 * getStateTransferTimeout()));
-            } while ((!getStateTransfered()) && (!isTimeout));
+            } while ((!getStateTransfered()) && (!isTimeout) && (!isNoContextManagerReceived()));
         } else {
             if(getStateTransferTimeout() == -1) {
                 // wait that state is transfered
@@ -907,13 +925,16 @@ public class DeltaManager extends Cluste
                         Thread.sleep(100);
                     } catch (Exception sleep) {
                     }
-                } while ((!getStateTransfered()));
+                } while ((!getStateTransfered())&& (!isNoContextManagerReceived()));
                 reqNow = System.currentTimeMillis();
             }
         }
-        if (isTimeout || (!getStateTransfered())) {
+        if (isTimeout) {
             counterNoStateTransfered++ ;
             log.error(sm.getString("deltaManager.noSessionState",getName(),new Date(beforeSendTime),Long.valueOf(reqNow - beforeSendTime)));
+        }else if (isNoContextManagerReceived()) {
+            if (log.isWarnEnabled())
+                log.warn(sm.getString("deltaManager.noContextManager",getName(),new Date(beforeSendTime),Long.valueOf(reqNow - beforeSendTime)));
         } else {
             if (log.isInfoEnabled())
                 log.info(sm.getString("deltaManager.sessionReceived",getName(), new Date(beforeSendTime), Long.valueOf(reqNow - beforeSendTime)));
@@ -1276,6 +1297,10 @@ public class DeltaManager extends Cluste
                     handleCHANGE_SESSION_ID(msg,sender);
                     break;
                  }
+                case SessionMessage.EVT_ALL_SESSION_NOCONTEXTMANAGER: {
+                    handleALL_SESSION_NOCONTEXTMANAGER(msg,sender);
+                    break;
+                 }
                 default: {
                     //we didn't recognize the message type, do nothing
                     break;
@@ -1460,6 +1485,18 @@ public class DeltaManager extends Cluste
     }
 
     /**
+     * handle receive no context manager.
+     * @param msg
+     * @param sender
+     */
+    protected void handleALL_SESSION_NOCONTEXTMANAGER(SessionMessage msg, Member sender) {
+        counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER++ ;
+        if (log.isDebugEnabled()) 
+            log.debug(sm.getString("deltaManager.receiveMessage.noContextManager",getName(), sender.getHost(), Integer.valueOf(sender.getPort())));
+        noContextManagerReceived = true ;
+    }
+
+    /**
      * send a block of session to sender
      * @param sender
      * @param currentSessions

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties?rev=1195393&r1=1195392&r2=1195393&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties Mon Oct 31 10:22:31 2011
@@ -33,6 +33,7 @@ deltaManager.noCluster=Starting... no cl
 deltaManager.noMasterMember=Starting... with no other member for context [{0}] at domain [{1}]
 deltaManager.noMembers=Manager [{0}]: skipping state transfer. No members active in cluster group.
 deltaManager.noSessionState=Manager [{0}]: No session state send at {1} received, timing out after {2} ms.
+deltaManager.noContextManager=Manager [{0}]: No context manager send at {1} received in {2} ms.
 deltaManager.sendMessage.newSession=Manager [{0}] send new session ({1})
 deltaManager.expireSessions=Manager [{0}] expiring sessions upon shutdown
 deltaManager.receiveMessage.accessed=Manager [{0}]: received session [{1}] accessed.
@@ -42,6 +43,7 @@ deltaManager.receiveMessage.error=Manage
 deltaManager.receiveMessage.eventType=Manager [{0}]: Received SessionMessage of type=({1}) from [{2}]
 deltaManager.receiveMessage.expired=Manager [{0}]: received session [{1}] expired.
 deltaManager.receiveMessage.transfercomplete=Manager [{0}] received from node [{1}:{2}] session state transfered.
+deltaManager.receiveMessage.noContextManager=Manager [{0}] received from node [{1}:{2}] no context manager.
 deltaManager.receiveMessage.unloadingAfter=Manager [{0}]: unloading sessions complete
 deltaManager.receiveMessage.unloadingBegin=Manager [{0}]: start unloading sessions
 deltaManager.receiveMessage.allSessionDataAfter=Manager [{0}]: session state deserialized

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java?rev=1195393&r1=1195392&r2=1195393&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java Mon Oct 31 10:22:31 2011
@@ -33,6 +33,7 @@ import org.apache.catalina.ha.ClusterMes
  *   <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>
+ *   <li><pre>public static final int EVT_ALL_SESSION_NOCONTEXTMANAGER</pre><li>
  * </ul>
  *
  */
@@ -81,6 +82,11 @@ public interface SessionMessage extends 
      */
     public static final int EVT_CHANGE_SESSION_ID = 15;
 
+    /**
+     * Event type used when context manager doesn't exist.
+     * This is used when the manager which send a session state does not exist. 
+     */
+    public static final int EVT_ALL_SESSION_NOCONTEXTMANAGER = 16;
     
     public String getContextName();
     

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java?rev=1195393&r1=1195392&r2=1195393&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java Mon Oct 31 10:22:31 2011
@@ -83,6 +83,9 @@ public class SessionMessageImpl extends 
      *    after GET_ALL_SESSION received from this sender.<BR>
      * <B>EVT_CHANGE_SESSION_ID</B><BR>
      *    send original sessionID and new sessionID.<BR>
+     * <B>EVT_ALL_SESSION_NOCONTEXTMANAGER</B><BR>
+     *    send that context manager does not exist
+     *    after GET_ALL_SESSION received from this sender.<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
@@ -151,6 +154,7 @@ public class SessionMessageImpl extends 
             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";
+            case EVT_ALL_SESSION_NOCONTEXTMANAGER : return "NO-CONTEXT-MANAGER";
             default : return "UNKNOWN-EVENT-TYPE";
         }
     }

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml?rev=1195393&r1=1195392&r2=1195393&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml Mon Oct 31 10:22:31 2011
@@ -151,6 +151,11 @@
       type="long"
       writeable="false"/>
     <attribute
+      name="counterReceive_EVT_ALL_SESSION_NOCONTEXTMANAGER"
+      description="Count receive EVT_ALL_SESSION_NOCONTEXTMANAGER messages"
+      type="long"
+      writeable="false"/>
+    <attribute
       name="counterSend_EVT_GET_ALL_SESSIONS"
       description="Count send EVT_GET_ALL_SESSIONS messages"
       type="long"
@@ -322,6 +327,11 @@
       description="Number of sessions we rejected due to maxActive beeing reached"
       type="int"
       writeable="false"/>
+    <attribute
+      name="noContextManagerReceived"
+      is="true"
+      description="Is no context manager message received? "
+      type="boolean"/>
     <operation
       name="expireSession"
       description="Expired the given session"

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1195393&r1=1195392&r2=1195393&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Mon Oct 31 10:22:31 2011
@@ -230,6 +230,11 @@
         to be observed in the clustering module than the HTTP or AJP NIO
         connector. (markt) 
       </fix>
+      <add>
+        When Context manager does not exist, no context manager message is 
+        replied in order to avoid timeout (default 60sec) of 
+        GET_ALL_SESSIONS sync phase. (kfujino)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Web applications">



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