You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Thomas Watson (JIRA)" <ji...@apache.org> on 2019/01/24 21:35:00 UTC

[jira] [Assigned] (FELIX-6036) Race condition prevents optional/greedy ref setter method from being called

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

Thomas Watson reassigned FELIX-6036:
------------------------------------

    Assignee: Thomas Watson

> Race condition prevents optional/greedy ref setter method from being called
> ---------------------------------------------------------------------------
>
>                 Key: FELIX-6036
>                 URL: https://issues.apache.org/jira/browse/FELIX-6036
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions: scr-2.1.14
>            Reporter: Brent Daniel
>            Assignee: Thomas Watson
>            Priority: Major
>
> I have a component with an optional/dynamic/greedy reference. The target is registered directly with OSGi using BundleContext.registerService(). Normally, either SingleDynamicCustomizer.addedService() or SingleComponentManager.createImplementationObject() will succeed in binding the reference, but there is a race condition that can prevent the setter method from ever being called. 
>  
> The failure path is as follows:
> 1) SingleComponentManager.createImplementationObject calls open() on each of its DependencyManagers. This generates an OpenStatus where the RefPair list is empty because our target has not been registered yet. 
> 2) Before createImplementationObject() can set the component context, the customizer's addedService() method is called in response to the target service registration. It attempts to bind the target service, but that will not happen because the component context has not been set yet. 
> 3) createImplementationObject then creates the implementation, sets the component context, and goes through the list of OpenStatus objects to bind target services. The RefPair list for the OpenStatus object will still be empty, so we will not call the setter method for the reference we're concerned about. 
>  
> I'm not sure of a good way to fix this. I couldn't come up with a good approach using synchronization or earlier creation of the implementation object. At the moment I am working around this by refreshing the list of RefPairs in the OpenStatus object at the top of DependencyManager.bindDependency():
>  
> {code:java}
> // Refresh ref list before binding
> synchronized(m_tracker.tracked()) {
>    status.refs=m_customizer.getRefs(status.trackingCount);
> }
> {code}
>  



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