You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Pierre De Rop (Jira)" <ji...@apache.org> on 2020/06/11 06:51:00 UTC

[jira] [Work started] (FELIX-6286) Concurrency issue in Gogo runtime Activator

     [ 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)