[
https://issues.apache.org/jira/browse/FELIX-6286?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on FELIX-6286 started by Pierre De Rop.
--------------------------------------------
> Concurrency issue in Gogo runtime Activator
> -------------------------------------------
>
> Key: FELIX-6286
> URL: https://issues.apache.org/jira/browse/FELIX-6286
> Project: Felix
> Issue Type: Bug
> Components: Gogo Runtime
> Affects Versions: gogo.runtime-1.1.2
> Reporter: Pierre De Rop
> Assignee: Pierre De Rop
> Priority: Major
>
> *Environment:*
> jdk: OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.252-b09, mixed mode)
> felix: felix-framework-6.0.3
> bundles:
> * jansi-1.18.jar
> * jline-3.13.0.jar
> * org.apache.felix.bundlerepository-2.0.10.jar
> * org.apache.felix.gogo.command-1.1.1-SNAPSHOT.jar
> * org.apache.felix.gogo.jline-1.1.7-SNAPSHOT.jar (or
> org.apache.felix.gogo.shell-1.1.3-SNAPSHOT.jar)
> * org.apache.felix.gogo.runtime-1.1.3-SNAPSHOT.jar
> *Symptoms:*
> Sometimes, the gogo bundles don't start up properly:
> - when using org.apache.felix.gogo.shell: we may get the following exception:
> {code:java}
> java -jar bin/felix.jar
> gogo: CommandNotFoundException: Command not found: gosh
> org.apache.felix.gogo.runtime.CommandNotFoundException: Command not found:
> gosh
> at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:596)
> at
> org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:526)
> at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:415)
> at org.apache.felix.gogo.runtime.Pipe.doCall(Pipe.java:416)
> at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:229)
> at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:59)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
> {code}
> - when using org.apache.felix.gogo.jline, we may get the following exception:
> {code:java}
> java -jar bin/felix.jar
> bundle://89aa8bfc-38db-4413-9201-f31ffb0fd779_5.0:1/gosh_profile:23.0CommandNotFoundException:
> Command not found: try
> org.apache.felix.gogo.runtime.CommandNotFoundException: Command not found: try
> at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:596)
> at
> org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:526)
> at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:415)
> at org.apache.felix.gogo.runtime.Pipe.doCall(Pipe.java:416)
> at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:229)
> at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:59)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748){code}
>
> *When:*
> the issue is hard to reproduce. The system must be heavily loaded while the
> felix framework is starting up.
> To fairly reproduce manually, you can do this:
> First: ensure that the org.apache.felix.gogo.runtime bundle is started
> *AFTER* other gogo bundles (after gogo jline or gogo shell bundle).
> Second: add a delay in
> gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/Activator.java
> start method, between the CommandProcessor registration and the OSGiCommands
> ServiceTracker activation: this will reproduce the issue all the time:
> {code:java}
> public void start(final BundleContext context) throws Exception
> {
> threadio = new ThreadIOImpl();
> threadio.start();
> threadioRegistration =context.registerService(ThreadIO.class.getName(),
> threadio, null);
> processorRegistration = newProcessor(threadio, context);
> System.out.println("XXXXXXXXXXX: sleep");
> Thread.sleep(3000);
> System.out.println("XXXXXXXXXXX: wakeup");
> commandTracker = trackOSGiCommands(context);
> commandTracker.open();
> {code}
>
> *Work Around:*
> start the org.apache.felix.gogo.runtime bundle BEFORE other bundles:
> *Analysis:*
> my understand is the following: the gogo runtime is doing the following in
> its Activator:
> # registers the CommandProcessor service
> # and after that, it starts tracking OSGI commands.
> The issue happens if there are some delay between 1 and 2 above, typically
> when the machine is heavily loaded while the felix framework is starting.
> So, the other gogo jline and gogo shell Activators are doing this:
> # track the CommandProcessor services
> # when the CommandProcessor is registered: the shell or jline gogo commands
> then register their shell commands in the registry and a thread is then
> started. At this point, it is assumed that the shell or jline commands are
> already injected into the gogo runtime CommandProcessor. but it won't be the
> case if the delay is happening between the time the CommandProcessor is
> registered and the gogo runtime service tracker is opened.
> *Proposed fix:*
> in the *gogo runtime* bundle Activator, register the CommandProcessor *AFTER*
> the OSGI commands ServiceTracker has been opened.
> By doing so, when the other jline or shell bundles will register their
> commands in the OSGI registry, their commands will be registered
> synchronously in the CommandProcessor, because at this point the gogo runtime
> commands service tracker is already opened.
> I'll submit a PR soon.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)