[
https://issues.apache.org/jira/browse/FELIX-6724?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17879270#comment-17879270
]
Christoph Läubrich commented on FELIX-6724:
-------------------------------------------
I added a testcase, if I run this inside Eclipse I get the following logoutput:
{code}Starting test.ds.manager.recipe
Starting test.ds.manager
!SESSION 2024-09-04 17:31:30.130 -----------------------------------------------
eclipse.buildId=unknown
java.version=17.0.2
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE
Command-line arguments: -dev
file:/home/christoph/workspace/.metadata/.plugins/org.eclipse.pde.core/New_configuration/dev.properties
-os linux -ws gtk -arch x86_64 -consoleLog -console
!ENTRY org.apache.felix.scr 4 0 2024-09-04 17:31:30.582
!MESSAGE bundle org.apache.felix.scr:2.2.10 (10) Circular reference detected
trying to get service {test.ds.manager.AssetHandler}={service.id=34,
service.bundleid=1, service.scope=bundle,
osgi.ds.satisfying.condition.target=(osgi.condition.id=true),
component.name=test.ds.manager.recipe.ReceipeAssetHandler, component.id=0}
stack of references: ServiceReference:
{test.ds.manager.AssetHandler}={service.id=34, service.bundleid=1,
service.scope=bundle,
osgi.ds.satisfying.condition.target=(osgi.condition.id=true),
component.name=test.ds.manager.recipe.ReceipeAssetHandler, component.id=0}
!STACK 0
java.lang.Exception: stack trace
at
org.apache.felix.scr.impl.ComponentRegistry.enterCreate(ComponentRegistry.java:493)
at
org.apache.felix.scr.impl.BundleComponentActivator.enterCreate(BundleComponentActivator.java:722)
at
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:901)
at
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:226)
at
java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
at
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:223)
at
org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:118)
at
org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:48)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:580)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:548)
at
org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:672)
at
org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:88)
at
org.apache.felix.scr.impl.inject.methods.BindMethod.getServiceObject(BindMethod.java:675)
at
org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2625)
at
org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.prebind(DependencyManager.java:441)
at
org.apache.felix.scr.impl.manager.DependencyManager.prebind(DependencyManager.java:1843)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1060)
at
org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:955)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:785)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:674)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:437)
at
org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:671)
at
org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:310)
at
org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:613)
at org.apache.felix.scr.impl.Activator.access$200(Activator.java:75)
at
org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:480)
at
org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196)
at
org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169)
at
org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49)
at
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:490)
at
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1)
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:233)
at
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:452)
at
org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:972)
at
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at
org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151)
at
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:235)
at
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:134)
at
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:126)
at
org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:229)
at org.eclipse.osgi.container.Module.publishEvent(Module.java:531)
at org.eclipse.osgi.container.Module.start(Module.java:516)
at
org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:528)
at
org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:122)
at
org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:620)
at
org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:348)
at
org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:414)
at
org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:520)
at
org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:434)
at
org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:174)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at
org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:643)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.initDependencyManagers(AbstractComponentManager.java:1027)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1057)
at
org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:955)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:776)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:674)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:437)
at
org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:671)
at
org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:310)
at
org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:613)
at org.apache.felix.scr.impl.Activator.access$200(Activator.java:75)
at
org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:480)
at
org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196)
at
org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169)
at
org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49)
at
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:490)
at
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1)
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:233)
at
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:452)
at
org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:972)
at
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at
org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151)
at
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:235)
at
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:134)
at
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:126)
at
org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:229)
at org.eclipse.osgi.container.Module.publishEvent(Module.java:531)
at org.eclipse.osgi.container.Module.start(Module.java:516)
at
org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:2073)
at
org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.java:143)
at
org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:2064)
at
org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:2006)
at
org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1967)
at
org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1883)
at
org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
at
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at
org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:341)
Loading the Manager class
Createing the manager
Loading class ReceipeAssetHandler
Create Recipe Asset Handler
Adding test.ds.manager.recipe.ReceipeAssetHandler@4a3d603e
The follwoing assets are there:
- Eggs
- Ham
- Bread
{code}
> [scr] Cyclic Dependecy reported with activation policy = lazy
> -------------------------------------------------------------
>
> Key: FELIX-6724
> URL: https://issues.apache.org/jira/browse/FELIX-6724
> Project: Felix
> Issue Type: Bug
> Reporter: Christoph Läubrich
> Priority: Major
> Attachments: ds_cyclic_testcase.zip
>
>
> This was discovered as part of
> https://issues.apache.org/jira/browse/FELIX-6069 but actually is a bit
> different case (but maybe even causing this in other situations)
> Assume the following components:
> One implements a service in *Bundle B* and the interface is provided by
> *Bundle A* and it has *immediate="true"*
> {code}
> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.4.0"
> deactivate="stop" immediate="true" init="1" name="ReceipeAssetHandler">
> <service>
> <provide interface="AssetHandler"/>
> </service>
> <implementation class="ReceipeAssetHandler"/>
> </scr:component>
> {code}
> Then in Bundle A (that has activation policy = lazy and provides the service
> interface) we have a consumer with dynamic references:
> {code}
> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
> immediate="true" name="Manager">
> <service>
> <provide interface="Manager"/>
> </service>
> <reference bind="addListener" cardinality="0..n" interface="Listener"
> name="XHandler" policy="dynamic" unbind="removeListener"/>
> <reference bind="addAssetHandler" cardinality="0..n"
> interface="AssetHandler" name="AssetHandler" policy="dynamic"
> unbind="removeAssetHandler"/>
> <implementation class="Manager"/>
> </scr:component>
> {code}
> now SCR complains about cyclic dependecy:
> {code}
> !ENTRY org.apache.felix.scr 4 0 2024-09-04 09:51:52.017
> !MESSAGE bundle org.apache.felix.scr:2.2.10 (107) Circular reference detected
> trying to get service {AssetHandler}={service.id=107, service.bundleid=22,
> service.scope=bundle,
> osgi.ds.satisfying.condition.target=(osgi.condition.id=true),
> component.name=ReceipeAssetHandler, component.id=36}
> stack of references:
> ServiceReference: {AssetHandler}={service.id=107, service.bundleid=22,
> service.scope=bundle,
> osgi.ds.satisfying.condition.target=(osgi.condition.id=true),
> component.name=ReceipeAssetHandler, component.id=36}
> ServiceReference: {Manager}={service.id=108, service.bundleid=169,
> service.scope=bundle,
> osgi.ds.satisfying.condition.target=(osgi.condition.id=true),
> component.name=Manager, component.id=37}
> {code}
> *Why this happens:*
> As activation of the implementation in *Bundle B* triggers also activation of
> the *Bundle A* (due to the classload) *in the same thread* the thread local
> of ComponentRegistry#circularInfos already contains *Reference B* (that is
> currently activating and has no chance yet to call leaveCreate) while now the
> consumer component is created and already "see" the not yet active component
> service and try to add it to the list (again) what triggers the error.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)