https://bz.apache.org/bugzilla/show_bug.cgi?id=62175

            Bug ID: 62175
           Summary: Infinite recursive session PersistentManager.swapIn
                    loop with OOM
           Product: Tomcat 9
           Version: 9.0.6
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Catalina
          Assignee: [email protected]
          Reporter: [email protected]
  Target Milestone: -----

Environment:
Windows 8 NTFS
Oracle JDK 1.8.0_152
Apache Tomcat 9.0.6
Apache OpenWebBeans 2.0.4 (OWB)
Session ID ABCDE in filesystem storage and containing an expired session.

TL;DR: Expired session is deserialized over and over again because OWB calls
Request.getSession(false) in sessionDestroyed and ContainerBackgroundProcessor
is unable to delete the session file while it is deserialized.


While Tomcat is starting up, I direct the Browser to request my application
with session ABCDE which had been swapped out but is already expired.
Tomcat calls 
StandardSession.isValid() 
-> StandardSession.expire()
-> each registered HttpSessionListener.destroy()

Now OWB having a HttpSessionListener registered is calling
RequestFacade.getSession(false) which expands to
-> PersistentManager.findSession()
-> PersistentManager.swapIn()
-> StandardSession.isValid()
... repeat until OutOfMemory

An important side condition is that FileStore.remove() fails for unknown
reason. File.delete just returns false which is not very expressive. Maybe the
session file is beeing read / locked accidentally the same time while the
ContainerBackgroundProcessor tries to delete it. This could be caused by the
session beeing read over and over again by that recursive loop where the most
expansive operation is deserialization of the session, giving close to zero
time for a successful delete.

[This is one reason why I better like Linux: deleting a file while it is read
simply deletes the file.]

BTW: When the HTTP-Thread is blocked by a breakpoint,
ContainerBackgroundProcessor succeeds in deleting the file and stops the
recursion.


Here are the stacktraces of HTTP thread and ContainerBackgroundProcessor:

"http-nio-8080-exec-2" #66 daemon prio=5 os_prio=0 tid=0x0000000021e9b000
nid=0xf94 at breakpoint[0x000000002c40a000]
   java.lang.Thread.State: RUNNABLE
        at
my.web.common.application.listener.ApplicationListener.sessionDestroyed(ApplicationListener.java:112)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000d709d800> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000d61c8d48> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb10008> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb100d8> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb10150> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb101c8> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb10240> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb102b8> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb10330> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb103a8> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb10420> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb10498> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at org.apache.catalina.connector.Request.getSession(Request.java:2374)
        at
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
        at
org.apache.webbeans.web.context.WebContextsService.destroySessionContext(WebContextsService.java:553)
        at
org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:228)
        at
org.apache.webbeans.servlet.WebBeansConfigurationListener.sessionDestroyed(WebBeansConfigurationListener.java:197)
        at
org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
        - locked <0x00000000fbb10510> (a
org.apache.catalina.session.StandardSession)
        at
org.apache.catalina.session.StandardSession.isValid(StandardSession.java:659)
        at
org.apache.catalina.session.PersistentManagerBase.swapIn(PersistentManagerBase.java:736)
        - locked <0x00000000fa5be668> (a java.lang.Object)
        at
org.apache.catalina.session.PersistentManagerBase.findSession(PersistentManagerBase.java:488)
        at
org.apache.catalina.connector.Request.doGetSession(Request.java:2909)
        at
org.apache.catalina.connector.Request.getSessionInternal(Request.java:2635)
        at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:464)
        at
org.apache.catalina.valves.rewrite.RewriteValve.invoke(RewriteValve.java:540)
        at
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
        at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
        at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
        at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        - locked <0x00000000f898c128> (a
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)








java.io.IOException: Unable to delete file [....ABCDE.session] which is no
longer required
        at org.apache.catalina.session.FileStore.remove(FileStore.java:269)
        at
org.apache.catalina.session.StoreBase.processExpires(StoreBase.java:189)
        at
org.apache.catalina.session.PersistentManagerBase.processExpires(PersistentManagerBase.java:433)
        at
org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:558)
        at
org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5406)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1396)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1368)
        at java.lang.Thread.run(Thread.java:748)

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to