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

Reply via email to