Skip to content

[ Bug ] Installing fragment bundle with same symbolic name as that already installed in running framework causes Felix OSGi framework implementation to shutdown #36

@ideas-into-software

Description

@ideas-into-software

Bug in Felix OSGi framework implementation was uncovered, which manifests on attempt to install into running framework fragment bundle which duplicates in symbolic name ( same symbolic name, but different version ) fragment bundle already present in running framework - this results in org.osgi.framework.BundleException: The framework has been shutdown exception being thrown and tests' failure.

I.e.

  • /featurelauncher/integration-test.bndrun installed org.apache.aries.spifly.dynamic.framework.extension version 1.3.7 when integration tests were executed;

  • once framework was launched, some test cases defined in FeatureRuntimeIntegrationTest installed features with that same fragment bundle lower version (org.apache.aries.spifly:org.apache.aries.spifly.dynamic.framework.extension:1.3.6);

  • despite stack traces not referring to that bundle, debugging this issue uncovered that attempt to install that specific fragment bundle during feature installation in FeatureRuntimeImpl caused asynchronously the org.osgi.framework.BundleException: The framework has been shutdown exception being thrown which resulted in tests failure;

  • temporarily switching framework to Eclipse Equinox OSGi framework implementation ( -runfw: org.eclipse.osgi ) proved this is Felix-specific bug;

  • since Felix OSGi framework implementation is used as the default framework in this implementation of OSGi "160. Feature Launcher Service Specification", temporary workaround was applied by commenting out that duplicate fragment bundle in those feature JSON files ( console-webconsole-feature.integration-tests.json, gogo-console-feature.update-with-webconsole.json) - FeatureRuntimeIntegrationTest test cases which install those features still work, since that same fragment bundle is already present in running framework via /featurelauncher/integration-test.bndrun;

Stack traces included below - PLEASE NOTE that FeatureRuntimeImpl related line numbers visible in stack traces have shifted.


(...)

service.featurelauncher.runtime.FeatureRuntimeException: Could not install bundle 'org.apache.felix:org.apache.felix.gogo.command:1.1.2'!]
org.osgi.service.featurelauncher.runtime.FeatureRuntimeException: Could not install bundle 'org.apache.felix:org.apache.felix.gogo.command:1.1.2'!
	at com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl$AbstractOperationBuilderImpl.installBundle(FeatureRuntimeImpl.java:511)
	at com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl$AbstractOperationBuilderImpl.installBundles(FeatureRuntimeImpl.java:473)
	at com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl$AbstractOperationBuilderImpl.addOrUpdateFeature(FeatureRuntimeImpl.java:426)
	at com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl$AbstractOperationBuilderImpl.complete(FeatureRuntimeImpl.java:388)
	at com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl$InstallOperationBuilderImpl.complete(FeatureRuntimeImpl.java:830)
	at com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl$InstallOperationBuilderImpl.install(FeatureRuntimeImpl.java:843)
	at com.kentyou.featurelauncher.impl.runtime.integration.FeatureRuntimeIntegrationTest.testInstallFeatureWithNoConfigWithCustomRepositories(FeatureRuntimeIntegrationTest.
java:210)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
[main] INFO com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl - Started FeatureRuntime!
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at aQute.tester.bundle.engine.BundleDescriptor.executeChild(BundleDescriptor.java:49)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$7(BundleEngine.java:120)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:120)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$8(BundleEngine.java:133)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:133)
	at aQute.tester.bundle.engine.BundleEngine.lambda$execute$5(BundleEngine.java:100)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.execute(BundleEngine.java:100)
Caused by: org.osgi.framework.BundleException: The framework has been shutdown.
	at org.apache.felix.framework.Felix.installBundle(Felix.java:3240)
	at org.apache.felix.framework.BundleContextImpl.installBundle(BundleContextImpl.java:147)
	at com.kentyou.featurelauncher.impl.runtime.FeatureRuntimeImpl$AbstractOperationBuilderImpl.installBundle(FeatureRuntimeImpl.java:504)
	... 91 more

(...)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions