You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by rj...@apache.org on 2009/09/23 13:28:14 UTC

svn commit: r818062 - in /tomcat/trunk/java/org/apache/catalina/ha/session: DeltaManager.java DeltaSession.java

Author: rjung
Date: Wed Sep 23 11:28:14 2009
New Revision: 818062

URL: http://svn.apache.org/viewvc?rev=818062&view=rev
Log:
DeltaManager needs to replicate changed attributes even if session
gets invalidated. Otherwise session listeners will not see the right
data on the secondary nodes.

Port of r818061 from TC 5.5.x.

Modified:
    tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
    tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java

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=818062&r1=818061&r2=818062&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Wed Sep 23 11:28:14 2009
@@ -1108,6 +1108,25 @@
      * @return a SessionMessage to be sent,
      */
     public ClusterMessage requestCompleted(String sessionId) {
+         return requestCompleted(sessionId, false);
+     }
+
+     /**
+      * When the request has been completed, the replication valve will notify
+      * the manager, and the manager will decide whether any replication is
+      * needed or not. If there is a need for replication, the manager will
+      * create a session message and that will be replicated. The cluster
+      * determines where it gets sent.
+      * 
+      * Session expiration also calls this method, but with expires == true.
+      * 
+      * @param sessionId -
+      *            the sessionId that just completed.
+      * @param expires -
+      *            whether this method has been called during session expiration
+      * @return a SessionMessage to be sent,
+      */
+     public ClusterMessage requestCompleted(String sessionId, boolean expires) {
         DeltaSession session = null;
         try {
             session = (DeltaSession) findSession(sessionId);
@@ -1129,7 +1148,7 @@
                 }  
             }
             if(!isDeltaRequest) {
-                if(!session.isPrimarySession()) {               
+                if(!expires && !session.isPrimarySession()) {
                     counterSend_EVT_SESSION_ACCESSED++;
                     msg = new SessionMessageImpl(getName(),
                                                  SessionMessage.EVT_SESSION_ACCESSED, 
@@ -1145,9 +1164,10 @@
                     log.debug(sm.getString("deltaManager.createMessage.delta",getName(), sessionId));
                 }
             }
-            session.setPrimarySession(true);
+            if (!expires)
+                session.setPrimarySession(true);
             //check to see if we need to send out an access message
-            if ((msg == null)) {
+            if (!expires && (msg == null)) {
                 long replDelta = System.currentTimeMillis() - session.getLastTimeReplicated();
                 if (replDelta > (getMaxInactiveInterval() * 1000)) {
                     counterSend_EVT_SESSION_ACCESSED++;

Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java?rev=818062&r1=818061&r2=818062&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java (original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java Wed Sep 23 11:28:14 2009
@@ -38,7 +38,9 @@
 import org.apache.catalina.Manager;
 import org.apache.catalina.SessionListener;
 import org.apache.catalina.ha.ClusterManager;
+import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.ClusterSession;
+import org.apache.catalina.ha.ClusterMessage;
 import org.apache.catalina.realm.GenericPrincipal;
 import org.apache.catalina.session.StandardSession;
 import org.apache.catalina.tribes.io.ReplicationStream;
@@ -373,7 +375,24 @@
     }
 
     public void expire(boolean notify, boolean notifyCluster) {
+        if (expiring)
+            return;
         String expiredId = getIdInternal();
+
+        if(expiredId != null && manager != null &&
+           manager instanceof DeltaManager) {
+            DeltaManager dmanager = (DeltaManager)manager;
+            CatalinaCluster cluster = dmanager.getCluster();
+            ClusterMessage msg = dmanager.requestCompleted(expiredId, true);
+            if (msg != null) {
+                if(dmanager.doDomainReplication()) {
+                    cluster.sendClusterDomain(msg);
+                } else {
+                    cluster.send(msg);
+                }
+            }
+        }
+
         super.expire(notify);
 
         if (notifyCluster) {



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


Re: Port r818062 to BackupManager?

Posted by Rainer Jung <ra...@kippdata.de>.
On 23.09.2009 16:17, Filip Hanik - Dev Lists wrote:
> hi Rainer,
> 
>> DeltaManager needs to replicate changed attributes even if session
>> gets invalidated. Otherwise session listeners will not see the right
>> data on the secondary nodes.
> 
> This is an interesting use case indeed. The fact that we would replicate
> changes on an invalidated session sounds awkward.
> I will have to take a look when I have some more brain capacity

Yeah the change happens immediately before invalidation, but a session
listener needs the changed attribute. Sure it's a rare case, but it
should work. session.expire() without requestCompleted() was a nice
shortcut, but seems slightly incorrect.

Concerning brains:

http://www.flickr.com/photos/untergeek/8454334/

and while I was looking for it I also stumbled over a cartoon Gary
Larson did about Apache:

http://z.hubpages.com/u/209660_f520.jpg

Regards,

Rainer

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


Re: Port r818062 to BackupManager?

Posted by Filip Hanik - Dev Lists <de...@hanik.com>.
hi Rainer,

>DeltaManager needs to replicate changed attributes even if session
>gets invalidated. Otherwise session listeners will not see the right
>data on the secondary nodes.

This is an interesting use case indeed. The fact that we would replicate changes on an invalidated session sounds awkward.
I will have to take a look when I have some more brain capacity

Filip



On 09/23/2009 06:18 AM, Rainer Jung wrote:
> Hi Filip,
>
> I think the below needs some kind of port to the BackupManager.
>
> Ideas?
>
> Regards,
>
> Rainer
>
> On 23.09.2009 13:28, rjung@apache.org wrote:
>    
>> Author: rjung
>> Date: Wed Sep 23 11:28:14 2009
>> New Revision: 818062
>>
>> URL: http://svn.apache.org/viewvc?rev=818062&view=rev
>> Log:
>> DeltaManager needs to replicate changed attributes even if session
>> gets invalidated. Otherwise session listeners will not see the right
>> data on the secondary nodes.
>>
>> Port of r818061 from TC 5.5.x.
>>
>> Modified:
>>      tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
>>      tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java
>>
>> 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=818062&r1=818061&r2=818062&view=diff
>> ==============================================================================
>> --- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original)
>> +++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Wed Sep 23 11:28:14 2009
>> @@ -1108,6 +1108,25 @@
>>        * @return a SessionMessage to be sent,
>>        */
>>       public ClusterMessage requestCompleted(String sessionId) {
>> +         return requestCompleted(sessionId, false);
>> +     }
>> +
>> +     /**
>> +      * When the request has been completed, the replication valve will notify
>> +      * the manager, and the manager will decide whether any replication is
>> +      * needed or not. If there is a need for replication, the manager will
>> +      * create a session message and that will be replicated. The cluster
>> +      * determines where it gets sent.
>> +      *
>> +      * Session expiration also calls this method, but with expires == true.
>> +      *
>> +      * @param sessionId -
>> +      *            the sessionId that just completed.
>> +      * @param expires -
>> +      *            whether this method has been called during session expiration
>> +      * @return a SessionMessage to be sent,
>> +      */
>> +     public ClusterMessage requestCompleted(String sessionId, boolean expires) {
>>           DeltaSession session = null;
>>           try {
>>               session = (DeltaSession) findSession(sessionId);
>> @@ -1129,7 +1148,7 @@
>>                   }
>>               }
>>               if(!isDeltaRequest) {
>> -                if(!session.isPrimarySession()) {
>> +                if(!expires&&  !session.isPrimarySession()) {
>>                       counterSend_EVT_SESSION_ACCESSED++;
>>                       msg = new SessionMessageImpl(getName(),
>>                                                    SessionMessage.EVT_SESSION_ACCESSED,
>> @@ -1145,9 +1164,10 @@
>>                       log.debug(sm.getString("deltaManager.createMessage.delta",getName(), sessionId));
>>                   }
>>               }
>> -            session.setPrimarySession(true);
>> +            if (!expires)
>> +                session.setPrimarySession(true);
>>               //check to see if we need to send out an access message
>> -            if ((msg == null)) {
>> +            if (!expires&&  (msg == null)) {
>>                   long replDelta = System.currentTimeMillis() - session.getLastTimeReplicated();
>>                   if (replDelta>  (getMaxInactiveInterval() * 1000)) {
>>                       counterSend_EVT_SESSION_ACCESSED++;
>>
>> Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java
>> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java?rev=818062&r1=818061&r2=818062&view=diff
>> ==============================================================================
>> --- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java (original)
>> +++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java Wed Sep 23 11:28:14 2009
>> @@ -38,7 +38,9 @@
>>   import org.apache.catalina.Manager;
>>   import org.apache.catalina.SessionListener;
>>   import org.apache.catalina.ha.ClusterManager;
>> +import org.apache.catalina.ha.CatalinaCluster;
>>   import org.apache.catalina.ha.ClusterSession;
>> +import org.apache.catalina.ha.ClusterMessage;
>>   import org.apache.catalina.realm.GenericPrincipal;
>>   import org.apache.catalina.session.StandardSession;
>>   import org.apache.catalina.tribes.io.ReplicationStream;
>> @@ -373,7 +375,24 @@
>>       }
>>
>>       public void expire(boolean notify, boolean notifyCluster) {
>> +        if (expiring)
>> +            return;
>>           String expiredId = getIdInternal();
>> +
>> +        if(expiredId != null&&  manager != null&&
>> +           manager instanceof DeltaManager) {
>> +            DeltaManager dmanager = (DeltaManager)manager;
>> +            CatalinaCluster cluster = dmanager.getCluster();
>> +            ClusterMessage msg = dmanager.requestCompleted(expiredId, true);
>> +            if (msg != null) {
>> +                if(dmanager.doDomainReplication()) {
>> +                    cluster.sendClusterDomain(msg);
>> +                } else {
>> +                    cluster.send(msg);
>> +                }
>> +            }
>> +        }
>> +
>>           super.expire(notify);
>>
>>           if (notifyCluster) {
>>      
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
>    


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


Port r818062 to BackupManager?

Posted by Rainer Jung <ra...@kippdata.de>.
Hi Filip,

I think the below needs some kind of port to the BackupManager.

Ideas?

Regards,

Rainer

On 23.09.2009 13:28, rjung@apache.org wrote:
> Author: rjung
> Date: Wed Sep 23 11:28:14 2009
> New Revision: 818062
> 
> URL: http://svn.apache.org/viewvc?rev=818062&view=rev
> Log:
> DeltaManager needs to replicate changed attributes even if session
> gets invalidated. Otherwise session listeners will not see the right
> data on the secondary nodes.
> 
> Port of r818061 from TC 5.5.x.
> 
> Modified:
>     tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
>     tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java
> 
> 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=818062&r1=818061&r2=818062&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Wed Sep 23 11:28:14 2009
> @@ -1108,6 +1108,25 @@
>       * @return a SessionMessage to be sent,
>       */
>      public ClusterMessage requestCompleted(String sessionId) {
> +         return requestCompleted(sessionId, false);
> +     }
> +
> +     /**
> +      * When the request has been completed, the replication valve will notify
> +      * the manager, and the manager will decide whether any replication is
> +      * needed or not. If there is a need for replication, the manager will
> +      * create a session message and that will be replicated. The cluster
> +      * determines where it gets sent.
> +      * 
> +      * Session expiration also calls this method, but with expires == true.
> +      * 
> +      * @param sessionId -
> +      *            the sessionId that just completed.
> +      * @param expires -
> +      *            whether this method has been called during session expiration
> +      * @return a SessionMessage to be sent,
> +      */
> +     public ClusterMessage requestCompleted(String sessionId, boolean expires) {
>          DeltaSession session = null;
>          try {
>              session = (DeltaSession) findSession(sessionId);
> @@ -1129,7 +1148,7 @@
>                  }  
>              }
>              if(!isDeltaRequest) {
> -                if(!session.isPrimarySession()) {               
> +                if(!expires && !session.isPrimarySession()) {
>                      counterSend_EVT_SESSION_ACCESSED++;
>                      msg = new SessionMessageImpl(getName(),
>                                                   SessionMessage.EVT_SESSION_ACCESSED, 
> @@ -1145,9 +1164,10 @@
>                      log.debug(sm.getString("deltaManager.createMessage.delta",getName(), sessionId));
>                  }
>              }
> -            session.setPrimarySession(true);
> +            if (!expires)
> +                session.setPrimarySession(true);
>              //check to see if we need to send out an access message
> -            if ((msg == null)) {
> +            if (!expires && (msg == null)) {
>                  long replDelta = System.currentTimeMillis() - session.getLastTimeReplicated();
>                  if (replDelta > (getMaxInactiveInterval() * 1000)) {
>                      counterSend_EVT_SESSION_ACCESSED++;
> 
> Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java?rev=818062&r1=818061&r2=818062&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java Wed Sep 23 11:28:14 2009
> @@ -38,7 +38,9 @@
>  import org.apache.catalina.Manager;
>  import org.apache.catalina.SessionListener;
>  import org.apache.catalina.ha.ClusterManager;
> +import org.apache.catalina.ha.CatalinaCluster;
>  import org.apache.catalina.ha.ClusterSession;
> +import org.apache.catalina.ha.ClusterMessage;
>  import org.apache.catalina.realm.GenericPrincipal;
>  import org.apache.catalina.session.StandardSession;
>  import org.apache.catalina.tribes.io.ReplicationStream;
> @@ -373,7 +375,24 @@
>      }
>  
>      public void expire(boolean notify, boolean notifyCluster) {
> +        if (expiring)
> +            return;
>          String expiredId = getIdInternal();
> +
> +        if(expiredId != null && manager != null &&
> +           manager instanceof DeltaManager) {
> +            DeltaManager dmanager = (DeltaManager)manager;
> +            CatalinaCluster cluster = dmanager.getCluster();
> +            ClusterMessage msg = dmanager.requestCompleted(expiredId, true);
> +            if (msg != null) {
> +                if(dmanager.doDomainReplication()) {
> +                    cluster.sendClusterDomain(msg);
> +                } else {
> +                    cluster.send(msg);
> +                }
> +            }
> +        }
> +
>          super.expire(notify);
>  
>          if (notifyCluster) {

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