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