[ 
https://issues.apache.org/jira/browse/WICKET-6356?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

wayne pope updated WICKET-6356:
-------------------------------
    Attachment: PageStoreManager.java

> Clustering failover not working on Tomcat
> -----------------------------------------
>
>                 Key: WICKET-6356
>                 URL: https://issues.apache.org/jira/browse/WICKET-6356
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 6.17.0, 7.5.0
>         Environment: Tomcat 8.0.32, Apache 2.4, OSx and Solaris 9,
>            Reporter: wayne pope
>              Labels: cluster, clustering, tomcat
>         Attachments: IssueFiles.zip, PageStoreManager.java
>
>
> Clustering failover with Tomcat 8 is not working for us in Production or 
> locally on my Mac. The reason is the following from the debugging that I did 
> and from the best of my understanding:
> Whenever a statefull page is used/touched the SessionEntry is updated. This 
> SessionEntry is stored in the tomcats session under the attribute name  
> "wicket:persistentPageManagerData-APPLICATION_NAME". 
> However at the end of the wicket request, Session.internalDetach() is called 
> and setAttribute() is called passing the wicket session under the name 
> "wicket:wicket.hub:session". This triggers the replication in Tomcat (only 
> when setAttribute is called and ONLY that attribute is replicated). Because 
> the SessionEntry is stored under a different attribute name its never 
> replicated.
> The only time the SessionEntry is replicated is when a node first starts up 
> and joins the cluster , at this point all sessions are replicated across 
> (including all attritbutes) by the daltamanager and SessionEntry#readObject() 
> is used which contains all the pages. On Tomcat after this initial syncing of 
> all sessions SessionEntry#readObject() is never used.
> So the only time session failover works is when you kill the other instance 
> (in a 2 node cluster) just after the other instance starts up - at this point 
> the correct SessionEntry is on the new instance. If however you visit some 
> more pages the new pages are never replicated across as the SessionEntry is 
> never replicated.
> Further to this IF the SessionEntry was to be replicated it would not be any 
> good as the cache are transient 
> private transient List<IManageablePage> sessionCache;
> private transient List<Object> afterReadObject
>  
> This means any new pages created on the old instance (after the new instance 
> has started up) are not available in the http session or the second level 
> page store on the new instance. 
> Therefore when the old instance in shut down the user is load balanced to the 
> new instance. At this point the link in the page Wicket is looking for does 
> not exist in the SessionEntry cache or the PageStore so it creates the page 
> and looks for the component/link.This causes a ComponentNotFoundException for 
> us because the links are either in a DataView which is never rendered so does 
> not exist, or the other links are actually added to the page in an Ajax 
> request and again because the page is not rendered are not there, Wicket then 
> throws the exception and it appears to the user the session is lost.
> So in summary there seems there is no way for the current mechanism on Tomcat 
> to work. It would seem the SessionEntry.sessionCache needs to be not 
> transient and setAttribute needs to be called for the SessionEntry at the end 
> of request on the internalDetach so that Tomcats deltamanager replicates that 
> attribute in the session.
> Attached my quickstart , tomcat, and apache conf.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to