Start of webapp hangs if there are request while starting

Description

Wenn man eine MyCoRe-Anwendung startet und während des Starts bereits Zugriffe auf die Anwendung reinkommen, wird der Start unterbrochen. Workaround-Möglichkeiten:

  1. So lange neu starten bis es geht

  2. Apache/Nxings stoppen, dann Anwendung starten und erst danach Apache/Nginx wieder starten

 

ESC[mESC[1;31m2022-07-11T13:37:42,276 ERROR MCRErrorServlet: /servlets/MCRLoginServlet;jsessionid=100D20EB032CAD3BEAC9D8B2D8C011C3: Error 500 occured. The following message was given: Transaction already active java.lang.IllegalStateException: Transaction already active at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:74) at org.mycore.backend.jpa.MCREntityTransaction.begin(MCREntityTransaction.java:32) at java.base/java.lang.Iterable.forEach(Iterable.java:75) at org.mycore.common.MCRTransactionHelper.beginTransaction(MCRTransactionHelper.java:94) at org.mycore.frontend.servlets.MCRServlet.getSession(MCRServlet.java:239) at org.mycore.frontend.servlets.MCRServlet.initializeMCRSession(MCRServlet.java:372) at org.mycore.frontend.servlets.MCRServlet.doGetPost(MCRServlet.java:296) at org.mycore.frontend.servlets.MCRServlet.doGet(MCRServlet.java:147) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.mycore.frontend.filter.MCRWebAppBaseFilter.doFilter(MCRWebAppBaseFilter.java:41) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.mycore.frontend.filter.MCRRequestAuthenticationFilter.doFilter(MCRRequestAuthenticationFilter.java:57) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.mycore.frontend.filter.MCRRequestDebugFilter.doFilter(MCRRequestDebugFilter.java:75) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:508) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:829)

Environment

None

is caused by

Activity

Sebastian Hofmann 
July 12, 2022 at 4:44 PM

You can Reproduce the Error consistently by spamming F5 on a static page like: mir/content/brand/impressum.xml

The Java Doc of ServiceLoader says:

Concurrency
Instances of this class are not safe for use by multiple concurrent threads.

If i move the Initialization of TRANSACTION_SERVICE_LOADER to a private static final class it doesnt help.

The Problem ist that the ServiceLoader.load() creates as complete lazy instance of the ServiceLoader i change to Code to

private static final class InstanceHolder { public static final ServiceLoader<MCRPersistenceTransaction> TRANSACTION_SERVICE_LOADER = ServiceLoader .load(MCRPersistenceTransaction.class, MCRClassTools.getClassLoader()); }

and added

static { isDatabaseAccessEnabled(); }

to the MCRTransactionHelper

And now i can not longer reproduce the error.

Sebastian Hofmann 
July 12, 2022 at 4:03 PM

Sometime i get another error. Maybe a initialization error?

] [talledLocalContainer] java.util.NoSuchElementException [INFO] [talledLocalContainer] at java.base/java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:758) [INFO] [talledLocalContainer] at java.base/java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:778) [INFO] [talledLocalContainer] at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1215) [INFO] [talledLocalContainer] at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1228) [INFO] [talledLocalContainer] at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273) [INFO] [talledLocalContainer] at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309) [INFO] [talledLocalContainer] at java.base/java.util.ServiceLoader$ProviderSpliterator.tryAdvance(ServiceLoader.java:1491) [INFO] [talledLocalContainer] at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) [INFO] [talledLocalContainer] at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) [INFO] [talledLocalContainer] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) [INFO] [talledLocalContainer] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) [INFO] [talledLocalContainer] at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) [INFO] [talledLocalContainer] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) [INFO] [talledLocalContainer] at java.base/java.util.stream.ReferencePipeline.findAny(ReferencePipeline.java:652) [INFO] [talledLocalContainer] at org.mycore.common.MCRTransactionHelper.isDatabaseAccessEnabled(MCRTransactionHelper.java:45) [INFO] [talledLocalContainer] at org.mycore.common.MCRTransactionHelper.beginTransaction(MCRTransactionHelper.java:93) [INFO] [talledLocalContainer] at org.mycore.frontend.servlets.MCRServlet.getSession(MCRServlet.java:239) [INFO] [talledLocalContainer] at org.mycore.frontend.servlets.MCRServlet.initializeMCRSession(MCRServlet.java:372) [INFO] [talledLocalContainer] at org.mycore.frontend.servlets.MCRServlet.doGetPost(MCRServlet.java:296) [INFO] [talledLocalContainer] at org.mycore.frontend.servlets.MCRServlet.doGet(MCRServlet.java:147) [INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) [INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.mycore.frontend.filter.MCRUserAgentFilter.doFilter(MCRUserAgentFilter.java:67) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.mycore.common.xml.MCRURIResolverFilter.doFilter(MCRURIResolverFilter.java:75) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.mycore.frontend.filter.MCRWebAppBaseFilter.doFilter(MCRWebAppBaseFilter.java:41) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.mycore.frontend.filter.MCRRequestAuthenticationFilter.doFilter(MCRRequestAuthenticationFilter.java:57) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.mycore.frontend.filter.MCRRequestDebugFilter.doFilter(MCRRequestDebugFilter.java:75) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [INFO] [talledLocalContainer] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [INFO] [talledLocalContainer] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [INFO] [talledLocalContainer] at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) [INFO] [talledLocalContainer] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [INFO] [talledLocalContainer] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) [INFO] [talledLocalContainer] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) [INFO] [talledLocalContainer] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [INFO] [talledLocalContainer] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) [INFO] [talledLocalContainer] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787) [INFO] [talledLocalContainer] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [INFO] [talledLocalContainer] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [INFO] [talledLocalContainer] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [INFO] [talledLocalContainer] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [INFO] [talledLocalContainer] at java.base/java.lang.Thread.run(Thread.java:833)

Kathleen Neumann 
July 12, 2022 at 3:21 PM
(edited)

Fixed

Details

Assignee

Reporter

Components

Fix versions

Affects versions

Priority

Created July 12, 2022 at 3:20 PM
Updated July 29, 2022 at 7:13 AM
Resolved July 14, 2022 at 1:38 PM