[jira] [Commented] (FELIX-3456) Component ignores required static service addition when in Activating state

2012-04-12 Thread Richard Ellis (Commented) (JIRA)

[ 
https://issues.apache.org/jira/browse/FELIX-3456?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanelfocusedCommentId=13252653#comment-13252653
 ] 

Richard Ellis commented on FELIX-3456:
--

On second thoughts I'm not sure my proposed fix goes far enough because even 
though it allows the second service to attempt to be bound, there is no 
guarantee that this bind operation will complete in a timely enough fashion for 
the activate process triggered by the first service to complete successfully. I 
think some synchronization will probably be required.

 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
Priority: Critical

 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: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira




[jira] [Commented] (FELIX-3456) Component ignores required static service addition when in Activating state

2012-04-12 Thread Richard Ellis (Commented) (JIRA)

[ 
https://issues.apache.org/jira/browse/FELIX-3456?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanelfocusedCommentId=13252655#comment-13252655
 ] 

Richard Ellis commented on FELIX-3456:
--

If only my browser had refreshed faster I could have agreed with you already 
David instead of disagreeing with myself :)
I do agree David, my hasty attempt at a fix without a full understanding of the 
code is not correct.

 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
Priority: Critical

 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: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira