[
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)