Added test case which reproduces this issue in revision 1703921. (FELIX5045_OptionalDependencyCBCalledBeforeStartTest.java)
On Fri, Sep 18, 2015 at 11:52 PM, Pierre De Rop (JIRA) <[email protected]> wrote: > > [ > https://issues.apache.org/jira/browse/FELIX-5045?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel > ] > > Work on FELIX-5045 started by Pierre De Rop. > -------------------------------------------- > > DM Optional callbacks may sometimes be invoked before start callback > > -------------------------------------------------------------------- > > > > Key: FELIX-5045 > > URL: https://issues.apache.org/jira/browse/FELIX-5045 > > Project: Felix > > Issue Type: Bug > > Components: Dependency Manager > > Affects Versions: org.apache.felix.dependencymanager-r5 > > Reporter: Pierre De Rop > > Assignee: Pierre De Rop > > Fix For: org.apache.felix.dependencymanager-r6 > > > > > > We just found a corner case that triggers optional dependency callbacks > before the component is invoked in its 'start' lifecycel callback. This is > a bug, because in DM, optional dependency callbacks should be always > invoked after the component's 'start' lifecycle callback. > > I'm describing now the use case: we have the following component players: > > - B: a simple service component. > > - BFactory: a service that has a 'create' method which registers in the > OSGi registry a new B service instance. > > - A: a component that adds from A.init() lifecycle callback a required > dependency (with a callback) on BFactory, as well as an optional dependency > (with a callback) on B. > > - when A.bind(BFactory factory) is called, it then calls > "factory.create()" method which triggers the registration of the B > Service. At this point, A.bind(B b) is then invoked, but the A.start() > lifecycle callback has not yet been called. This is because we are > currently transiting from INSTANTIATED_AND_WAITING_FOR_REQUIRED -> > TRACKING_OPTIONAL; so the current state is TRACKING_OPTIONAL, and we are > calling the invokeAddRequiredInstanceBoundDependencies() > > method, which calls A.bind(BFactory) method, which synchronously > registers a B service instance; so this ends up calling the handleAdded > method, which invoke A.bind(B b) method, but at this point we have not yet > called the A.start() callback. > > - then "A.start()" is called. > > > > -- > This message was sent by Atlassian JIRA > (v6.3.4#6332) >
