Sometimes a cluster node may fail to draw SiteStats charts.
In our production environment, Apache+mod_jk is used to load balance with sticky sessions (that is, once a session is established, session is stick with a specific cluster node). Ajax4jsf creates a cookie with a JSESSIONID with the Path: /sakai-sitestats-tool. mod_jk looks at this and dispatch request to a cluster node (that may or not be the correct one (the one sticked with the Sakai JSESSIONID)).
On a Sakai cluster with two nodes (A and B), when this issue occurs (looks no deterministic) it has the following behavior:
- User logs in on node A
- User enters SiteStats on any site
- All data except for the charts is displayed
- The following stacktrace is thrown on node B (not A!):
ERROR: Servlet.service() for servlet Faces Servlet threw exception (2007-08-10 09:06:26,217 TP-Processor5_org.apache.catalina.core.ContainerBase.[Catalina].
[localhost].[/sakai-sitestats-tool].[Faces Servlet])
org.ajax4jsf.framework.resource.ResourceNotFoundException: Resource not registered : org.ajax4jsf.framework.resource.UserResource/n/n/-879258763
at org.ajax4jsf.framework.resource.ResourceBuilderImpl.getResource(ResourceBuilderImpl.java:367)
at org.ajax4jsf.framework.resource.ResourceBuilderImpl.getResourceForKey(ResourceBuilderImpl.java:322)
at org.ajax4jsf.framework.resource.InternetResourceService.serviceResource(InternetResourceService.java:152)
at org.ajax4jsf.framework.resource.InternetResourceService.serviceResource(InternetResourceService.java:141)
at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)