[
https://issues.apache.org/jira/browse/FELIX-3456?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Felix Meschberger updated FELIX-3456:
-------------------------------------
Fix Version/s: (was: scr-1.8.0)
scr-1.6.2
> Component ignores required static service addition when in Activating state
> ---------------------------------------------------------------------------
>
> Key: FELIX-3456
> URL: https://issues.apache.org/jira/browse/FELIX-3456
> Project: Felix
> Issue Type: Bug
> Components: Declarative Services (SCR)
> Affects Versions: scr-1.6.0
> Environment: Using org.apache.felix.scr svn rev 1298268 on Mac
> Reporter: Richard Ellis
> Assignee: David Jencks
> Priority: Critical
> Fix For: scr-1.6.2
>
> Attachments: FELIX-3456-1.1.diff, FELIX-3456-1.diff,
> FELIX-3456-3.diff, FELIX-3456-4.diff, FELIX-3456-5a.diff, FELIX-3456-5b.diff,
> FELIX-3456-5.diff, FELIX-3456-7a.diff, FELIX-3456-7.diff, FELIX-3456-8a.diff,
> FELIX-3456-8.diff, FELIX-3456-fmeschbe-6.patch, FELIX-3456-fmeschbe.patch
>
>
> I have a component with two required static service references (A and B). In
> my scenario A and B are registered nearly simultaneously on different threads
> and this causes the DependencyManager to ignore the addition of one of these
> two services (B). This causes the component to remain unsatisfied and never
> activate, since the service that was ignored is not re-registered at any time
> and nothing subsequently causes the component to re-activate.
> This happens as follows:
> 12:30:59:317 Thread 1 - Registers Service B/257
> 12:30:59:320 Thread 2 - Registers Service A/258
> 12:30:59:320 Thread 2 - Dependency Manager: Adding Service A/258
> 12:30:59:321 Thread 2 - Dependency Manager: Service serviceA registered,
> activate component
> 12:30:59:321 Thread 2 - State transition : Unsatisfied -> Activating
> 12:30:59:321 Thread 2 - Activating component
> 12:30:59:321 Thread 1 - Dependency Manager: Adding Service B/257
> 12:30:59:321 Thread 2 - Dependency not satisfied: serviceB
> 12:30:59:321 Thread 1 - Dependency Manager: Added service serviceB is ignored
> for static reference <--- I believe we end up here because Thread 2 has moved
> the component from Unsatisfied to Activating and the reference is a static
> reference
> 12:30:59:321 Thread 2 - Not all dependencies satisified, cannot activate
> 12:30:59:321 Thread 2 - State transition : Activating -> Unsatisfied
> Because the addition of Service B has been ignored and serviceB is a required
> dependency my component then never activates even though my reqiured service
> is present.
> There is a comment in DependencyManager#serviceAdded method:
> // FELIX-1413: if the dependency is static and the component is
> // satisfied (active) added services are not considered until
> // the component is reactivated for other reasons.
> This suggests that the static service should only be ignored if the component
> is satisfied(active), which would be correct, but in this case the component
> is only activating (and will fail to activate because one of the two
> dependencies is not yet satisfied) and there is no check of state at this
> time.
> A simple fix would be to check the state of the component as well as if the
> service is static e.g.
> replace if ( m_dependencyMetadata.isStatic() )
> with if ( m_dependencyMetadata.isStatic() && m_componentManager.getState() ==
> AbstractComponentManager.STATE_ACTIVE )
> This is an easy fix, but I guess may leave a small window where a static
> reference could get replaced while a component was still activating if
> another instance of the same service was registered on a different thread.
> There are other fixes that could be done by synchronizing more around service
> additions.
> Is anyone willing to make this fix or does anyone have any thoughts about
> this issue?
> Thanks
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira