Hello,

we have a BaseX web application with RESTXQ services. I was doing some load tests to see how it behaves in high load scenarios.

Some tests did throw IllegalStateExceptions somewhere in the Saxon XSLT code (see stacktrace below).
We use a XSLT stylesheet to transform the XML response of our services to an intermediate format that allows the transformation to JSON.

(:~
 : Transform XML to Json XML Schema (https://www.w3.org/TR/xslt-30/#schema-for-json).
 : @param $xml XML node
 : @return transformed XML
 :)
declare function json:to-json-xml($xml as element())
{
   xslt:transform($xml, 'xml-to-json.xslt', map {}, map {'cache' : true()})
};

Is there some concurrency problem with the xslt module?

Best regards
Johannes


Unexpected error: Improper use? Potential bug? Your feedback is welcome:
Contact: basex-talk@mailman.uni-konstanz.de
Version: BaseX 9.1.2
Java: Oracle Corporation, 1.8.0_191
OS: Linux, amd64
Stack Trace:
java.lang.IllegalStateException: The Controller is being used recursively or concurrently. This is not permitted.
    at net.sf.saxon.Controller.checkReadiness(Controller.java:1287)
    at net.sf.saxon.trans.XsltController.applyTemplates(XsltController.java:685)
    at net.sf.saxon.s9api.AbstractXsltTransformer.applyTemplatesToSource(AbstractXsltTransformer.java:347)
    at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:338)
    at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:71)
    at org.basex.query.func.xslt.XsltTransform.transform(XsltTransform.java:109)
    at org.basex.query.func.xslt.XsltTransform.transform(XsltTransform.java:59)
    at org.basex.query.func.xslt.XsltTransform.item(XsltTransform.java:37)
    at org.basex.query.expr.ParseExpr.value(ParseExpr.java:71)
    at org.basex.query.expr.List.value(List.java:155)
    at org.basex.query.expr.gflwor.GFLWOR.value(GFLWOR.java:73)
    at org.basex.query.expr.If.value(If.java:131)
    at org.basex.query.expr.gflwor.GFLWOR.value(GFLWOR.java:73)
    at org.basex.query.expr.If.value(If.java:131)
    at org.basex.query.expr.If.value(If.java:131)
    at org.basex.query.func.StaticFunc.invValue(StaticFunc.java:181)
    at org.basex.query.func.FuncCall.invoke(FuncCall.java:89)
    at org.basex.query.func.FuncCall.value(FuncCall.java:62)
    at org.basex.query.func.FuncCall.iter(FuncCall.java:67)
    at org.basex.query.scope.MainModule.iter(MainModule.java:118)
    at org.basex.query.QueryContext.iter(QueryContext.java:335)
    at org.basex.http.restxq.RestXqResponse.serialize(RestXqResponse.java:73)
    at org.basex.http.web.WebResponse.create(WebResponse.java:56)
    at org.basex.http.restxq.RestXqServlet.run(RestXqServlet.java:54)
    at org.basex.http.BaseXServlet.service(BaseXServlet.java:59)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    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.content42.services.filter.LoggingFilter.doFilter(LoggingFilter.java:44)
    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:493)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    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)