Hi Johannes, This has been triggered by JDK 17, which seems to apply other, probably more advanced parallelization strategies than previous versions. We know how to fix this in BaseX, but it may take a while [1]. You may get rid of the problem if you only do what’s really necessary inside the xquery:fork-join() function arguments.
Best, Christian [1] https://github.com/BaseXdb/basex/issues/2479 ________________________________ Von: Johannes Bauer via BaseX-Talk <basex-talk@mailman.uni-konstanz.de> Gesendet: Montag, 22. September 2025 09:26 An: BaseX <basex-talk@mailman.uni-konstanz.de> Betreff: [basex-talk] Multithreading issues after upgrade to BaseX 12 Hi, we experience some problems after the upgrade to version 12 with the fulltext search. We are using xquery:fork-join() to run the fulltext search on multiple databases at the same time (see attachment). This worked fine with version 11 but has strange effects after the upgrade to version 12. With BaseX 11 the log output is like this: 09:03:51.054 [0:0:0:0:0:0:0:1]:55079 admin REQUEST [POST] /dba/query?file=ftsearch.xq 09:03:51.203 SERVER admin TRACE local:search-db(ALL) 100.4 ms 09:03:51.204 SERVER admin TRACE local:search-db(ALL) 1721 09:03:51.243 SERVER admin TRACE local:matches() 38.84 ms 09:03:51.270 SERVER admin TRACE local:search-db(MD) 166.69 ms 09:03:51.270 SERVER admin TRACE local:search-db(MD) 1883 09:03:51.282 SERVER admin TRACE local:matches() 11.9 ms ... 09:03:52.284 SERVER admin TRACE local:search-db(XP) 307.84 ms 09:03:52.284 SERVER admin TRACE local:search-db(XP) 74128 09:03:52.525 SERVER admin TRACE local:matches() 241.64 ms 09:03:52.796 SERVER admin TRACE local:matches() 581.56 ms 09:03:52.796 SERVER admin TRACE local:search-distinct() search "test" 1710.79 ms 09:03:53.200 [0:0:0:0:0:0:0:1]:55079 admin 200 2160.7 ms After about 2 seconds the search is finished. With BaseX 12 two things might happen. ConcurrentModificationException This happens almost immediatelly. 500 Unexpected error: Improper use? Potential bug? Your feedback is welcome: Contact: basex-talk@mailman.uni-konstanz.de Version: BaseX 12.0 Java: Eclipse Adoptium, 21 OS: Windows 10, amd64 Stack Trace: java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1095) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:1049) at org.basex.query.QueryResources.close(QueryResources.java:94) at org.basex.query.QueryContext.close(QueryContext.java:543) at org.basex.http.restxq.RestXqResponse.finish(RestXqResponse.java:152) at org.basex.http.web.WebResponse.create(WebResponse.java:63) at org.basex.http.restxq.RestXqServlet.run(RestXqServlet.java:70) at org.basex.http.BaseXServlet.service(BaseXServlet.java:68) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587) at org.eclipse.jetty.ee9.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1397) at org.eclipse.jetty.ee9.servlet.ServletHolder.handle(ServletHolder.java:765) at org.eclipse.jetty.ee9.servlet.ServletHandler.doHandle(ServletHandler.java:528) at org.eclipse.jetty.ee9.nested.ScopedHandler.handle(ScopedHandler.java:127) at org.eclipse.jetty.ee9.security.SecurityHandler.handle(SecurityHandler.java:603) at org.eclipse.jetty.ee9.nested.HandlerWrapper.handle(HandlerWrapper.java:124) at org.eclipse.jetty.ee9.nested.ScopedHandler.nextHandle(ScopedHandler.java:197) at org.eclipse.jetty.ee9.nested.SessionHandler.doHandle(SessionHandler.java:612) at org.eclipse.jetty.ee9.nested.ScopedHandler.nextHandle(ScopedHandler.java:195) at org.eclipse.jetty.ee9.nested.ContextHandler.doHandle(ContextHandler.java:1045) at org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:164) at org.eclipse.jetty.ee9.servlet.ServletHandler.doScope(ServletHandler.java:483) at org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:162) at org.eclipse.jetty.ee9.nested.SessionHandler.doScope(SessionHandler.java:589) at org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:162) at org.eclipse.jetty.ee9.nested.ContextHandler.doScope(ContextHandler.java:966) at org.eclipse.jetty.ee9.nested.ScopedHandler.handle(ScopedHandler.java:125) at org.eclipse.jetty.ee9.nested.ContextHandler.handle(ContextHandler.java:1719) at org.eclipse.jetty.ee9.nested.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1565) at org.eclipse.jetty.ee9.nested.HttpChannel.dispatch(HttpChannel.java:724) at org.eclipse.jetty.ee9.nested.HttpChannel.handle(HttpChannel.java:512) at org.eclipse.jetty.ee9.nested.ContextHandler$CoreContextHandler$CoreToNestedHandler.handle(ContextHandler.java:3029) at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1071) at org.eclipse.jetty.server.Server.handle(Server.java:182) at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:678) at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:416) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99) at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53) at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:480) at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:443) at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293) at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:981) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1211) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1166) at java.base/java.lang.Thread.run(Thread.java:1583) 189.44 ms Full text search never finishes 09:00:12.422 [0:0:0:0:0:0:0:1]:55041 admin REQUEST [POST] /dba/query?file=ftsearch.xq 09:00:12.633 SERVER admin TRACE local:search-db(ALL) 115.46 ms 09:00:12.635 SERVER admin TRACE local:search-db(ALL) 1721 09:00:12.672 SERVER admin TRACE local:matches() 37.09 ms 09:00:12.711 SERVER admin TRACE local:search-db(MD) 194.24 ms 09:00:12.711 SERVER admin TRACE local:search-db(MD) 1883 09:00:12.725 SERVER admin TRACE local:matches() 13.66 ms 09:00:12.851 SERVER admin TRACE local:search-db(LS) 334.48 ms 09:00:12.851 SERVER admin TRACE local:search-db(LS) 169524 09:00:12.923 SERVER admin TRACE local:search-db(CT) 406.58 ms 09:00:12.923 SERVER admin TRACE local:search-db(CT) 80086 ... 09:00:13.483 SERVER admin TRACE local:search-db(US) 47012 09:00:13.553 SERVER admin TRACE local:search-db(POC) 828.06 ms 09:00:13.554 SERVER admin TRACE local:search-db(POC) 10147 09:00:13.693 SERVER admin TRACE local:search-db(MR) 1020.89 ms 09:00:13.693 SERVER admin TRACE local:search-db(MR) 223155 The process "hangs" and never finishes and CPU is running on full load. The current database where it hangs is always a different one. Does this have anything to do with the Jetty update? It seems to be related to the multithreading. Best Regards Johannes