[ 
https://issues.apache.org/jira/browse/FELIX-4349?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13842695#comment-13842695
 ] 

Guillaume Nodet commented on FELIX-4349:
----------------------------------------

The state I end in is weird: one component has a dependency which seems 
outdated, i.e. it's not registered anymore.  Another service has been 
registered in place of that one, but it seems this change has been missed 
somehow.  The reason I know that, is that the service uses a ServiceFactory and 
when the service is unbound, the service internal state is changed and I've 
been able to inspect the variables in that failing state.

I'm not sure this actually fixes my issue, but while investigating the SCR 
code, Ioannis discovered this problem.  

I'll commit a fix asap.


> Synchronization issue in ComponentRegistry
> ------------------------------------------
>
>                 Key: FELIX-4349
>                 URL: https://issues.apache.org/jira/browse/FELIX-4349
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions: scr-1.8.0
>            Reporter: Guillaume Nodet
>             Fix For: scr-1.8.2
>
>
> Investigating an issue in some of our integration test, we found that the 
> ComponentRegistry#m_missingDependencies field is wrongly synchronized.
> Two methods are accessing this Map, registerMissingDependency and 
> missingServicePresent, but only the first one is synchronized.
> Patch proposed:
> {code}
> diff --git 
> a/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java 
> b/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
> index 9b307a9..c40ab5f 100644
> --- a/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
> +++ b/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
> @@ -660,7 +660,7 @@ public class ComponentRegistry implements ScrService, 
> ServiceListener
>          }
>      }
>  
> -    public void missingServicePresent( final ServiceReference 
> serviceReference, ComponentActorThread actor )
> +    public synchronized void missingServicePresent( final ServiceReference 
> serviceReference, ComponentActorThread actor )
>      {
>          final List<Entry> dependencyManagers = m_missingDependencies.remove( 
> serviceReference );
>          if ( dependencyManagers != null )
> {code}



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to