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 2014/04/03 09:57:38 UTC

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

Author: kfujino
Date: Thu Apr  3 07:57:38 2014
New Revision: 1584275

URL: http://svn.apache.org/r1584275
Log:
Backport r1584267, r1584268, r1584270 and r1584274
Add support for cross context session replication to BackupManager.
This fix is included sevral improvement of cluster manager.

Modified:
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/BackupManager.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.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/DeltaSession.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/BackupManager.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/BackupManager.java?rev=1584275&r1=1584274&r2=1584275&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/BackupManager.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/BackupManager.java Thu Apr  3 07:57:38 2014
@@ -20,12 +20,10 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import org.apache.catalina.Cluster;
 import org.apache.catalina.DistributedManager;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Session;
-import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.ClusterManager;
 import org.apache.catalina.ha.ClusterMessage;
 import org.apache.catalina.tribes.Channel;
@@ -168,16 +166,7 @@ public class BackupManager extends Clust
         super.startInternal();
 
         try {
-            if (getCluster() == null) {
-                Cluster cluster = getContainer().getCluster();
-                if (cluster instanceof CatalinaCluster) {
-                    setCluster((CatalinaCluster)cluster);
-                } else {
-                    throw new LifecycleException(
-                            sm.getString("backupManager.noCluster", getName()));
-                }
-            }
-            cluster.registerManager(this);
+            if (cluster == null) throw new LifecycleException(sm.getString("backupManager.noCluster", getName()));
             LazyReplicatedMap map = new LazyReplicatedMap(this,
                                                           cluster.getChannel(),
                                                           rpcTimeout,
@@ -223,7 +212,6 @@ public class BackupManager extends Clust
             map.breakdown();
         }
 
-        cluster.removeManager(this);
         super.stopInternal();
     }
 

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java?rev=1584275&r1=1584274&r2=1584275&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java Thu Apr  3 07:57:38 2014
@@ -21,12 +21,18 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.regex.Pattern;
 
+import org.apache.catalina.Cluster;
 import org.apache.catalina.Container;
+import org.apache.catalina.LifecycleException;
 import org.apache.catalina.Loader;
+import org.apache.catalina.Valve;
 import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.ClusterManager;
+import org.apache.catalina.ha.tcp.ReplicationValve;
 import org.apache.catalina.session.ManagerBase;
 import org.apache.catalina.tribes.io.ReplicationStream;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
 
 /**
  * 
@@ -35,6 +41,8 @@ import org.apache.catalina.tribes.io.Rep
 public abstract class ClusterManagerBase extends ManagerBase
         implements ClusterManager {
 
+    private final Log log = LogFactory.getLog(ClusterManagerBase.class);
+
     /**
      * A reference to the cluster
      */
@@ -59,6 +67,11 @@ public abstract class ClusterManagerBase
      */
     private Pattern sessionAttributePattern = null;
 
+    /**
+     * cached replication valve cluster container!
+     */
+    private volatile ReplicationValve replicationValve = null ;
+
     /* 
      * @see org.apache.catalina.ha.ClusterManager#getCluster()
      */
@@ -180,7 +193,6 @@ public abstract class ClusterManagerBase
 
     protected void clone(ClusterManagerBase copy) {
         copy.setName("Clone-from-" + getName());
-        copy.setCluster(getCluster());
         copy.setMaxActiveSessions(getMaxActiveSessions());
         copy.setMaxInactiveInterval(getMaxInactiveInterval());
         copy.setSessionIdLength(getSessionIdLength());
@@ -192,4 +204,47 @@ public abstract class ClusterManagerBase
         copy.setSecureRandomAlgorithm(getSecureRandomAlgorithm());
     }
 
+    /**
+     * Register cross context session at replication valve thread local
+     * @param session cross context session
+     */
+    protected void registerSessionAtReplicationValve(DeltaSession session) {
+        if(replicationValve == null) {
+            CatalinaCluster cluster = getCluster() ;
+            if(cluster != null) {
+                Valve[] valves = cluster.getValves();
+                if(valves != null && valves.length > 0) {
+                    for(int i=0; replicationValve == null && i < valves.length ; i++ ){
+                        if(valves[i] instanceof ReplicationValve) replicationValve = (ReplicationValve)valves[i] ;
+                    }//for
+
+                    if(replicationValve == null && log.isDebugEnabled()) {
+                        log.debug("no ReplicationValve found for CrossContext Support");
+                    }//endif 
+                }//end if
+            }//endif
+        }//end if
+        if(replicationValve != null) {
+            replicationValve.registerReplicationSession(session);
+        }
+    }
+
+    @Override
+    protected void startInternal() throws LifecycleException {
+        super.startInternal();
+        if (getCluster() == null) {
+            Cluster cluster = getContainer().getCluster();
+            if (cluster instanceof CatalinaCluster) {
+                setCluster((CatalinaCluster)cluster);
+            }
+        }
+        if (cluster != null) cluster.registerManager(this);
+    }
+
+    @Override
+    protected void stopInternal() throws LifecycleException {
+        if (cluster != null) cluster.removeManager(this);
+        replicationValve = null;
+        super.stopInternal();
+    }
 }

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=1584275&r1=1584274&r2=1584275&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 Thu Apr  3 07:57:38 2014
@@ -26,20 +26,14 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
 
-import org.apache.catalina.Cluster;
-import org.apache.catalina.Container;
 import org.apache.catalina.Context;
 import org.apache.catalina.Engine;
 import org.apache.catalina.Host;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Session;
-import org.apache.catalina.Valve;
-import org.apache.catalina.core.StandardContext;
-import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.ClusterManager;
 import org.apache.catalina.ha.ClusterMessage;
-import org.apache.catalina.ha.tcp.ReplicationValve;
 import org.apache.catalina.session.ManagerBase;
 import org.apache.catalina.tribes.Member;
 import org.apache.catalina.tribes.io.ReplicationStream;
@@ -85,11 +79,6 @@ public class DeltaManager extends Cluste
      */
     protected static String managerName = "DeltaManager";
     protected String name = null;
-
-    /**
-     * cached replication valve cluster container!
-     */
-    private volatile ReplicationValve replicationValve = null ;
     
     private boolean expireSessionsOnShutdown = false;
     private boolean notifySessionListenersOnReplication = true;
@@ -748,20 +737,6 @@ public class DeltaManager extends Cluste
 
         // Load unloaded sessions, if any
         try {
-            //the channel is already running
-            Cluster cluster = getCluster() ;
-            // stop remove cluster binding
-            if(cluster == null) {
-                Container context = getContainer();
-                if (context != null) {
-                    cluster = context.getCluster();
-                    if(cluster instanceof CatalinaCluster) {
-                        setCluster((CatalinaCluster) cluster);
-                    } else {
-                        cluster = null;
-                    }
-                }
-            }
             if (cluster == null) {
                 log.error(sm.getString("deltaManager.noCluster", getName()));
                 return;
@@ -777,9 +752,6 @@ public class DeltaManager extends Cluste
                 }
             }
             if (log.isInfoEnabled()) log.info(sm.getString("deltaManager.startClustering", getName()));
-            //to survice context reloads, as only a stop/start is called, not
-            // createManager
-            cluster.registerManager(this);
 
             getAllClusterSessions();
 
@@ -846,33 +818,6 @@ public class DeltaManager extends Cluste
     }
 
     /**
-     * Register cross context session at replication valve thread local
-     * @param session cross context session
-     */
-    protected void registerSessionAtReplicationValve(DeltaSession session) {
-        if(replicationValve == null) {
-            if(container instanceof StandardContext && ((StandardContext)container).getCrossContext()) {
-                CatalinaCluster cluster = getCluster() ;
-                if(cluster != null) {
-                    Valve[] valves = cluster.getValves();
-                    if(valves != null && valves.length > 0) {
-                        for(int i=0; replicationValve == null && i < valves.length ; i++ ){
-                            if(valves[i] instanceof ReplicationValve) replicationValve = (ReplicationValve)valves[i] ;
-                        }//for
-
-                        if(replicationValve == null && log.isDebugEnabled()) {
-                            log.debug("no ReplicationValve found for CrossContext Support");
-                        }//endif 
-                    }//end if
-                }//endif
-            }//end if
-        }//end if
-        if(replicationValve != null) {
-            replicationValve.registerReplicationSession(session);
-        }
-    }
-    
-    /**
      * Find the master of the session state
      * @return master member of sessions 
      */
@@ -958,9 +903,7 @@ public class DeltaManager extends Cluste
         }
 
         // Require a new random number generator if we are restarted
-        getCluster().removeManager(this);
         super.stopInternal();
-        replicationValve = null;
     }
 
     // -------------------------------------------------------- Replication
@@ -1509,7 +1452,6 @@ public class DeltaManager extends Cluste
     public ClusterManager cloneFromTemplate() {
         DeltaManager result = new DeltaManager();
         clone(result);
-        result.replicationValve = replicationValve;
         result.expireSessionsOnShutdown = expireSessionsOnShutdown;
         result.notifySessionListenersOnReplication = notifySessionListenersOnReplication;
         result.notifyContainerListenersOnReplication = notifyContainerListenersOnReplication;

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaSession.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaSession.java?rev=1584275&r1=1584274&r2=1584275&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaSession.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaSession.java Thu Apr  3 07:57:38 2014
@@ -423,8 +423,8 @@ public class DeltaSession extends Standa
     @Override
     public void endAccess() {
         super.endAccess() ;
-        if(manager instanceof DeltaManager) {
-            ((DeltaManager)manager).registerSessionAtReplicationValve(this);
+        if(manager instanceof ClusterManagerBase) {
+            ((ClusterManagerBase)manager).registerSessionAtReplicationValve(this);
         }
     }
     

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=1584275&r1=1584274&r2=1584275&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Thu Apr  3 07:57:38 2014
@@ -75,6 +75,30 @@
       </fix>
     </changelog>
   </subsection>
+  <subsection name="Cluster">
+    <changelog>
+      <fix>
+        Remove cluster and replicationValve from cluster manager template. These
+        instance are not necessary to template. (kfujino)
+      </fix>
+      <fix>
+        Add support for cross context session replication to
+        <code>org.apache.catalina.ha.session.BackupManager</code>. (kfujino)
+      </fix>
+      <fix>
+        Remove the unnecessary cross context check. It does not matter whether
+        the context that is referenced by other context is set to
+        <code>crossContext</code>=true. The context that refers to the different
+        context must be set to <code>crossContext</code>=true. (kfujino)
+      </fix>
+      <scode>
+        Move to <code>org.apache.catalina.ha.session.ClusterManagerBase</code>
+        common logics of
+        <code>org.apache.catalina.ha.session.BackupManager</code> and
+        <code>org.apache.catalina.ha.session.DeltaManager</code>. (kfujino)
+      </scode>
+    </changelog>
+  </subsection>
   <subsection name="Web applications">
     <changelog>
       <fix>



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