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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org