[ 
https://issues.apache.org/jira/browse/FELIX-5618?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Peter Kriens reopened FELIX-5618:
---------------------------------

Problem unfortunately still present in 2.0.14 after testing on 
[https://github.com/pkriens/felix.scr.cycle] with the latest release of SCR. I 
did update the dependency to 2.0.14.

 

Sorry :(

> Cycles in DS depending on bundle order
> --------------------------------------
>
>                 Key: FELIX-5618
>                 URL: https://issues.apache.org/jira/browse/FELIX-5618
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>         Environment: MacOS + Windows + Linux
>            Reporter: Peter Kriens
>            Assignee: David Jencks
>            Priority: Blocker
>             Fix For: scr-2.0.14
>
>         Attachments: scr-cycle-2.0.2-bottom-top.txt, 
> scr-cycle-2.0.2-top-bottom.txt, scr-cycle-2.0.6-bottom-top.txt, 
> scr-cycle-2.0.6-top-bottom.txt
>
>
> Following test case:
>        top.jar: Top @Reference volatile List<Bottom>
>        bottom.jar: Bottom @Reference Top
> In SCR 2.0.2:
>       top.jar, bottom.jar -> OK, see trace
>            new Top()
>            Top.activate()
>            new Bottom()
>            Bottom.top=<top>
>            Bottom.activate()
>           Top.bottom +=<bottom>
>       bottom.jar, top.jar -> FAILS but recovers
>           [osgi.enroute.examples.concurrency.cycle.bottom.Bottom(1)] 
>           Circular reference detected, getService returning null
>           new Top()
>           Top.activate()
>           new Bottom()
>           Bottom.top=<top>
>           Bottom.activate()
>           Top.bottom +=<bottom>
> In SCR 2.0.4 and later
>      top.jar,bottom.jar -> OK
>            new Top()
>            Top.activate()
>            new Bottom()
>            Bottom.top=<top>
>            Bottom.activate()
>            Top.bottom +=<bottom>
>       bottom.jar, top.jar -> FAILS and DOES NOT RECOVER!
>            new Bottom()
>            new Top()
>            Top.activate()
>            new Bottom()
> The Bottom component never gets added to Top. This is a very serious problem 
> for reliable systems. I see this behaviour on 2.0.4, 2.0.6, and 2.0.8
> ----------
> I've traced the cycle problem in 2.0.2. What happens is:
> 1) The Bottom configuration is started. There is no Top, so it is not 
> satisfied
> 2) The Top configuration is started. It is satisfied since it can live with 0 
> Bottoms. 
> 3) The top configuration registers Top
> 4) The bottom configuration sees a Top and initiates Bottom
> 5) The bottom configuration gets Top (which is under construction)
> 6) The top configuration looks at its dependencies
> 7) The top configuration sees there is a Bottom now and tries to get it
> 8) The bottom factory is called again on the same thread and blows up
> I am not sure what happens in 2.0.4 and later but it does look scary that 
> Bottom is now never added to the Top.
> ---- Fix
> I tried to do the activation in a background thread that but that failed. I 
> think the cycle should be detected and and de Top should not get its dynamic 
> dependencies after the activate method returned. But, just a guess, this is 
> complicated stuff.
> ---- Workaround
> The workaround is to not let Top register as a service but manually register 
> it at the end of the activate method. Since the service is then already 
> initialized and registered, the Bottom will not get activated until the Top 
> is done.
> There is a bnd workspace that consistently shows this output.
> https://github.com/pkriens/felix.scr.cycle
> I've added 4 log files. 2.0.4 and 2.0.8 seem to act very similar



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to