[ https://issues.jboss.org/browse/JBSEAM-4487?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12715480#comment-12715480 ]
Daniel Neumegen commented on JBSEAM-4487: ----------------------------------------- Sorry Marek, I saw that the issue was still open, the question was directed at the reporter, Dave Atkins, wondering if he ever found a fix for this as we are experiencing the same issue. > Concurrent requests; one invalidates the session, results in recursive loop > of session creation > ----------------------------------------------------------------------------------------------- > > Key: JBSEAM-4487 > URL: https://issues.jboss.org/browse/JBSEAM-4487 > Project: Seam 2 > Issue Type: Bug > Components: Core > Affects Versions: 2.1.1.GA, 2.1.2.CR1, 2.1.2.CR2, 2.1.2.GA, 2.2.0.CR1, > 2.2.0.GA > Environment: Jboss 4.2.2 with shipped Tomcat on Linux. > Reporter: dave atkins > Labels: session > > I noticed that we had an massive number of sessions on one of our tomcat > nodes that hosts our modest Seam app. After some investigation I discovered > this in the log > 2009-11-25 17:38:02,521 INFO [org.jboss.seam.contexts.Contexts] starting up: > org.jboss.seam.web.session > 2009-11-25 17:38:02,522 INFO [org.jboss.seam.contexts.Contexts] starting up: > org.jboss.seam.security.identity > 2009-11-25 17:38:02,522 INFO [org.jboss.seam.contexts.Contexts] starting up: > org.jboss.seam.web.session > 2009-11-25 17:38:02,522 INFO [org.jboss.seam.contexts.Contexts] starting up: > org.jboss.seam.security.identity > 2009-11-25 17:38:02,522 INFO [org.jboss.seam.contexts.Contexts] starting up: > org.jboss.seam.web.session > This is repeated for thousands of lines and tomcat reports we have over > 100,000 sessions (far more than the 100s we normally have). After digging > around the seam code I realised that if you have two concurrent requests and > one invalidates the session before the other is finished, seam goes into an > recursive loop of session creation (normally ended by stack overflow). Here's > a stack trace showing two recursions. > at org.jboss.seam.Component.newInstance(Component.java:2094) > at org.jboss.seam.contexts.Contexts.startup(Contexts.java:304) > at org.jboss.seam.contexts.Contexts.startup(Contexts.java:278) > at org.jboss.seam.contexts.Lifecycle.beginSession(Lifecycle.java:209) > at > org.jboss.seam.contexts.ServletLifecycle.beginSession(ServletLifecycle.java:141) > at > org.jboss.seam.servlet.SeamListener.sessionCreated(SeamListener.java:45) > at > org.apache.catalina.session.StandardSession.tellNew(StandardSession.java:397) > at > org.apache.catalina.session.StandardSession.setId(StandardSession.java:369) > at > org.apache.catalina.session.ManagerBase.createSession(ManagerBase.java:828) > at > org.apache.catalina.session.StandardManager.createSession(StandardManager.java:291) > at org.apache.catalina.connector.Request.doGetSession(Request.java:2312) > at org.apache.catalina.connector.Request.getSession(Request.java:2075) > at > org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:833) > at > javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216) > at > org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545) > at > javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216) > at > javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216) > at > com.sun.faces.context.SessionMap.getSession(ExternalContextImpl.java:1002) > at com.sun.faces.context.SessionMap.get(ExternalContextImpl.java:962) > at > org.jboss.seam.contexts.ServerConversationContext.get(ServerConversationContext.java:110) > at > org.jboss.seam.contexts.Contexts.lookupInStatefulContexts(Contexts.java:189) > at org.jboss.seam.Component.getInstance(Component.java:1949) > at org.jboss.seam.Component.getInstance(Component.java:1944) > at org.jboss.seam.Component.getInstance(Component.java:1924) > at org.jboss.seam.Component.getInstance(Component.java:1919) > at org.jboss.seam.security.Identity.create(Identity.java:101) > at sun.reflect.GeneratedMethodAccessor2896.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) > at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) > at org.jboss.seam.Component.callComponentMethod(Component.java:2211) > at org.jboss.seam.Component.callCreateMethod(Component.java:2134) > at org.jboss.seam.Component.newInstance(Component.java:2094) > at org.jboss.seam.contexts.Contexts.startup(Contexts.java:304) > at org.jboss.seam.contexts.Contexts.startup(Contexts.java:278) > at org.jboss.seam.contexts.Lifecycle.beginSession(Lifecycle.java:209) > at > org.jboss.seam.contexts.ServletLifecycle.beginSession(ServletLifecycle.java:141) > at > org.jboss.seam.servlet.SeamListener.sessionCreated(SeamListener.java:45) > at > org.apache.catalina.session.StandardSession.tellNew(StandardSession.java:397) > at > org.apache.catalina.session.StandardSession.setId(StandardSession.java:369) > at > org.apache.catalina.session.ManagerBase.createSession(ManagerBase.java:828) > at > org.apache.catalina.session.StandardManager.createSession(StandardManager.java:291) > at org.apache.catalina.connector.Request.doGetSession(Request.java:2312) > at org.apache.catalina.connector.Request.getSession(Request.java:2075) > at > org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:833) > at > javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216) > at > org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545) > at > javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216) > at > javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216) > at > com.sun.faces.context.SessionMap.getSession(ExternalContextImpl.java:1002) > at com.sun.faces.context.SessionMap.get(ExternalContextImpl.java:962) > at > org.jboss.seam.contexts.ServerConversationContext.get(ServerConversationContext.java:110) > at > org.jboss.seam.contexts.Contexts.lookupInStatefulContexts(Contexts.java:189) > at org.jboss.seam.Component.getInstance(Component.java:1949) > at org.jboss.seam.Component.getInstance(Component.java:1944) > at org.jboss.seam.Component.getInstance(Component.java:1924) > at org.jboss.seam.Component.getInstance(Component.java:1919) > at org.jboss.seam.security.Identity.create(Identity.java:101) > at sun.reflect.GeneratedMethodAccessor2896.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) > at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) > at org.jboss.seam.Component.callComponentMethod(Component.java:2211) > at org.jboss.seam.Component.callCreateMethod(Component.java:2134) > at org.jboss.seam.Component.newInstance(Component.java:2094) > This problem is partially documented here - > https://jira.jboss.org/jira/browse/JBSEAM-2888, unfortunately this bugfix > didn't solve the root cause of the problem. > The problem is caused by the SessionMap used by ServerConversationContext. > Internally the session map uses HttpServletRequest.getSession(true) to > retrieve the session, which creates a new session if the one defined on the > HttpServletRequest is invalid or null. Unfortunately, when the new session is > created session listeners are informed before the session has been set on the > HttpServletRequest. Seam is one of these session listeners and creates a new > Identity on session creation, which in turn accesses the SessionMap, still > before the new Session has been set on the request. This leads to an infinite > recursive loop. > The SessionMap used is returned by externalContext.getSessionMap(). One > solution could be to implement our own SessionMap that doesn't attempt to > create a new session if the current session is invalid or null, although I've > no idea how this would impact on other Seam code. > In windows we can recreate the problem by having a button that calls > #{session.invalidate}. Another more realistic way to recreate the problem is > to have one tab performing a long running search and logging out using > identity.logout in some other tab. When the search completes the error > occurs. > We've tried the above in Linux, but it doesn't recreate the problem. I > suspect this is due to Windows and Linux returning the list of components in > a different order, probably due to the underlying filesystem. > We are using seam 2.1.1.GA. I've looked at the source code for the latest > release and it appears that the problem will still occur due to use of > SessionMap. > Out current workaround is to override Identity.create and add a ThreadLocal > that counts recursive calls. If more then two recursive calls are detected > an IllegalStateException is thrown. This definitely isn't a permanent > solution, but stops our server creating 100,000 sessions. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira _______________________________________________ seam-issues mailing list seam-issues@lists.jboss.org https://lists.jboss.org/mailman/listinfo/seam-issues