Christoph Läubrich created FELIX-6724:
-----------------------------------------

             Summary: [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


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