[ https://issues.apache.org/jira/browse/KARAF-7453?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jean-Baptiste Onofré resolved KARAF-7453. ----------------------------------------- Fix Version/s: 4.4.1 4.3.8 Resolution: Fixed > Race condition in threaded ConnectorServerFactory > ------------------------------------------------- > > Key: KARAF-7453 > URL: https://issues.apache.org/jira/browse/KARAF-7453 > Project: Karaf > Issue Type: Bug > Components: karaf > Affects Versions: 4.4.0, 4.3.6 > Environment: Windows 10 and Debian 11, Karaf 4.3.6 and Karaf 4.4.0, > Java 11 > Reporter: Sampsa Jurvansuu > Assignee: Jean-Baptiste Onofré > Priority: Major > Fix For: 4.4.1, 4.3.8 > > Attachments: ConnectorServerFactory-1.java > > > When launching a vanilla Karaf 4.3.6/4.4.0 with default configuration, it > appears that the ConnectorServerFactory of org.apache.karaf.management.server > bundle is first initialized, then destroyed, and then again initialized all > within a time period of a fraction of a second. To demonstrate the timings of > the execution, we have added log outputs as presented in the attached > ConnectorServerFactory.java file. A typical output is as follows: > {code:java} > 2022-06-22T08:56:52,810 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Running ConnectorServerFactory.init() > 2022-06-22T08:56:52,839 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Finished ConnectorServerFactory.init() > 2022-06-22T08:56:52,839 | DEBUG | JMX Connector Thread > [service:jmx:rmi://127.0.0.1:44444/jndi/rmi://127.0.0.1:1099/karaf-root] | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Starting ConnectorServer > 2022-06-22T08:56:52,842 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Running ConnectorServerFactory.destroy() > 2022-06-22T08:56:52,843 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Stopping ConnectorServer > 2022-06-22T08:56:52,920 | DEBUG | JMX Connector Thread > [service:jmx:rmi://127.0.0.1:44444/jndi/rmi://127.0.0.1:1099/karaf-root] | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Started ConnectorServer > 2022-06-22T08:56:52,924 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Stopped ConnectorServer > 2022-06-22T08:56:52,926 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Finished ConnectorServerFactory.destroy() > 2022-06-22T08:56:52,926 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Running ConnectorServerFactory.init() > 2022-06-22T08:56:52,940 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Finished ConnectorServerFactory.init() > 2022-06-22T08:56:52,940 | DEBUG | JMX Connector Thread > [service:jmx:rmi://127.0.0.1:44444/jndi/rmi://127.0.0.1:1099/karaf-root] | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Starting ConnectorServer > 2022-06-22T08:56:52,950 | DEBUG | JMX Connector Thread > [service:jmx:rmi://127.0.0.1:44444/jndi/rmi://127.0.0.1:1099/karaf-root] | > ConnectorServerFactory | 40 - org.apache.karaf.management.server - > 4.4.0 | Started ConnectorServer {code} > In this typical run everything ends up working fine. Though we can already > see some risky overlapping of the JMX server still booting up, while already > starting to destroy it. > > However, when running the Karaf with more bundles and overall more > complicated configuration (using version 4.3.6 in this case), it happens that > occasionally (approx. 1 out of 10 runs) the thread execution is timed > slightly differently leading to following output: > {code:java} > 2022-06-22T09:31:29,856 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 382 - org.apache.karaf.management.server - > 4.3.6 | Running ConnectorServerFactory.init() > 2022-06-22T09:31:29,883 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 382 - org.apache.karaf.management.server - > 4.3.6 | Finished ConnectorServerFactory.init() > 2022-06-22T09:31:29,887 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 382 - org.apache.karaf.management.server - > 4.3.6 | Running ConnectorServerFactory.destroy() > 2022-06-22T09:31:29,887 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 382 - org.apache.karaf.management.server - > 4.3.6 | Stopping ConnectorServer > 2022-06-22T09:31:29,892 | DEBUG | JMX Connector Thread > [service:jmx:rmi://<server-name>:44444/jndi/rmi://<server-name>:1099/karaf-server] > | ConnectorServerFactory | 382 - > org.apache.karaf.management.server - 4.3.6 | Starting ConnectorServer > 2022-06-22T09:31:29,888 | WARN | activator-1-thread-1 | Activator > | 382 - org.apache.karaf.management.server - 4.3.6 | Error > destroying ConnectorServerFactory > java.rmi.NoSuchObjectException: object not exported > at sun.rmi.transport.ObjectTable.unexportObject(ObjectTable.java:151) > ~[?:?] > at > java.rmi.server.UnicastRemoteObject.unexportObject(UnicastRemoteObject.java:457) > ~[?:?] > at > javax.management.remote.rmi.RMIJRMPServerImpl.unexport(RMIJRMPServerImpl.java:168) > ~[?:?] > at > javax.management.remote.rmi.RMIJRMPServerImpl.closeServer(RMIJRMPServerImpl.java:233) > ~[?:?] > at > javax.management.remote.rmi.RMIServerImpl.close(RMIServerImpl.java:406) ~[?:?] > at > javax.management.remote.rmi.RMIConnectorServer.stop(RMIConnectorServer.java:612) > ~[?:?] > at > org.apache.karaf.management.ConnectorServerFactory.destroy(ConnectorServerFactory.java:490) > ~[bundleFile:?] > at > org.apache.karaf.management.internal.Activator.doStop(Activator.java:239) > [bundleFile:?] > at > org.apache.karaf.util.tracker.BaseActivator.run(BaseActivator.java:310) > [bundleFile:?] > at > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?] > at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?] > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) > [?:?] > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) > [?:?] > at java.lang.Thread.run(Thread.java:829) [?:?] > 2022-06-22T09:31:29,897 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 382 - org.apache.karaf.management.server - > 4.3.6 | Running ConnectorServerFactory.init() > 2022-06-22T09:31:29,966 | DEBUG | activator-1-thread-1 | > ConnectorServerFactory | 382 - org.apache.karaf.management.server - > 4.3.6 | Finished ConnectorServerFactory.init() > 2022-06-22T09:31:29,972 | DEBUG | JMX Connector Thread > [service:jmx:rmi://<server-name>:44444/jndi/rmi://<server-name>:1099/karaf-server] > | ConnectorServerFactory | 382 - > org.apache.karaf.management.server - 4.3.6 | Starting ConnectorServer > 2022-06-22T09:31:30,113 | DEBUG | JMX Connector Thread > [service:jmx:rmi://<server-name>:44444/jndi/rmi://<server-name>:1099/karaf-server] > | ConnectorServerFactory | 382 - > org.apache.karaf.management.server - 4.3.6 | Started ConnectorServer{code} > As seen from the above log, the factory gets destroyed already before the > first initialization is executed in the separate thread. This conflict also > outputs the following stack trace to the stdout/stderr (supposedly because > the exception thrown in the separate thread is not caught by the main > activator thread): > {code:java} > Jun 22 09:31:29 <server-name> karaf[76019]: Exception in thread "JMX > Connector Thread > [service:jmx:rmi://<server-name>:44444/jndi/rmi://<server-name>:1099/karaf-server]" > java.lang.RuntimeException: Could not start JMX connector server > Jun 22 09:31:29 <server-name> karaf[76019]: at > org.apache.karaf.management.ConnectorServerFactory.lambda$init$0(ConnectorServerFactory.java:444) > Jun 22 09:31:29 <server-name> karaf[76019]: at > java.base/java.lang.Thread.run(Thread.java:829) > Jun 22 09:31:29 <server-name> karaf[76019]: Caused by: java.io.IOException: > The server has been stopped. > Jun 22 09:31:29 <server-name> karaf[76019]: at > java.management.rmi/javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:420) > Jun 22 09:31:29 <server-name> karaf[76019]: at > org.apache.karaf.management.ConnectorServerFactory.lambda$init$0(ConnectorServerFactory.java:427) > Jun 22 09:31:29 <server-name> karaf[76019]: ... 1 more {code} > In this scenario, even though the second initialization appears to finish > normally, the JMX server is not actually in a functional state and cannot be > reached, requiring a manual restart of either the bundle or the whole Karaf > instance. > > A workaround for the issue is to disable the threading for the > ConnectorServerFactory. However, it would be more desirable to be able to run > the JMX server reliably in the threaded mode. -- This message was sent by Atlassian Jira (v8.20.10#820010)